Gabz

MRM Extreme Menu

Nov 18th, 2013
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 130.62 KB | None | 0 0
  1. #=============================================================================
  2. # * Mundo RPG Maker Extreme Menu
  3. #---------------------------------------------------------------------------
  4. # Autor: Gab!
  5. # Data:  22/12/12 ~ 20/12/12
  6. #---------------------------------------------------------------------------
  7. # Créditos:
  8. #   * Tweening:
  9. #     - Robert Penner
  10. #     - UziMonkey
  11. #   * CogWheel Bars:
  12. #     - Syvkal
  13. #   * Base da classe StaticMiniMap:
  14. #     - SheolShade
  15. #   * Janela de descrição de itens/equipamentos:
  16. #     - Yanfly
  17. #--------------------------------------------------------------------------
  18. # Instruções de instalação:
  19. #   - Cole acima do script 'Main', preferencialmente abaixo do indicador
  20. #     "Scripts Adicionais"
  21. #
  22. #   - Leia as instruções de uso
  23. #
  24. #   - Configure abaixo
  25. #
  26. #--------------------------------------------------------------------------
  27. # Instruções de uso:
  28. #
  29. #   * Para remover uma opção do menu, use o comando seguinte em 'chamar script':
  30. #     MRM::ExtremeMenu.disable(opção)
  31. #
  32. #     'opção' é o ícone que será desativado, deve ser um do termos abaixo:
  33. #     - :Items     # Itens
  34. #     - :Equips    # Equipamentos
  35. #     - :Skills    # Habilidades
  36. #     - :Formation # Formação
  37. #     - :Status    # Estado
  38. #     - :Bestiary  # Bestiário
  39. #     - :PDist     # Distribuição de pontos
  40. #     - :MiniMap   # Mini-Mapa
  41. #     - :Options   # Opções
  42. #     - :Save      # Salvar jogo
  43. #     - :Exit      # Sair do jogo
  44. #
  45. #   #=====================================================================#
  46. #
  47. #   * Para adicionar novamente uma opção removida, basta chamar o comando:
  48. #     MRM::ExtremeMenu.enable(opção)
  49. #
  50. #     'opção' se refere ao ícone que será adicionado novamente.
  51. #
  52. #   #=====================================================================#
  53. #
  54. #   * Para verificar se uma opção está ativa no menu, pela opção de scripts
  55. #     das condições nos eventos, use:
  56. #     MRM::ExtremeMenu.enabled?(opção)
  57. #
  58. #     'opção' novamente se refere ao ícone que será checado.
  59. #
  60. #   #=====================================================================#
  61. #
  62. #   * Os personagens ganham pontos automaticamente ao passar de nível, porém
  63. #     se houver necessidade de adicionar ou retirar pontos, usa-se:
  64. #
  65. #     Adicionar: MRM::ExtremeMenu.giveActorPoints(ator, qt)
  66. #     Remover:   MRM::ExtremeMenu.removeActorPoints(ator, qt)
  67. #    
  68. #     Em ambos 'ator' se refere ao ID do ator *na database* e 'qt' será a
  69. #     quantidade de pontos adicionados ou removidos.
  70. #
  71. #   #=====================================================================#
  72. #
  73. #   * Para adicionar ou remover monstros do bestiário:
  74. #
  75. #     Adicionar: MRM::ExtremeMenu.bestiaryAddMonster(id)
  76. #     Remover:   MRM::ExtremeMenu.bestiaryRemoveMonster(id)
  77. #
  78. #     Nos dois casos 'id' indica o ID do monstro na database.
  79. #
  80. #=============================================================================
  81.  
  82. module (MRM ||= Module.new)::ExtremeMenu
  83.   #===========================================================================
  84.   # ** CONFIGURAÇÃO
  85.   #===========================================================================
  86.  
  87.   Use = { # Marque com true as opções que deve ser ativas no início do jogo
  88.           # false caso contrário.
  89.     Items:     true, # Itens
  90.     Equips:    true, # Equipamentos
  91.     Skills:    true, # Habilidades
  92.     Formation: true, # Formação
  93.     Status:    true, # Estado
  94.     Bestiary:  true, # Bestiário
  95.     PDist:     true, # Distribuição de pontos
  96.     MiniMap:   true, # Mini-Mapa
  97.     Options:   true, # Opções (Som)
  98.     Save:      true, # Salvar Jogo
  99.     Exit:      true, # Sair do Jogo
  100.   }
  101.    
  102.   Vocab = { # Vocabulário
  103.     Items:       "Itens",                # Itens
  104.     Equips:      "Equipamentos",         # Equipamentos
  105.     Skills:      "Habilidades",          # Habilidades
  106.     Status:      "Estado",               # Estado
  107.     Formation:   "Formação",             # Formação
  108.     Bestiary:    "Bestiário",            # Bestiário
  109.     PDist:       "Pontos",               # Distribuição de pontos
  110.     MiniMap:     "Mini-Mapa",            # Mini-Mapa
  111.     Options:     "Opções",               # Opções
  112.     Save:        "Salvar",               # Salvar jogo
  113.     Exit:        "Sair",                 # Deixar jogo
  114.     #==========================
  115.     Item:        "Item Comum",           # Item Comum
  116.     Weapon:      "Arma",                 # Armas
  117.     Armor:       "Armadura",             # Armaduras
  118.     KeyItem:     "Item Chave",           # Itens chave
  119.     Empty:       "---",                  # Quando nada é mostrado
  120.     HPRecover:   "Recup. de HP",         # Recuperação de HP
  121.     MPRecover:   "Recup. de MP",         # Recuperação de MP
  122.     TPRecover:   "Recup. de TP",         # Recuperação de TP
  123.     TPGain:      "Ganho de TP",          # Ganho de TP
  124.     Applies:     "Provoca",              # Estados provacados
  125.     Removes:     "Remove",               # Estados removidos
  126.     #==========================
  127.     FixEquip:    "Equipamento fixo!",    # Equipamento fixo
  128.     Optimize:    "Melhor Equipamento",   # Otimizar equipamentos e selecionar
  129.                                          # os melhores
  130.     #==========================
  131.     InsufActs:   "Apenas um membro no grupo!", # Membros insuficientes para abrir
  132.                                                # o menu de formação
  133.    
  134.     #==========================
  135.     ZeroMonster: "Bestiário vazio!",     # Não existem monstros no bestiário
  136.     BComplete:   "Progresso: {c}%",      # Progresso. ({c} será substituido pela
  137.                                          # porcentagem de progresso.)
  138.     Experience:  "Experiência",          # Experiência
  139.     Loot:        "Recompensas",          # Recompensas
  140.    
  141.     #==========================
  142.     InsufPts:    "Pontos insuficientes", # Pontos insuficientes
  143.    
  144.     #==========================
  145.     OptionsSFX:  "Efeitos Sonoros",      # Efeitos sonoros
  146.     OptionsMsc:  "Música",               # Música (BGM, ME)
  147.     OptionsSnd:  "Som",                  # Som (BGS, SE)
  148.    
  149.     #==========================
  150.     SaveBlock:   "Save Bloqueado",       # Salvar desabilitado
  151.     FreeSlot:    "Slot vazio",           # Slot de save vazio
  152.     NewSave:     "Novo save",            # Criar novo save
  153.     PlayTime:    "Tempo de Jogo:",       # Tempo de jogo
  154.     Party:       "Grupo",                # Grupo
  155.     SaveOver:    "Sobrescrever?",        # Confirmação de sobresctrita
  156.     SaveYes:     "Sim",                  # Confirmação de Sobrescrita (Sim)
  157.     SaveNo:      "Não",                  # Confirmação de Sobrescrita (Não)
  158.     Saved:       "Jogo salvo!",          # Jogo salvo
  159.    
  160.     #==========================
  161.     ExitTitle:   "Tela de Título",       # Voltar ao título
  162.     ExitGame:    "Deixar Jogo",          # Sair do jogo
  163.     ExitCanc:    "Cancelar",             # Cancelar Saída
  164.   }
  165.  
  166.   Font = { # Definições de fonte
  167.     Name:    "Trebuchet MS",       # Nome
  168.     Size:    18,                   # Tamanho
  169.     Color:   [255, 255, 255, 255], # Cor (R, G, B, A)
  170.     Shadow:  true,                 # Usar sombra?
  171.     Outline: false,                # Usar outline?
  172.   }
  173.  
  174.   Icon = { # ID dos ícones
  175.     Items:      194, # Itens
  176.     Equips:     115, # Equipamentos
  177.     Skills:     116, # Skills
  178.     Status:      10, # Estado
  179.     Formation:   11, # Formação
  180.     Bestiary:     9, # Bestiário
  181.     PDist:      125, # Distribuição de pontos
  182.     MiniMap:    231, # Mini-Mapa
  183.     Options:    185, # Opções (Som)
  184.     Save:       230, # Salvar jogo
  185.     Exit:       121, # Sair
  186.     #=============================
  187.     Item:       197, # Itens comuns
  188.     Weapon:     148, # Armas
  189.     Armor:      169, # Armadura
  190.     KeyItem:    243, # Item Chave
  191.     #=============================
  192.     SaveYes:    113, # Confirmação de Sobrescrita (Sim)
  193.     SaveNo:     114, # Confirmação de Sobrescrita (Não)
  194.     #=============================
  195.     ExitTitle:   16, # Voltar ao título
  196.     ExitGame:     1, # Sair do jogo
  197.     ExitCanc:   114, # Cancelar Saída
  198.     #=============================
  199.     Gold:       361, # Ouro
  200.   }
  201.  
  202.   DisabledIcon = {  # Ícones desabilitados
  203.                     # Use -1 para usar o mesmo ícone porém escurecido
  204.                    
  205.     Formation:  -1, # Ícone de formação quando não é possível modificá-la
  206.     Bestiary:   -1, # Ícone do bestiário quando não existem monstros novos
  207.     PDist:     126, # Ícone de distribuição de pontos quando não existem
  208.                     # pontos para ser distribuidos
  209.     Save:      368, # Ícone de save desabilitado
  210.   }
  211.  
  212.   # Velocidade de atualização dos sprites dos atores
  213.   ActorsSpeed = 25
  214.  
  215.   # Confirmar sobreescrita em slot de save?
  216.   ConfirmOverwrite = true
  217.  
  218.   # Adicionar monstros ao bestiário automaticamente após as batalhas ganhas?
  219.   # (Pode não funcionar quando utilizando um sistema de batalha diferente)
  220.   AutoBestiaryAdd  = true
  221.  
  222.   # Número máximo de efeitos adicionados/removidos que são mostrados nos
  223.   # itens do inventário
  224.   MaxIconsDrawn = 5
  225.  
  226.   # Barras de HP e MP
  227.   BarColor1 = [  0,   0,   0, 192] # Borda exterior
  228.   BarColor2 = [255, 255, 192, 192] # Borda interior
  229.   BarColor3 = [  0,   0,   0,  12] # Metade do sombreamento
  230.   BarColor4 = [ 64,   0,   0,  92] # Metade do sombreamento
  231.  
  232.   # Cores de mensagens
  233.   MsgOk    = [204, 255,   0, 230] # Mensagem Ok
  234.   MsgInfo  = [  0, 204, 255, 230] # Mensagem de informação/pergunta
  235.   MsgError = [255,   0,  68, 250] # Mensagem de erro
  236.  
  237.   #-------------------------------------------------------------------------
  238.   # DISTRIBUIÇÃO DE PONTOS
  239.   #-------------------------------------------------------------------------
  240.   # É possível determinar, para cada classe, quantos pontos serão ganhos por
  241.   # nível e quantos serão requeridos para cada atributo.
  242.   #
  243.   # Existe uma notação [X,Y] que indica o seguinte:
  244.   #   X é a quantidade de pontos que serão necessário para aumentar em Y
  245.   #   o atributo indicado.
  246.   #
  247.   # A quantidade de pontos ganhos por nível PODE ser um valor decimal. Porém
  248.   # só será considerado um valor inteiro. Logo, se PPN = 3.5, o ator ganhará
  249.   # 3 pontos no primeiro e no segundo nível, porém no terceiro ganhará 4.
  250.   #-------------------------------------------------------------------------
  251.   PDistPoints = {
  252.     # Siga este padrão, caso existam mais classes:
  253.     # ID DA CLASSE => {
  254.     #   PPN: Pontos ganhos por nível,
  255.     #   HPM: [X, Y], # HP Máximo
  256.     #   MPM: [X, Y], # MP Máximo
  257.     #   ATK: [X, Y], # Ataque
  258.     #   DEF: [X, Y], # Defesa
  259.     #   ATM: [X, Y], # Ataque Mágico (Inteligência)
  260.     #   DEM: [X, Y], # Defesa Mágica (Resistência)
  261.     #   AGI: [X, Y], # Agilidade
  262.     #   SOR: [X, Y], # Sorte
  263.     # },
  264.    
  265.     1 => { # Guerreiro
  266.       PPN: 4,
  267.       HPM: [1, 10], # HP Máximo
  268.       MPM: [1, 10], # MP Máximo
  269.       ATK: [1,  5], # Ataque
  270.       DEF: [1,  5], # Defesa
  271.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  272.       DEM: [3,  5], # Defesa Mágica (Resistência)
  273.       AGI: [1,  3], # Agilidade
  274.       SOR: [3,  1], # Sorte
  275.     },
  276.      
  277.     2 => { # Monge
  278.       PPN: 4,
  279.       HPM: [1, 10], # HP Máximo
  280.       MPM: [1, 10], # MP Máximo
  281.       ATK: [2, 10], # Ataque
  282.       DEF: [1,  8], # Defesa
  283.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  284.       DEM: [2,  5], # Defesa Mágica (Resistência)
  285.       AGI: [1,  5], # Agilidade
  286.       SOR: [3,  1], # Sorte
  287.     },
  288.    
  289.     3 => { # Cavaleiro
  290.       PPN: 4,
  291.       HPM: [1, 10], # HP Máximo
  292.       MPM: [1, 10], # MP Máximo
  293.       ATK: [1,  8], # Ataque
  294.       DEF: [1,  7], # Defesa
  295.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  296.       DEM: [3,  5], # Defesa Mágica (Resistência)
  297.       AGI: [1,  3], # Agilidade
  298.       SOR: [3,  1], # Sorte
  299.     },
  300.    
  301.     4 => { # Espadachim
  302.       PPN: 5,
  303.       HPM: [1, 15], # HP Máximo
  304.       MPM: [2, 15], # MP Máximo
  305.       ATK: [1,  8], # Ataque
  306.       DEF: [1,  7], # Defesa
  307.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  308.       DEM: [3,  5], # Defesa Mágica (Resistência)
  309.       AGI: [1,  3], # Agilidade
  310.       SOR: [3,  1], # Sorte
  311.     },
  312.    
  313.     5 => { # Samurai
  314.       PPN: 4,
  315.       HPM: [1, 10], # HP Máximo
  316.       MPM: [1, 10], # MP Máximo
  317.       ATK: [1,  5], # Ataque
  318.       DEF: [1,  5], # Defesa
  319.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  320.       DEM: [3,  5], # Defesa Mágica (Resistência)
  321.       AGI: [1,  7], # Agilidade
  322.       SOR: [3,  1], # Sorte
  323.     },
  324.    
  325.     6 => { # Arqueiro
  326.       PPN: 4,
  327.       HPM: [1, 10], # HP Máximo
  328.       MPM: [1, 10], # MP Máximo
  329.       ATK: [1,  5], # Ataque
  330.       DEF: [1,  5], # Defesa
  331.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  332.       DEM: [3,  5], # Defesa Mágica (Resistência)
  333.       AGI: [1,  3], # Agilidade
  334.       SOR: [3,  1], # Sorte
  335.     },
  336.    
  337.     7 => { # Ladino
  338.       PPN: 4,
  339.       HPM: [1, 10], # HP Máximo
  340.       MPM: [1, 10], # MP Máximo
  341.       ATK: [1,  5], # Ataque
  342.       DEF: [1,  5], # Defesa
  343.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  344.       DEM: [3,  5], # Defesa Mágica (Resistência)
  345.       AGI: [1,  3], # Agilidade
  346.       SOR: [3,  1], # Sorte
  347.     },
  348.    
  349.     8 => { # Sacerdote
  350.       PPN: 4,
  351.       HPM: [1, 10], # HP Máximo
  352.       MPM: [1, 10], # MP Máximo
  353.       ATK: [1,  5], # Ataque
  354.       DEF: [1,  5], # Defesa
  355.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  356.       DEM: [3,  5], # Defesa Mágica (Resistência)
  357.       AGI: [1,  3], # Agilidade
  358.       SOR: [3,  1], # Sorte
  359.     },
  360.    
  361.     9 => { # Mago
  362.       PPN: 4,
  363.       HPM: [1,  7], # HP Máximo
  364.       MPM: [1, 20], # MP Máximo
  365.       ATK: [2,  5], # Ataque
  366.       DEF: [2,  5], # Defesa
  367.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  368.       DEM: [1,  5], # Defesa Mágica (Resistência)
  369.       AGI: [1,  3], # Agilidade
  370.       SOR: [3,  1], # Sorte
  371.     },
  372.    
  373.     10 => { # Sábio
  374.       PPN: 6,
  375.       HPM: [1, 10], # HP Máximo
  376.       MPM: [1, 10], # MP Máximo
  377.       ATK: [1,  5], # Ataque
  378.       DEF: [1,  5], # Defesa
  379.       ATM: [2,  5], # Ataque Mágico (Inteligência)
  380.       DEM: [3,  5], # Defesa Mágica
  381.       AGI: [1,  3], # Agilidade
  382.       SOR: [3,  1], # Sorte
  383.     },
  384.   }
  385.  
  386.   #------------------------------------------------------------------------
  387.   # Diálogo que alerta o jogador sobre a quantidade de pontos necessários
  388.   # para aprimorar determinado atributo.
  389.   #
  390.   # Separe as linhas por vírgula.
  391.   #
  392.   # As mudanças de cor, substituições de variáveis, nomes de personagens
  393.   # da equipe, etc, serão serão aceitas. Certifique-se de usar barras duplas
  394.   # para que possa funcionar.
  395.   #
  396.   # Existem substituições que o sistema fará:
  397.   # {actorName}   será substituido pelo nome do ator.
  398.   # {actorPoints} será substituido pela quantidade de pontos que o ator tem.
  399.   # {attrName}    será substituido pelo nome do atributo.
  400.   # {attrNPoints} será substituido pela quantidade de pontos que o atributo
  401.   #               precisa para ser aprimorado.
  402.   # {attrGPoints} será substituido pela quantia que o ator ganhará no
  403.   #               atributo selecionado.
  404.   #-------------------------------------------------------------------------
  405.  
  406.   PDistDiag = [
  407.     "\\c[1]Pontos de {actorName}: \\c[0]{actorPoints}",
  408.     "\\c[1]Pontos necessários: \\c[0]{attrNPoints}",
  409.     "\\c[1]Ganhos: \\c[0]{attrGPoints} de {attrName}",
  410.     "",
  411.     "Pressione \\c[10][Enter]\\c[0] para confirmar."
  412.   ]
  413.    
  414.   #-------------------------------------------------------------------------
  415.   # MINI-MAPA
  416.   #-------------------------------------------------------------------------
  417.   # O principal foco aqui são as cores. Perceba que estão todas no formato
  418.   # RGBA, ou seja, você terá quatro campos para preencher: [R, G, B, A]
  419.   # Onde:
  420.   #   R = Vermelho
  421.   #   G = Verde
  422.   #   B = Azul
  423.   #   A = Opacidade
  424.   # Cada um pode ir de 0 até 255.
  425.   #-------------------------------------------------------------------------
  426.  
  427.   # Tamanho dos tiles
  428.   TileSize    = 8
  429.  
  430.   # Dependendo do tamanho dos tiles, pode exister necessidade de fazer um
  431.   # ajuste de posições.
  432.   MapOffset   = -4
  433.  
  434.   # Cor do player
  435.   PlayerColor = [255, 0, 0, 255]
  436.    
  437.   # Cor dos eventos
  438.   ObjectColor = {
  439.    
  440.     # Esta configuração permite que você adicione
  441.     # diferentes cores para cada tipo de evento.
  442.     #
  443.     # Para que um evento apareça no mini-map você
  444.     # deve colocar um comentário com uma das
  445.     # opções abaixo.
  446.     #
  447.     # Utilize este padrão:
  448.     # "comentário" => [R, G, B, A],
  449.    
  450.     "npc"   => [  0, 255,   0, 255],
  451.     "door"  => [  0,   0, 255, 255],
  452.     "chest" => [100, 100, 100, 255],
  453.   }
  454.  
  455.   # Cor da borda dos eventos e do player
  456.   BorderColor        = [  0,   0,   0, 255]  
  457.  
  458.   # Cor dos obstáculos
  459.   MapColor           = [  0,   0,   0, 255]
  460.  
  461.   # Cor da borda dos obstáculos
  462.   MapBorderColor     = [ 50,  50,  50, 255]
  463.  
  464.   # Opacidade da camada de eventos
  465.   ObjectLayerOpacity = 255
  466.  
  467.   #-------------------------------------------------------------------------
  468.   # ANIMAÇÕES
  469.   #-------------------------------------------------------------------------
  470.   # O menu permite a configuração das animações, deve-se usar um número de 0
  471.   # até 29 para selecionar a animação que você quer. Sendo que:
  472.   #
  473.   #  0 = Linear                     | 15 = Cúbica (Entrada e Saída)
  474.   #  1 = Senoidal (Entrada)         | 16 = Exponencial (Entrada)
  475.   #  2 = Senoidal (Saída)           | 17 = Exponencial (Saída)
  476.   #  3 = Senoidal (Entrada e Saída) | 18 = Exponencial (Entrada e Saída)
  477.   #  4 = Circular (Entrada)         | 19 = Quadrática (Entrada)
  478.   #  5 = Circular (Saída)           | 20 = Quadrática (Saída)
  479.   #  6 = Circular (Entrada e Saída) | 21 = Quadrática (Entrada e Saída)
  480.   #  7 = Mola (Entrada)             | 22 = Quártica (Entrada)
  481.   #  8 = Mola (Saída)               | 23 = Quártica (Saída)
  482.   #  9 = Mola (Entrada e Saída)     | 24 = Quártica (Entrada e Saída)
  483.   # 10 = Retorno (Entrada)          | 25 = Quíntica (Entrada)
  484.   # 11 = Retorno (Saída)            | 26 = Quíntica (Saída)
  485.   # 12 = Retorno (Entrada e Saída)  | 27 = Quíntica (Entrada e Saída)
  486.   # 13 = Cúbico (Entrada)           | 28 = Elástica (Entrada)
  487.   # 14 = Cúbica (Saída)             | 29 = Elástica (Saída)
  488.   #
  489.   # Todos os campos "Duração" são referentes ao tempo da animação em segundos
  490.   # Todos os campos "Atraso" são referentes ao atraso da animação em centésimos
  491.   #-------------------------------------------------------------------------
  492.   Animation = {
  493.     # Animação de entrada dos ícones
  494.     IconsEnter: [
  495.       9, # ID da animação
  496.       1, # Duração
  497.       5, # Atraso
  498.     ],
  499.    
  500.     # Animação de movimendo dos ícones
  501.     IconsMove: [
  502.        12, # ID da animação
  503.       0.5, # Duração
  504.     ],
  505.    
  506.     # Animação de entrada do Cursor
  507.     CursorEnter: [
  508.       13, # ID da animação
  509.        1, # Duração
  510.     ],
  511.    
  512.     # Animação de movimento do Cursor
  513.     CursorMove: [
  514.        29, # ID da animação
  515.       0.5, # Duração
  516.     ],
  517.    
  518.     # Animação da mensagem
  519.     Message: [
  520.       21, # ID da animação
  521.        1, # Duração
  522.     ],
  523.    
  524.     # Animação de entrada das informações (básicas) dos atores
  525.     WindowsEnter: [
  526.       27, # ID da animação
  527.        2, # Duração
  528.        5, # Atraso
  529.     ],
  530.    
  531.     # Animação de movimento das informações (básicas) dos atores
  532.     WindowsMove: [
  533.        16, # ID da animação
  534.         1, # Duração
  535.         1, # Atraso
  536.     ],
  537.    
  538.     # Animação de entrada da janela de seleção de atores
  539.     ActorSelEnter: [
  540.       4, # ID da animação
  541.       1, # Duração
  542.     ],
  543.    
  544.     # Animação de movimento da janela de seleção de atores
  545.     ActorSelMove: [
  546.        24, # ID da animação
  547.       0.5, # Duração
  548.     ],
  549.    
  550.     # Animação de entrada das janelas de itens
  551.     ItemsEnter: [
  552.       9, # ID da animação
  553.       1, # Duração
  554.     ],
  555.    
  556.     # Animação de movimento das janelas de itens
  557.     ItemsMove: [
  558.        12, # ID da animação
  559.       0.5, # Duração
  560.     ],
  561.    
  562.     # Animação de entrada das janelas de equipamentos
  563.     EquipsEnter: [
  564.       9, # ID da animação
  565.       1, # Duração
  566.     ],
  567.    
  568.     # Animação de movimento das janelas de equipamentos
  569.     EquipsMove: [
  570.        12, # ID da animação
  571.       0.5, # Duração
  572.     ],
  573.    
  574.     # Animação de entrada das janelas de habilidades
  575.     SkillsEnter: [
  576.      12, # ID da animação
  577.       1, # Duração
  578.     ],
  579.    
  580.     # Animação de movimento das janelas de habilidades
  581.     SkillsMove: [
  582.        15, # ID da animação
  583.       0.5, # Duração
  584.     ],
  585.    
  586.     # Animação de entrada das janelas de formação
  587.     FormationEnter: [
  588.        29, # ID da animação
  589.       1.5, # Duração
  590.         1, # Atraso
  591.     ],
  592.    
  593.     # Animação de movimento das janelas de formação
  594.     FormationMove: [
  595.        12, # ID da animação
  596.       1.5, # Duração
  597.     ],
  598.    
  599.     # Animação de entrada das janelas de informações completas
  600.     StatusEnter: [
  601.       29, # ID da animação
  602.        2, # Duração
  603.     ],
  604.    
  605.     # Animação de movimento das janelas de informações completas
  606.     StatusMove: [
  607.        3, # ID da animação
  608.      0.5, # Duração
  609.     ],
  610.    
  611.     # Animação de entrada das janelas de monstros do bestiário
  612.     BestiaryEnter: [
  613.       22, # ID da animação
  614.        1, # Duração
  615.        1, # Atraso
  616.     ],
  617.    
  618.     # Animação de movimento das janelas de monstros do bestiário
  619.     BestiaryMove: [
  620.       15, # ID da animação
  621.      0.3, # Duração
  622.     ],
  623.    
  624.     # Animação de entrada das janelas de informações completas
  625.     PDistEnter: [
  626.       29, # ID da animação
  627.        2, # Duração
  628.     ],
  629.    
  630.     # Animação de movimento das janelas de informações completas
  631.     PDistMove: [
  632.        3, # ID da animação
  633.      0.5, # Duração
  634.     ],
  635.    
  636.     # Animação de entrada do mini-mapa
  637.     MiniMapEnter: [
  638.        9, # ID da animação
  639.        1, # Duração
  640.     ],
  641.    
  642.     # Animação de movimento do mini-mapa
  643.     MiniMapMove: [
  644.        9, # ID da animação
  645.        1, # Duração
  646.     ],
  647.    
  648.     # Animação de entrada da janela de opções
  649.     OptionEnter: [
  650.       29, # ID da animação
  651.        2, # Duração
  652.     ],
  653.        
  654.     # Animação de entrada das janelas de save
  655.     SaveEnter: [
  656.        27, # ID da animação
  657.       1.5, # Duração
  658.         1, # Atraso
  659.     ],
  660.    
  661.     # Animação de movimento das janelas de save
  662.     SaveMove: [
  663.          1, # ID da animação
  664.       0.25, # Duração
  665.     ],
  666.   }
  667.  
  668.   #===========================================================================
  669.   # ** FIM DA CONFIGURAÇÃO
  670.   #===========================================================================
  671.  
  672.   ColorOk    = Color.new(*MsgOk   )
  673.   ColorInfo  = Color.new(*MsgInfo )
  674.   ColorError = Color.new(*MsgError)
  675.  
  676.   #---
  677.  
  678.   @enabled = []
  679.   @cache   = false
  680.  
  681.   Use.each_pair{|key, value| @enabled << key if value}
  682.  
  683.   module_function
  684.  
  685.   #-------------------------------------------------------------------------
  686.   # * Ativa uma opção do menu durante o jogo (Chamada por eventos)
  687.   #     option : Chave que identifica o comando
  688.   #-------------------------------------------------------------------------
  689.   def enable(option)
  690.     if Use.keys.include?(option) and not @enabled.include?(option)
  691.       @enabled.push(option)
  692.     end
  693.   end
  694.  
  695.   #-------------------------------------------------------------------------
  696.   # * Desativa uma opção do menu durante o jogo (Chamada por eventos)
  697.   #     option : Chave que identifica o comando
  698.   #-------------------------------------------------------------------------
  699.   def disable(option)
  700.     @enabled.delete(option) if Use.keys.include?(option)
  701.   end
  702.  
  703.   #-------------------------------------------------------------------------
  704.   # * Verifica se um comando está ativado
  705.   #     option : Chave que identifica o comando
  706.   #-------------------------------------------------------------------------
  707.   def enabled?(option)
  708.     return @enabled.include?(option)
  709.   end
  710.  
  711.   #-------------------------------------------------------------------------
  712.   # * Dá pontos de atributo à um ator
  713.   #     id : ID do ator na database
  714.   #     qt : Quantidade de pontos
  715.   #-------------------------------------------------------------------------
  716.   def giveActorPoints(id, qt)
  717.     members = $game_party.members
  718.     index   = members.map{|actor| actor.id}.index(id)
  719.     return unless index
  720.     members[index].attrPoints += qt
  721.     members[index].attrPoints  = 0 if members[index].attrPoints < 0
  722.   end
  723.  
  724.   #-------------------------------------------------------------------------
  725.   # * Dá pontos de atributo de um ator
  726.   #     id : ID do ator na database
  727.   #     qt : Quantidade de pontos
  728.   #-------------------------------------------------------------------------
  729.   def removeActorPoints(id, qt)
  730.     giveActorsPoints(id, -qt)
  731.   end
  732.  
  733.   #-------------------------------------------------------------------------
  734.   # * Adiciona monstro ao bestiário
  735.   #     id : ID do monstro na database
  736.   #-------------------------------------------------------------------------
  737.   def bestiaryAddMonster(id)
  738.     $game_system.bestiaryAddMonster(id)
  739.   end
  740.  
  741.   #-------------------------------------------------------------------------
  742.   # * Remove monstro do bestiário
  743.   #     id : ID do monstro na database
  744.   #-------------------------------------------------------------------------
  745.   def bestiaryRemoveMonster(id)
  746.     $game_system.bestiaryRemoveMonster(id)
  747.   end
  748.  
  749.   #================
  750.  
  751.   #-------------------------------------------------------------------------
  752.   # * Retorna todas as opções ativas
  753.   #-------------------------------------------------------------------------
  754.   def enabled
  755.     return @enabled
  756.   end
  757.   #-------------------------------------------------------------------------
  758.   # * Retorna todas as opções ativas
  759.   #-------------------------------------------------------------------------
  760.   def enabledOptions(ret = :none)
  761.     options = @enabled.dup
  762.     return options if ret == :none
  763.    
  764.     case ret
  765.     when :icon
  766.       options.map!{|key|
  767.         base = Icon[key]
  768.      
  769.         if (key == :Formation) and ($game_party.members.size < 2)
  770.           base = DisabledIcon[key] < 0 ? -base : DisabledIcon[key]
  771.         end
  772.        
  773.         if (key == :Bestiary) and (!$game_system.new_monsters)
  774.           base = DisabledIcon[key] < 0 ? -base : DisabledIcon[key]
  775.         end
  776.        
  777.         if (key == :PDist) and ($game_party.members.all?{|ac| ac.attrPoints == 0})
  778.           base = DisabledIcon[key] < 0 ? -base : DisabledIcon[key]
  779.         end
  780.        
  781.         if (key == :Save) and ($game_system.save_disabled)
  782.           base = DisabledIcon[key] < 0 ? -base : DisabledIcon[key]
  783.         end
  784.        
  785.         base      
  786.       }
  787.      
  788.     when :name
  789.       options.map!{|key| Vocab[key]}
  790.      
  791.     end
  792.   end
  793.   #-------------------------------------------------------------------------
  794.   # * Retorna todas as subopções ativas
  795.   #-------------------------------------------------------------------------
  796.   def enabledSubOption(option = :none, type = :none)
  797.     case option
  798.     when :Items
  799.       keys = [:Item, :Weapon, :Armor, :KeyItem]
  800.     when :Save
  801.       keys = [:SaveYes, :SaveNo]
  802.     when :Exit
  803.       keys = [:ExitTitle, :ExitGame, :ExitCanc]
  804.     end
  805.    
  806.     return keys if type == :none
  807.     return keys.map{|key| type == :Names ? Vocab[key] : Icon[key] }
  808.   end
  809. end
  810.  
  811. #==============================================================================
  812. # ** Numeric
  813. #------------------------------------------------------------------------------
  814. # Classe que rege as instâncias numéricas
  815. #==============================================================================
  816. class Numeric
  817.   #-------------------------------------------------------------------------
  818.   # * Converte o numérico para string
  819.   #-------------------------------------------------------------------------
  820.   def group
  821.     self.to_s
  822.   end
  823. end
  824.  
  825. #==============================================================================
  826. # ** String
  827. #------------------------------------------------------------------------------
  828. # Classe que rege todas as instâncias de strings
  829. #==============================================================================
  830. class String
  831.   UPCASE_ISOTAB   = 'ÀÁÂÃÄÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÇÑÝŸ'
  832.   DOWNCASE_ISOTAB = 'àáâãäèéêëÍíîïòóôõöùúûüçñýÿ'
  833.  
  834.   #-------------------------------------------------------------------------
  835.   # * Faz com que caracteres especiais também sejam colocado em caixa-alta
  836.   #-------------------------------------------------------------------------
  837.   def isoUpcase
  838.     return upcase.tr(DOWNCASE_ISOTAB, UPCASE_ISOTAB)
  839.   end
  840. end
  841.  
  842. #==============================================================================
  843. # ** Audio
  844. #------------------------------------------------------------------------------
  845. # Módulo que coordena toda operação sonora do jogo
  846. #==============================================================================
  847. class << Audio
  848.   alias mrm_extrememenu_bgm_play bgm_play
  849.   alias mrm_extrememenu_me_play  me_play
  850.   alias mrm_extrememenu_bgs_play bgs_play
  851.   alias mrm_extrememenu_se_play  se_play
  852.  
  853.   def bgm_play(name, volume, pitch, pos)
  854.     volume *= $game_system.musicRate if defined?($game_system)
  855.     mrm_extrememenu_bgm_play(name, volume, pitch, pos)
  856.   end
  857.  
  858.   def me_play(name, volume, pitch)
  859.     volume *= $game_system.musicRate if defined?($game_system)
  860.     mrm_extrememenu_bgm_play(name, volume, pitch)
  861.   end
  862.  
  863.   def bgs_play(name, volume, pitch, pos)
  864.     volume *= $game_system.soundRate if defined?($game_system)
  865.     mrm_extrememenu_bgs_play(name, volume, pitch, pos)
  866.   end
  867.  
  868.   def se_play(name, volume, pitch)
  869.     volume *= $game_system.soundRate if defined?($game_system)
  870.     mrm_extrememenu_se_play(name, volume, pitch)
  871.   end
  872. end
  873. #==============================================================================
  874. # ** Bitmap
  875. #------------------------------------------------------------------------------
  876. # Classe que rege as informações sobre bitmaps na memória
  877. #==============================================================================
  878. class Bitmap
  879.   #--------------------------------------------------------------------------
  880.   # Constantes
  881.   #--------------------------------------------------------------------------
  882.   RtlMoveMemory1 = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  883.   RtlMoveMemory2 = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  884.  
  885.   #--------------------------------------------------------------------------
  886.   # * Preenche a informação de cores
  887.   #     data  : Blob
  888.   #     width : Largura
  889.   #--------------------------------------------------------------------------
  890.   def self.new_from_data(data, width)
  891.     b = Bitmap.new(width, data.length/(4 * width))
  892.     RtlMoveMemory2.call(b.address, data, data.length)
  893.     return b
  894.   end
  895.   #--------------------------------------------------------------------------
  896.   # * Retorna a informação de cores
  897.   #--------------------------------------------------------------------------
  898.   def get_color_data
  899.     data  = "bgra" * width * height              
  900.     RtlMoveMemory1.call(data, self.address, data.length)
  901.     return data
  902.   end
  903.   #--------------------------------------------------------------------------
  904.   # * Endereço na memória da informação de cores:
  905.   #   *(*(*(bitmap << 1 + 16) + 8) + 16)
  906.   #--------------------------------------------------------------------------
  907.   def address
  908.     buffer = "xxxx"
  909.     ad     = self.object_id * 2 + 16
  910.     RtlMoveMemory1.call(buffer, ad, 4);   ad = buffer.unpack("L").first +  8
  911.     RtlMoveMemory1.call(buffer, ad, 4);   ad = buffer.unpack("L").first + 16
  912.     RtlMoveMemory1.call(buffer, ad, 4); return buffer.unpack("L").first
  913.   end
  914. end
  915.  
  916. #==============================================================================
  917. # ** RPG::BaseItem
  918. #------------------------------------------------------------------------------
  919. # Classe mãe de
  920. #==============================================================================
  921. class RPG::BaseItem
  922.   #--------------------------------------------------------------------------
  923.   # Variáveis de instância públicas
  924.   #--------------------------------------------------------------------------
  925.   attr_accessor :image
  926.  
  927.   #--------------------------------------------------------------------------
  928.   # * Carrega informação necessária das notas do item
  929.   #--------------------------------------------------------------------------
  930.   def load_notetags_aso
  931.     self.note.split(/[\r\n]+/).each{|line|
  932.       if line =~ /<(?:IMAGE|image):[ ](.*)>/i
  933.         @image = $1.to_s
  934.       end
  935.     }
  936.   end
  937.  
  938. end
  939.  
  940. #==============================================================================
  941. # ** DataManager
  942. #------------------------------------------------------------------------------
  943. #  Este módulo gerencia o jogo e objetos do banco de dados utilizados no jogo.
  944. # Quase todas as variáveis globais são inicializadas no módulo.
  945. #==============================================================================
  946. class << DataManager
  947.   alias mrm_extrememenu_init init
  948.   alias mrm_extrememenu_msh  make_save_header
  949.   alias mrm_extrememenu_lg   load_game
  950.   alias mrm_extrememenu_sg   save_game
  951.   alias mrm_extrememenu_ldb  load_database
  952.  
  953.   @last_menu_saveindex = nil
  954.  
  955.   #--------------------------------------------------------------------------
  956.   # * Inicialização
  957.   #     *args, &block : Argumentos
  958.   #--------------------------------------------------------------------------
  959.   def init(*args, &block)
  960.     mrm_extrememenu_init(*args, &block)
  961.     load_config_data
  962.     @last_menu_saveindex = nil
  963.   end
  964.   #--------------------------------------------------------------------------
  965.   # * Carregamento do Banco de Dados
  966.   #     *args, &block : Argumentos
  967.   #--------------------------------------------------------------------------
  968.   def load_database(*args, &block)
  969.     mrm_extrememenu_ldb(*args, &block)
  970.     load_notetags_aso unless $BTEST
  971.   end
  972.   #--------------------------------------------------------------------------
  973.   # * Salva informação de configuração (Última configuração salva)
  974.   #--------------------------------------------------------------------------
  975.   def save_config_data
  976.     File.open("Config.rvdata2", "wb") { |f|
  977.       Marshal.dump($game_system.musicRate, f)
  978.       Marshal.dump($game_system.soundRate, f)
  979.     }
  980.   end
  981.   #--------------------------------------------------------------------------
  982.   # * Carrega informação de configuração
  983.   #--------------------------------------------------------------------------
  984.   def load_config_data
  985.     return unless File.exist?("Config.rvdata2")
  986.     File.open("Config.rvdata2", "rb"){|f|
  987.       $game_system.musicRate = Marshal.load(f)
  988.       $game_system.soundRate = Marshal.load(f)
  989.     }
  990.   end
  991.   #--------------------------------------------------------------------------
  992.   # * Salvar a criação de cabeçalho
  993.   #     *args // &block : Argumentos
  994.   #--------------------------------------------------------------------------
  995.   def make_save_header(*args, &block)
  996.     header = mrm_extrememenu_msh(*args, &block)
  997.    
  998.     bmap = Bitmap.new(157, 120)
  999.     ss   = SceneManager.background_bitmap
  1000.     bmap.stretch_blt(bmap.rect, ss, ss.rect)
  1001.     header[:preview] = bmap.get_color_data
  1002.    
  1003.     return header
  1004.   end
  1005.   #--------------------------------------------------------------------------
  1006.   # * Salvar Jogo
  1007.   #     index : índice
  1008.   #--------------------------------------------------------------------------
  1009.   def save_game(index)
  1010.     result = mrm_extrememenu_sg(index)
  1011.     save_config_data
  1012.     @last_menu_saveindex = index if result
  1013.     return result
  1014.   end
  1015.   #--------------------------------------------------------------------------
  1016.   # * Carregamento do Jogo
  1017.   #     index : índice
  1018.   #--------------------------------------------------------------------------
  1019.   def load_game(index)
  1020.     result = mrm_extrememenu_lg(index)
  1021.     @last_menu_saveindex = index if result
  1022.     return result
  1023.   end
  1024.   #--------------------------------------------------------------------------
  1025.   # * Última index carregada
  1026.   #--------------------------------------------------------------------------
  1027.   def last_menu_saveindex
  1028.     return (@last_menu_saveindex || -1) + 1
  1029.   end
  1030.  
  1031.   #--------------------------------------------------------------------------
  1032.   # * Carrega notas dos itens
  1033.   #--------------------------------------------------------------------------
  1034.   def load_notetags_aso
  1035.     [$data_items, $data_weapons, $data_armors].each{|group| group.each{|obj|
  1036.       next unless obj
  1037.       obj.load_notetags_aso
  1038.     }}
  1039.   end
  1040. end
  1041.  
  1042. #==============================================================================
  1043. # ** BattleManager
  1044. #------------------------------------------------------------------------------
  1045. #  Este módulo gerencia o andamento da batalha.
  1046. #==============================================================================
  1047. if MRM::ExtremeMenu::AutoBestiaryAdd
  1048.   class << BattleManager
  1049.     alias mrm_extrememenu_process_victory process_victory
  1050.    
  1051.     #------------------------------------------------------------------------
  1052.     # * Processar vitória
  1053.     #     *args // &block : Argumentos
  1054.     #------------------------------------------------------------------------
  1055.     def process_victory(*args, &block)
  1056.       mrm_extrememenu_process_victory
  1057.       $game_troop.troop.members.map{|member| member.enemy_id}.uniq.each{|id|
  1058.         $game_system.bestiaryAddMonster(id)
  1059.       }
  1060.     end
  1061.   end
  1062. end
  1063.  
  1064. #==============================================================================
  1065. # ** Game_System
  1066. #------------------------------------------------------------------------------
  1067. # Esta classe gerencia os dados relacionados ao sistema. Também gerencia
  1068. # veículos, BGM, etc.
  1069. # A instância desta classe é referenciada por $game_system.
  1070. #==============================================================================
  1071. class Game_System
  1072.   attr_accessor :musicRate
  1073.   attr_accessor :soundRate
  1074.   attr_accessor :new_monsters
  1075.   attr_reader   :monsters
  1076.  
  1077.   alias mrm_extrememenu_initialize initialize
  1078.  
  1079.   #-------------------------------------------------------------------------
  1080.   # * Inicialização
  1081.   #     *args // &block : Argumentos
  1082.   #-------------------------------------------------------------------------
  1083.   def initialize(*args, &block)
  1084.     mrm_extrememenu_initialize(*args, &block)
  1085.     if defined?($game_system)
  1086.       @musicRate = $game_system.musicRate
  1087.       @soundRate = $game_system.soundRate
  1088.     else
  1089.       @musicRate = 1.0
  1090.       @soundRate = 1.0
  1091.     end
  1092.     @monsters     = []
  1093.     @new_monsters = false
  1094.   end
  1095.  
  1096.   #-------------------------------------------------------------------------
  1097.   # * Adiciona monstros ao bestiário
  1098.   #   id : Identificação do monstro (ID no banco de dados)
  1099.   #-------------------------------------------------------------------------
  1100.   def bestiaryAddMonster(id)
  1101.     return unless id.between?(1, $data_enemies.size - 1)
  1102.     return if @monsters.include?(id)
  1103.     @monsters << id
  1104.     @new_monsters = true
  1105.   end
  1106.  
  1107.   #-------------------------------------------------------------------------
  1108.   # * Retira monstros do bestiário
  1109.   #   id : Identificação do monstro (ID no banco de dados)
  1110.   #-------------------------------------------------------------------------
  1111.   def bestiaryRemoveMonster(id)
  1112.     @monsters.delete(id)
  1113.   end
  1114. end
  1115.  
  1116. #==============================================================================
  1117. # ** Game_Actor
  1118. #------------------------------------------------------------------------------
  1119. #  Esta classe gerencia os heróis. Ela é utilizada internamente pela classe
  1120. # Game_Actors ($game_actors). A instância desta classe é referenciada
  1121. # pela classe Game_Party ($game_party).
  1122. #==============================================================================
  1123. class Game_Actor
  1124.   alias mrm_extrememenu_initialize   initialize
  1125.   alias mrm_extrememenu_level_up     level_up
  1126.   alias mrm_extrememenu_change_class change_class
  1127.  
  1128.   attr_writer :attrPoints
  1129.   attr_reader :pointsSheet
  1130.  
  1131.   #--------------------------------------------------------------------------
  1132.   # * Inicialização do objeto
  1133.   #     *args // &block : Argumentos
  1134.   #--------------------------------------------------------------------------
  1135.   def initialize(*args, &block)
  1136.     mrm_extrememenu_initialize(*args, &block)
  1137.     @attrPoints  = 0
  1138.     update_points_sheet
  1139.   end
  1140.   #--------------------------------------------------------------------------
  1141.   # * Aumento de nível
  1142.   #     *args // &block : Argumentos
  1143.   #--------------------------------------------------------------------------
  1144.   def level_up(*args, &block)
  1145.     mrm_extrememenu_level_up(*args, &block)
  1146.     @attrPoints += @pointsSheet[:PPN]
  1147.   end
  1148.   #--------------------------------------------------------------------------
  1149.   # * Leitura dos pontos de atributo
  1150.   #--------------------------------------------------------------------------
  1151.   def attrPoints
  1152.     return @attrPoints.to_i
  1153.   end
  1154.   #--------------------------------------------------------------------------
  1155.   # * Mudança de classe
  1156.   #   *args // &block : Argumentos
  1157.   #--------------------------------------------------------------------------
  1158.   def change_class(*args, &block)
  1159.     mrm_extrememenu_change_class(*args, &block)
  1160.     update_points_sheet
  1161.   end
  1162.   #--------------------------------------------------------------------------
  1163.   # * Adiciona pontos de atributos
  1164.   #     index : Identificação do atributo
  1165.   #     qt    : Quantidade
  1166.   #--------------------------------------------------------------------------
  1167.   def add_param_plus(index, qt)
  1168.     @param_plus[index] += qt
  1169.   end
  1170.   #--------------------------------------------------------------------------
  1171.   # * Atualiza tabela de pontos da classe
  1172.   #--------------------------------------------------------------------------
  1173.   def update_points_sheet
  1174.     @pointsSheet = MRM::ExtremeMenu::PDistPoints[@class_id]
  1175.     # Se não for definida uma configuração, anula distribuição de pontos
  1176.     # para aquela classe.
  1177.     if @pointsSheet.nil?
  1178.       @pointsSheet = {
  1179.         PNN: 0,
  1180.         HPM: [0, 0], MPM: [0, 0], ATK: [0, 0], DEF: [0, 0],
  1181.         ATM: [0, 0], DEM: [0, 0], AGI: [0, 0], SOR: [0, 0],
  1182.       }
  1183.     end
  1184.   end
  1185. end
  1186.  
  1187. #==============================================================================
  1188. # ** Menu_Base_Window
  1189. #------------------------------------------------------------------------------
  1190. # Classe básica para todas as janelas do menu
  1191. #==============================================================================
  1192. class Menu_Base_Window < Window_Base
  1193.   include MRM::ExtremeMenu
  1194.  
  1195.   BC1 = Color.new(*BarColor1)
  1196.   BC2 = Color.new(*BarColor2)
  1197.   BC3 = Color.new(*BarColor3)
  1198.   BC4 = Color.new(*BarColor4)
  1199.  
  1200.   #--------------------------------------------------------------------------
  1201.   # Inicialização do objeto
  1202.   #   *args // &block : Argumentos
  1203.   #--------------------------------------------------------------------------
  1204.   def initialize(*args, &block)
  1205.     super(*args, &block)
  1206.     self.applyFont(self.contents)
  1207.   end
  1208.   #--------------------------------------------------------------------------
  1209.   # * Desenho do HP
  1210.   #     actor  : herói
  1211.   #     x      : coordenada X
  1212.   #     y      : coordenada Y
  1213.   #     width  : largura
  1214.   #--------------------------------------------------------------------------
  1215.   def draw_actor_hp(actor, x, y, width = 124)
  1216.     rate = actor.hp_rate
  1217.    
  1218.     gc1 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  1219.     gc2 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  1220.    
  1221.     draw_special_gauge(x, y, width, rate, gc1, gc2)
  1222.    
  1223.     change_color(system_color)
  1224.     draw_text(x, y, 30, line_height, ::Vocab::hp_a)
  1225.     draw_current_and_max_values(x, y, width, actor.hp, actor.mhp,
  1226.       hp_color(actor), normal_color)
  1227.   end
  1228.   #--------------------------------------------------------------------------
  1229.   # * Desenho do MP
  1230.   #     actor  : herói
  1231.   #     x      : coordenada X
  1232.   #     y      : coordenada Y
  1233.   #     width  : largura
  1234.   #--------------------------------------------------------------------------
  1235.   def draw_actor_mp(actor, x, y, width = 124)
  1236.     rate = actor.mp_rate
  1237.  
  1238.     gc1 = Color.new(14 * rate,  80 - 24 * rate, 80 * rate, 192)
  1239.     gc2 = Color.new(62 * rate, 240 - 72 * rate, 240 * rate, 192)
  1240.    
  1241.     draw_special_gauge(x, y, width, rate, gc1, gc2)
  1242.    
  1243.     change_color(system_color)
  1244.     draw_text(x, y, 30, line_height, ::Vocab::mp_a)
  1245.     draw_current_and_max_values(x, y, width, actor.mp, actor.mmp,
  1246.       mp_color(actor), normal_color)
  1247.   end
  1248.   #-------------------------------------------------------------------------
  1249.   # * Desenha a barra especial estilo Cogwheel
  1250.   #     x     : Posição X
  1251.   #     y     : Posição Y
  1252.   #     width : Largura
  1253.   #     rate  : Porção de preenchimento
  1254.   #     gc1   : Cor 1
  1255.   #     gc2   : Cor 2
  1256.   #-------------------------------------------------------------------------
  1257.   def draw_special_gauge(x, y, width, rate, gc1, gc2)
  1258.     contents.fill_rect(x, y + line_height - 10, width, 10, BC1)
  1259.     contents.fill_rect(x + 1, y + line_height -  9,  width - 2,  8, BC2)
  1260.     contents.gradient_fill_rect(x + 2, y + line_height - 8, width - 4, 6, BC3, BC4)
  1261.     contents.gradient_fill_rect(x + 2, y + line_height - 8, (width*rate) - 4, 6, gc1, gc2)    
  1262.   end
  1263.   #-------------------------------------------------------------------------
  1264.   # * Desenho de uma linha horizontal
  1265.   #     y : Posição y de desenho
  1266.   #-------------------------------------------------------------------------
  1267.   def draw_horz_line(y)
  1268.     line_y = y + line_height / 2 - 1
  1269.     color = normal_color
  1270.     color.alpha = 48
  1271.     contents.fill_rect(128, line_y, contents_width - 128, 2, color)
  1272.   end
  1273.  
  1274.   protected
  1275.   #-------------------------------------------------------------------------
  1276.   # * Aplica opções de fonte no bitmap
  1277.   #     b : Bitmap
  1278.   #-------------------------------------------------------------------------
  1279.   def applyFont(b)
  1280.     b.font.name    = MRM::ExtremeMenu::Font[:Name]
  1281.     b.font.size    = MRM::ExtremeMenu::Font[:Size]
  1282.     b.font.color   = Color.new(*MRM::ExtremeMenu::Font[:Color])
  1283.     b.font.shadow  = MRM::ExtremeMenu::Font[:Shadow]
  1284.     b.font.outline = MRM::ExtremeMenu::Font[:Outline]
  1285.     return b
  1286.   end
  1287. end
  1288.  
  1289. #==============================================================================
  1290. # ** Menu_ItemInfo_Window
  1291. #------------------------------------------------------------------------------
  1292. # Mostra informações do item selecionado
  1293. #==============================================================================
  1294. class Menu_ItemInfo_Window < Menu_Base_Window
  1295.   attr_reader :item
  1296.  
  1297.   #-------------------------------------------------------------------------
  1298.   # * Inicialização do objeto
  1299.   #     x : Coordenada X
  1300.   #     y : Coordenada Y
  1301.   #     w : Largura
  1302.   #     h : Altura
  1303.   #-------------------------------------------------------------------------
  1304.   def initialize(x, y, w, h)
  1305.     super(x, y, w, h)
  1306.     self.opacity = 0
  1307.     @item = nil
  1308.     refresh
  1309.   end
  1310.   #-------------------------------------------------------------------------
  1311.   # * Seleciona item e redesenha conteúdo
  1312.   #     item : Novo item
  1313.   #-------------------------------------------------------------------------
  1314.   def item=(value)
  1315.     @item = value
  1316.     refresh
  1317.   end
  1318.   #-------------------------------------------------------------------------
  1319.   # * Desenho do conteúdo da janela
  1320.   #-------------------------------------------------------------------------
  1321.   def refresh
  1322.     contents.clear
  1323.     return if @item.nil?
  1324.     draw_item_image
  1325.     draw_item_stats
  1326.     draw_item_effects
  1327.     draw_item_description
  1328.   end
  1329.   #--------------------------------------------------------------------------
  1330.   # * Desenha imagem do item
  1331.   #--------------------------------------------------------------------------
  1332.   def draw_item_image
  1333.     colour = Color.new(0, 0, 0, translucent_alpha/2)
  1334.     center = (contents_width - 96) / 2
  1335.     rect = Rect.new(center + 1, 1, 94, 94)
  1336.     if @item.image.nil?
  1337.       icon_index = @item.icon_index
  1338.       bitmap = Cache.system("Iconset")
  1339.       rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  1340.       target = Rect.new(center, 0, 96, 96)
  1341.       contents.stretch_blt(target, bitmap, rect)
  1342.     else
  1343.       bitmap = Cache.picture(@item.image)
  1344.       contents.blt(0, 0, bitmap, bitmap.rect, 255)
  1345.     end
  1346.   end
  1347.   #--------------------------------------------------------------------------
  1348.   # * Desenha status do item
  1349.   #--------------------------------------------------------------------------
  1350.   def draw_item_stats
  1351.     return unless @item.is_a?(RPG::Weapon) || @item.is_a?(RPG::Armor)
  1352.     dx = 0; dy = 96
  1353.     dw = contents.width / 2
  1354.     8.times{|i|
  1355.       draw_equip_param(i, dx, dy, dw)
  1356.       dx = dx >= dw ? 0 : dw
  1357.       dy += line_height if dx == 0
  1358.     }
  1359.   end
  1360.   #--------------------------------------------------------------------------
  1361.   # * Desenha parâmetro (nome) do item
  1362.   #     param_id : Identificação do  parâmetro
  1363.   #     dx       : Posição X
  1364.   #     dy       : Posição Y
  1365.   #     dw       : Largura
  1366.   #--------------------------------------------------------------------------
  1367.   def draw_equip_param(param_id, dx, dy, dw)
  1368.     change_color(system_color)
  1369.     draw_text(dx+4, dy, dw-8, line_height, ::Vocab::param(param_id))
  1370.     draw_set_param(param_id, dx, dy, dw)
  1371.   end
  1372.   #--------------------------------------------------------------------------
  1373.   # * Desenha parâmetro (valor) do item
  1374.   #     param_id : Identificação do  parâmetro
  1375.   #     dx       : Posição X
  1376.   #     dy       : Posição Y
  1377.   #     dw       : Largura
  1378.   #--------------------------------------------------------------------------
  1379.   def draw_set_param(param_id, dx, dy, dw)
  1380.     value = @item.params[param_id]
  1381.     change_color(param_change_color(value), value != 0)
  1382.     text = value.group
  1383.     text = "+" + text if value > 0
  1384.     draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1385.     return text
  1386.   end
  1387.   #--------------------------------------------------------------------------
  1388.   # * Desenha efeitos do ítem
  1389.   #--------------------------------------------------------------------------
  1390.   def draw_item_effects
  1391.     return if @item.is_a?(RPG::EquipItem)
  1392.     dx = 0; dy = 96
  1393.    
  1394.     if @item.is_a?(RPG::Skill)
  1395.       dw = contents.width
  1396.       draw_applies(dx, dy + line_height * 0, dw)
  1397.       draw_removes(dx, dy + line_height * 1, dw)
  1398.       return
  1399.     end
  1400.    
  1401.     dw = contents.width / 2
  1402.     draw_hp_recover(dx, dy + line_height * 0, dw)
  1403.     draw_mp_recover(dx, dy + line_height * 1, dw)
  1404.     draw_tp_recover(dx + dw, dy + line_height * 0, dw)
  1405.     draw_tp_gain(dx + dw, dy + line_height * 1, dw)
  1406.    
  1407.     dw = contents.width
  1408.     draw_applies(dx, dy + line_height * 2, dw)
  1409.     draw_removes(dx, dy + line_height * 3, dw)
  1410.   end
  1411.   #--------------------------------------------------------------------------
  1412.   # * Desenha recuperação de HP
  1413.   #     dx       : Posição X
  1414.   #     dy       : Posição Y
  1415.   #     dw       : Largura
  1416.   #--------------------------------------------------------------------------
  1417.   def draw_hp_recover(dx, dy, dw)
  1418.     change_color(system_color)
  1419.     draw_text(dx+4, dy, dw-8, line_height, Vocab[:HPRecover])
  1420.     per = 0
  1421.     set = 0
  1422.     for effect in @item.effects
  1423.       next unless effect.code == 11
  1424.       per += (effect.value1 * 100).to_i
  1425.       set += effect.value2.to_i
  1426.     end
  1427.     if per != 0 && set != 0
  1428.       change_color(param_change_color(set))
  1429.       text = set > 0 ? sprintf("+%s", set.group) : set.group
  1430.       draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1431.       dw -= text_size(text).width
  1432.       change_color(param_change_color(per))
  1433.       text = per > 0 ? sprintf("+%s%%", per.group) : sprintf("%s%%", per.group)
  1434.       draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1435.       return
  1436.     elsif per != 0
  1437.       change_color(param_change_color(per))
  1438.       text = per > 0 ? sprintf("+%s%%", per.group) : sprintf("%s%%", per.group)
  1439.     elsif set != 0
  1440.       change_color(param_change_color(set))
  1441.       text = set > 0 ? sprintf("+%s", set.group) : set.group
  1442.     else
  1443.       change_color(normal_color, false)
  1444.       text = Vocab[:Empty]
  1445.     end
  1446.     draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1447.   end
  1448.   #--------------------------------------------------------------------------
  1449.   # * Desenha recuperação de MP
  1450.   #     dx       : Posição X
  1451.   #     dy       : Posição Y
  1452.   #     dw       : Largura
  1453.   #--------------------------------------------------------------------------
  1454.   def draw_mp_recover(dx, dy, dw)
  1455.     change_color(system_color)
  1456.     draw_text(dx+4, dy, dw-8, line_height, Vocab[:MPRecover])
  1457.     per = 0
  1458.     set = 0
  1459.     for effect in @item.effects
  1460.       next unless effect.code == 12
  1461.       per += (effect.value1 * 100).to_i
  1462.       set += effect.value2.to_i
  1463.     end
  1464.     if per != 0 && set != 0
  1465.       change_color(param_change_color(set))
  1466.       text = set > 0 ? sprintf("+%s", set.group) : set.group
  1467.       draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1468.       dw -= text_size(text).width
  1469.       change_color(param_change_color(per))
  1470.       text = per > 0 ? sprintf("+%s%%", per.group) : sprintf("%s%%", per.group)
  1471.       draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1472.       return
  1473.     elsif per != 0
  1474.       change_color(param_change_color(per))
  1475.       text = per > 0 ? sprintf("+%s%%", per.group) : sprintf("%s%%", per.group)
  1476.     elsif set != 0
  1477.       change_color(param_change_color(set))
  1478.       text = set > 0 ? sprintf("+%s", set.group) : set.group
  1479.     else
  1480.       change_color(normal_color, false)
  1481.       text = Vocab[:Empty]
  1482.     end
  1483.     draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1484.   end
  1485.   #--------------------------------------------------------------------------
  1486.   # * Desenha recuperação de TP
  1487.   #     dx       : Posição X
  1488.   #     dy       : Posição Y
  1489.   #     dw       : Largura
  1490.   #--------------------------------------------------------------------------
  1491.   def draw_tp_recover(dx, dy, dw)
  1492.     change_color(system_color)
  1493.     draw_text(dx+4, dy, dw-8, line_height, Vocab[:TPRecover])
  1494.     set = 0
  1495.     for effect in @item.effects
  1496.       next unless effect.code == 13
  1497.       set += effect.value1.to_i
  1498.     end
  1499.     if set != 0
  1500.       change_color(param_change_color(set))
  1501.       text = set > 0 ? sprintf("+%s", set.group) : set.group
  1502.     else
  1503.       change_color(normal_color, false)
  1504.       text = Vocab[:Empty]
  1505.     end
  1506.     draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1507.   end
  1508.   #--------------------------------------------------------------------------
  1509.   # * Desenha ganho de TP
  1510.   #     dx       : Posição X
  1511.   #     dy       : Posição Y
  1512.   #     dw       : Largura
  1513.   #--------------------------------------------------------------------------
  1514.   def draw_tp_gain(dx, dy, dw)
  1515.     change_color(system_color)
  1516.     draw_text(dx+4, dy, dw-8, line_height, Vocab[:TPGain])
  1517.     set = @item.tp_gain
  1518.     if set != 0
  1519.       change_color(param_change_color(set))
  1520.       text = set > 0 ? sprintf("+%s", set.group) : set.group
  1521.     else
  1522.       change_color(normal_color, false)
  1523.       text = Vocab[:Empty]
  1524.     end
  1525.     draw_text(dx+4, dy, dw-8, line_height, text, 2)
  1526.   end
  1527.   #--------------------------------------------------------------------------
  1528.   # * Desenha efeito aplicados
  1529.   #     dx       : Posição X
  1530.   #     dy       : Posição Y
  1531.   #     dw       : Largura
  1532.   #--------------------------------------------------------------------------
  1533.   def draw_applies(dx, dy, dw)
  1534.     change_color(system_color)
  1535.     draw_text(dx+4, dy, dw-8, line_height, Vocab[:Applies])
  1536.     icons = []
  1537.     for effect in @item.effects
  1538.       case effect.code
  1539.       when 21
  1540.         next unless effect.value1 > 0
  1541.         next if $data_states[effect.value1].nil?
  1542.         icons.push($data_states[effect.value1].icon_index)
  1543.       when 31
  1544.         icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
  1545.       when 32
  1546.         icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
  1547.       end
  1548.       icons.delete(0)
  1549.       break if icons.size >= MaxIconsDrawn
  1550.     end
  1551.     draw_icons(dx, dy, dw, icons)
  1552.   end
  1553.   #--------------------------------------------------------------------------
  1554.   # * Desenha efeitos removidos
  1555.   #     dx       : Posição X
  1556.   #     dy       : Posição Y
  1557.   #     dw       : Largura
  1558.   #--------------------------------------------------------------------------
  1559.   def draw_removes(dx, dy, dw)
  1560.     change_color(system_color)
  1561.     draw_text(dx+4, dy, dw-8, line_height, Vocab[:Removes])
  1562.     icons = []
  1563.     for effect in @item.effects
  1564.       case effect.code
  1565.       when 22
  1566.         next unless effect.value1 > 0
  1567.         next if $data_states[effect.value1].nil?
  1568.         icons.push($data_states[effect.data_id].icon_index)
  1569.       when 33
  1570.         icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
  1571.       when 34
  1572.         icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
  1573.       end
  1574.       icons.delete(0)
  1575.       break if icons.size >= MaxIconsDrawn
  1576.     end
  1577.     draw_icons(dx, dy, dw, icons)
  1578.   end
  1579.   #--------------------------------------------------------------------------
  1580.   # * Desenha ícones
  1581.   #     dx       : Posição X
  1582.   #     dy       : Posição Y
  1583.   #     dw       : Largura
  1584.   #     icons    : Array com identificação dos itens
  1585.   #--------------------------------------------------------------------------
  1586.   def draw_icons(dx, dy, dw, icons)
  1587.     dx += dw - 4
  1588.     dx -= icons.size * 24
  1589.     for icon_id in icons
  1590.       draw_icon(icon_id, dx, dy)
  1591.       dx += 24
  1592.     end
  1593.     if icons.size == 0
  1594.       change_color(normal_color, false)
  1595.       text = Vocab[:Empty]
  1596.       draw_text(4, dy, contents.width-8, line_height, text, 2)
  1597.     end
  1598.   end
  1599.   #--------------------------------------------------------------------------
  1600.   # * Desenha a descrição do item
  1601.   #--------------------------------------------------------------------------
  1602.   def draw_item_description
  1603.     change_color(normal_color)
  1604.     text = @item.description.split(/\s/)
  1605.     dy   = (@item.is_a?(RPG::Skill) ? line_height * 3 + 96 : 200) - line_height
  1606.    
  1607.     word = text.shift
  1608.     tlen = contents.text_size(word).width
  1609.     phrs = word + " "
  1610.    
  1611.     until text.empty?
  1612.       word = text.shift
  1613.       len  = contents.text_size(word).width
  1614.       if len + tlen >= contents_width / 1.25
  1615.         draw_text(0, dy += line_height, contents_width, line_height, phrs, 1)
  1616.         text.unshift(word)
  1617.         tlen = 0
  1618.         phrs = ''
  1619.       else
  1620.         tlen += len
  1621.         phrs += word + " "
  1622.       end      
  1623.     end
  1624.     draw_text(0, dy + line_height, contents_width, line_height, phrs, 1)
  1625.    
  1626.   end
  1627. end
  1628. #==============================================================================
  1629. # ** Menu_Item_Window
  1630. #------------------------------------------------------------------------------
  1631. # Janela responsável por mostrar itens filtrados (Itens, Armaduras, etc)
  1632. #==============================================================================
  1633. class Menu_Item_Window < Window_Command
  1634.   attr_reader :info
  1635.   attr_reader :equipMode
  1636.  
  1637.   #--------------------------------------------------------------------------
  1638.   # * Inicialização do objeto
  1639.   #     x : Coordenada X
  1640.   #     y : Coordenada Y
  1641.   #     w : Largura
  1642.   #     h : Altura
  1643.   #--------------------------------------------------------------------------
  1644.   def initialize(x, y, w, h)
  1645.     @width     = w
  1646.     @height    = h
  1647.     @equipMode = nil
  1648.     super(x, y)
  1649.     self.applyFont(self.contents)
  1650.     self.open
  1651.   end
  1652.   #--------------------------------------------------------------------------
  1653.   # * Definição de uma flag para ativar a seleção de equipamentos
  1654.   #     index : Novo modo
  1655.   #     actor : Ator
  1656.   #--------------------------------------------------------------------------
  1657.   def enableEquipMode(index, actor)
  1658.     @equipMode = {index: index, actor: actor}
  1659.   end
  1660.   #--------------------------------------------------------------------------
  1661.   # * Desativa a flag de seleção de equipamentos
  1662.   #--------------------------------------------------------------------------
  1663.   def disableEquipMode
  1664.     @equipMode = nil
  1665.   end
  1666.   #--------------------------------------------------------------------------
  1667.   # * Atualização do cursor
  1668.   #     *args // &block : Argumentos
  1669.   #--------------------------------------------------------------------------
  1670.   def update_cursor(*args, &block)
  1671.     super(*args, &block)
  1672.     @info.item = @data[index] if @data
  1673.   end
  1674.   #--------------------------------------------------------------------------
  1675.   # * Definição de resultado ao pressionar o botão de confirmação
  1676.   #--------------------------------------------------------------------------
  1677.   def process_ok
  1678.   end
  1679.   #--------------------------------------------------------------------------
  1680.   # * Define janela de informação
  1681.   #     win : Janela
  1682.   #--------------------------------------------------------------------------
  1683.   def info=(win)
  1684.     @info = win
  1685.     win.item = @data[index] if @data
  1686.   end
  1687.   #--------------------------------------------------------------------------
  1688.   # * Aquisição da largura da janela
  1689.   #--------------------------------------------------------------------------
  1690.   def window_width
  1691.     return @width
  1692.   end
  1693.   #--------------------------------------------------------------------------
  1694.   # * Aquisição da altura da janela
  1695.   #--------------------------------------------------------------------------
  1696.   def window_height
  1697.     return @height
  1698.   end
  1699.   #--------------------------------------------------------------------------
  1700.   # * Desenho de um item
  1701.   #     index : índice do item
  1702.   #--------------------------------------------------------------------------
  1703.   def draw_item(index)
  1704.     item = @data[index]
  1705.     if item
  1706.       rect = item_rect(index)
  1707.       rect.width -= 4
  1708.       draw_item_name(item, rect.x, rect.y, enable?(item))
  1709.       draw_item_number(rect, item)
  1710.     end
  1711.   end
  1712.   #--------------------------------------------------------------------------
  1713.   # * Desenho do número de itens possuido
  1714.   #     rect : retângulo
  1715.   #     item : item
  1716.   #--------------------------------------------------------------------------
  1717.   def draw_item_number(rect, item)
  1718.     draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
  1719.   end
  1720.   #--------------------------------------------------------------------------
  1721.   # * Criação da lista de comandos
  1722.   #--------------------------------------------------------------------------
  1723.   def make_command_list
  1724.     return unless @data
  1725.     @data.each{|item| add_command(item, :item_select) }
  1726.   end
  1727.   #------------------------------------------------------------------------
  1728.   # * Aplica filtro de itens
  1729.   #     type : Tipo de filtro
  1730.   #------------------------------------------------------------------------
  1731.   def applyFilter(type)
  1732.     @category = [:item, :weapon, :armor, :key_item][type]
  1733.     self.make_item_list
  1734.     @info.item = @data[index] if @data
  1735.     self.refresh
  1736.   end
  1737.   #--------------------------------------------------------------------------
  1738.   # * Inclusão do item na lista
  1739.   #     item : item
  1740.   #--------------------------------------------------------------------------
  1741.   def include?(item)
  1742.     if @equipMode
  1743.       return true  if item.nil?
  1744.       return false unless item.is_a?(RPG::EquipItem)
  1745.       return false if item.etype_id != @equipMode[:actor].equip_slots[@equipMode[:index]]
  1746.       return @equipMode[:actor].equippable?(item)
  1747.     end
  1748.  
  1749.     case @category
  1750.     when :item
  1751.       item.is_a?(RPG::Item) && !item.key_item?
  1752.     when :weapon
  1753.       item.is_a?(RPG::Weapon)
  1754.     when :armor
  1755.       item.is_a?(RPG::Armor)
  1756.     when :key_item
  1757.       item.is_a?(RPG::Item) && item.key_item?
  1758.     else
  1759.       true
  1760.     end
  1761.   end
  1762.   #--------------------------------------------------------------------------
  1763.   # * Definição de habilitação do item
  1764.   #     item : item
  1765.   #--------------------------------------------------------------------------
  1766.   def enable?(item)
  1767.     return true  if @equipMode
  1768.    
  1769.     return false if not item.is_a?(RPG::Item)
  1770.     return false if item.key_item?
  1771.    
  1772.     user = $game_party.movable_members.max_by {|member| member.pha }
  1773.     case item.scope
  1774.     when 0..6
  1775.       data = []
  1776.     when 7..8
  1777.       data = $game_party.members
  1778.     when 9..10
  1779.       data = $game_party.members.select{|actor| actor.dead?}
  1780.     end
  1781.    
  1782.     return false if data.empty?
  1783.     return data.any?{|actor| actor.item_test(user, item) }
  1784.   end
  1785.   #--------------------------------------------------------------------------
  1786.   # * Definição de habilitação do item selecionado
  1787.   #--------------------------------------------------------------------------
  1788.   def current_item_enabled?
  1789.     return enable?(current_data[:name])
  1790.   end
  1791.   #--------------------------------------------------------------------------
  1792.   # * Criação da lista de itens
  1793.   #--------------------------------------------------------------------------
  1794.   def make_item_list
  1795.     @data = $game_party.all_items.select{|item| include?(item)}
  1796.     @data.push(nil) if include?(nil)
  1797.   end
  1798.   #--------------------------------------------------------------------------
  1799.   # * Criação do conteúdo das janelas
  1800.   #--------------------------------------------------------------------------
  1801.   def create_contents(*args, &block)
  1802.     super(*args, &block)
  1803.     self.applyFont(contents)
  1804.   end
  1805.  
  1806.   protected
  1807.   #-------------------------------------------------------------------------
  1808.   # * Aplica opções de fonte no bitmap
  1809.   #     b : Bitmap
  1810.   #-------------------------------------------------------------------------
  1811.   def applyFont(b)
  1812.     b.font.name    = MRM::ExtremeMenu::Font[:Name]
  1813.     b.font.size    = MRM::ExtremeMenu::Font[:Size]
  1814.     b.font.color   = Color.new(*MRM::ExtremeMenu::Font[:Color])
  1815.     b.font.shadow  = MRM::ExtremeMenu::Font[:Shadow]
  1816.     b.font.outline = MRM::ExtremeMenu::Font[:Outline]
  1817.     return b
  1818.   end
  1819. end
  1820.  
  1821. #==============================================================================
  1822. # ** Menu_Equips_Window
  1823. #------------------------------------------------------------------------------
  1824. #  Esta classe mostra as informações de um monstro
  1825. #==============================================================================
  1826. class Menu_Equips_Window < Menu_Base_Window
  1827.   attr_reader :index
  1828.   attr_reader :info
  1829.  
  1830.   #-------------------------------------------------------------------------
  1831.   # * Inícialização do objeto
  1832.   #     x     : Posição X inicial da janela
  1833.   #     y     : Posição Y inicial da janela
  1834.   #     w     : Largura
  1835.   #-------------------------------------------------------------------------
  1836.   def initialize(x, y, w)
  1837.     super(x, y, w, fitting_height(7))
  1838.     self.opacity          = 0
  1839.     self.contents_opacity = 0
  1840.     @actor                = nil
  1841.     @index                = 0
  1842.    
  1843.     vs = contents_height / 7.0
  1844.     @rect = Array.new(6){|i|
  1845.       Rect.new(0, (vs * i).round, contents_width, line_height)
  1846.     }
  1847.     @rect.last.y += vs
  1848.   end
  1849.   #--------------------------------------------------------------------------
  1850.   # * Define janela de informação
  1851.   #     win : Janela
  1852.   #--------------------------------------------------------------------------
  1853.   def info=(win)
  1854.     @info = win
  1855.   end
  1856.   #-------------------------------------------------------------------------
  1857.   # * Seleção do ator
  1858.   #   actor : Game_Actor da janela
  1859.   #-------------------------------------------------------------------------
  1860.   def actor=(actor)
  1861.     @actor = actor
  1862.     refresh
  1863.   end
  1864.   #-------------------------------------------------------------------------
  1865.   # * Determina estado de atividade
  1866.   #   state : Ativa ou não a janela
  1867.   #-------------------------------------------------------------------------
  1868.   def active=(state)
  1869.     @active = state
  1870.     self.cursor_rect.set(@active ? @rect[@index] : Rect.new)
  1871.   end
  1872.   #-------------------------------------------------------------------------
  1873.   # * Modificação do índice da janela
  1874.   #     value : Novo índice
  1875.   #-------------------------------------------------------------------------
  1876.   def index=(value)
  1877.     @index = value
  1878.     self.cursor_rect.set(@rect[@index])
  1879.     @info.item = @actor.equips[@index] if @info
  1880.   end
  1881.   #-------------------------------------------------------------------------
  1882.   # * Desenho do conteúdo
  1883.   #-------------------------------------------------------------------------
  1884.   def refresh
  1885.     contents.clear
  1886.     return unless @actor
  1887.     dy = 0
  1888.     @actor.equips.each_with_index{|item,index|
  1889.       if item
  1890.         draw_item_name(item, 0, dy, enable?(index), contents_width)
  1891.       else
  1892.         change_color(system_color)
  1893.         index = 0 if @actor.dual_wield? and index == 1
  1894.         draw_text(@rect[index], ::Vocab::etype(index).isoUpcase, 1)
  1895.         change_color(normal_color)
  1896.       end
  1897.       dy += line_height
  1898.     }
  1899.     draw_text(@rect.last, Vocab[:Optimize], 1)
  1900.   end
  1901.   #--------------------------------------------------------------------------
  1902.   # * Definição de habilitação do item
  1903.   #     item : item
  1904.   #--------------------------------------------------------------------------
  1905.   def enable?(index)
  1906.     @actor ? @actor.equip_change_ok?(index) : false
  1907.   end
  1908.   #--------------------------------------------------------------------------
  1909.   # * Desenho do nome de itens
  1910.   #     item    : objeto
  1911.   #     x       : coordenada X
  1912.   #     y       : coordenada Y
  1913.   #     enabled : habilitar flag, translucido quando false
  1914.   #     width   : largura
  1915.   #--------------------------------------------------------------------------
  1916.   def draw_item_name(item, x, y, enabled = true, width = 172)
  1917.     return unless item
  1918.     draw_icon(item.icon_index, x, y, enabled)
  1919.     change_color(normal_color, enabled)
  1920.     draw_text(x, y, width, line_height, item.name, 1)
  1921.   end
  1922. end
  1923.  
  1924.  
  1925. #==============================================================================
  1926. # ** Menu_SkillCommand_Window
  1927. #------------------------------------------------------------------------------
  1928. #  Esta janela exibe a lista de comandos para tela de habilidades
  1929. # (como habilidades especiais e magias).
  1930. #==============================================================================
  1931.  
  1932. class Menu_SkillCommand_Window < Window_Command
  1933.   #--------------------------------------------------------------------------
  1934.   # * Variáveis públicas
  1935.   #--------------------------------------------------------------------------
  1936.   attr_reader   :skill_window
  1937.   #--------------------------------------------------------------------------
  1938.   # * Inicialização do objeto
  1939.   #     x      : Coordenada X
  1940.   #     y      : Coordenada Y
  1941.   #     w      : Largura
  1942.   #     h      : Altura
  1943.   #--------------------------------------------------------------------------
  1944.   def initialize(x, y, w, h)
  1945.     @width, @height = w, h
  1946.     super(x, y)
  1947.     self.opacity = 0
  1948.     self.active  = false
  1949.     @actor = nil
  1950.   end
  1951.   #--------------------------------------------------------------------------
  1952.   # * Aquisição da largura da janela
  1953.   #--------------------------------------------------------------------------
  1954.   def window_width
  1955.     @width
  1956.   end
  1957.   #--------------------------------------------------------------------------
  1958.   # * Aquisição da altura da janela
  1959.   #--------------------------------------------------------------------------
  1960.   def window_height
  1961.     @height
  1962.   end
  1963.   #--------------------------------------------------------------------------
  1964.   # * Definição de resultado ao pressionar o botão de confirmação
  1965.   #--------------------------------------------------------------------------
  1966.   def process_ok
  1967.   end
  1968.   #--------------------------------------------------------------------------
  1969.   # * Alinhamento do texto
  1970.   #--------------------------------------------------------------------------
  1971.   def alignment
  1972.     return 1
  1973.   end
  1974.   #--------------------------------------------------------------------------
  1975.   # * Definição de herói
  1976.   #     actor : herói
  1977.   #--------------------------------------------------------------------------
  1978.   def actor=(actor)
  1979.     return if @actor == actor
  1980.     @actor = actor
  1981.     refresh
  1982.   end
  1983.   #--------------------------------------------------------------------------
  1984.   # * Criação da lista de comandos
  1985.   #--------------------------------------------------------------------------
  1986.   def make_command_list
  1987.     return unless @actor
  1988.     @actor.added_skill_types.sort.each do |stype_id|
  1989.       name = $data_system.skill_types[stype_id]
  1990.       add_command(name, :skill, true, stype_id)
  1991.     end
  1992.   end
  1993.   #--------------------------------------------------------------------------
  1994.   # * Atualização da tela
  1995.   #--------------------------------------------------------------------------
  1996.   def update
  1997.     super
  1998.     @skill_window.stype_id = current_ext if @skill_window
  1999.   end
  2000.   #--------------------------------------------------------------------------
  2001.   # * Definição da janela de habilidades
  2002.   #     skill_window : janela de habilidades
  2003.   #--------------------------------------------------------------------------
  2004.   def skill_window=(skill_window)
  2005.     @skill_window = skill_window
  2006.     update
  2007.   end
  2008.   #--------------------------------------------------------------------------
  2009.   # * Criação do conteúdo das janelas
  2010.   #--------------------------------------------------------------------------
  2011.   def create_contents(*args, &block)
  2012.     super(*args, &block)
  2013.     self.applyFont(contents)
  2014.   end
  2015.  
  2016.   protected
  2017.   #-------------------------------------------------------------------------
  2018.   # * Aplica opções de fonte no bitmap
  2019.   #     b : Bitmap
  2020.   #-------------------------------------------------------------------------
  2021.   def applyFont(b)
  2022.     b.font.name    = MRM::ExtremeMenu::Font[:Name]
  2023.     b.font.size    = MRM::ExtremeMenu::Font[:Size]
  2024.     b.font.color   = Color.new(*MRM::ExtremeMenu::Font[:Color])
  2025.     b.font.shadow  = MRM::ExtremeMenu::Font[:Shadow]
  2026.     b.font.outline = MRM::ExtremeMenu::Font[:Outline]
  2027.     return b
  2028.   end
  2029. end
  2030.  
  2031.  
  2032. #==============================================================================
  2033. # ** Menu_SkillList_Window
  2034. #------------------------------------------------------------------------------
  2035. #  Esta janela exibe uma lista de habilidades usáveis na tela de habilidades.
  2036. #==============================================================================
  2037.  
  2038. class Menu_SkillList_Window < Window_Command
  2039.   #--------------------------------------------------------------------------
  2040.   # * Inicialização do objeto
  2041.   #     x : Coordenada X
  2042.   #     y : Coordenada Y
  2043.   #     w : Largura
  2044.   #     h : Altura
  2045.   #--------------------------------------------------------------------------
  2046.   def initialize(x, y, w, h)
  2047.     @width, @height = w, h
  2048.     super(x, y)
  2049.     self.opacity = 0
  2050.     self.active  = false
  2051.     @actor = nil
  2052.     @stype_id = 0
  2053.     @data = []
  2054.   end
  2055.   #--------------------------------------------------------------------------
  2056.   # * Aquisição da largura da janela
  2057.   #--------------------------------------------------------------------------
  2058.   def window_width
  2059.     @width
  2060.   end
  2061.   #--------------------------------------------------------------------------
  2062.   # * Aquisição da altura da janela
  2063.   #--------------------------------------------------------------------------
  2064.   def window_height
  2065.     @height
  2066.   end
  2067.   #--------------------------------------------------------------------------
  2068.   # * Atualização do cursor
  2069.   #     *args // &block : Argumentos
  2070.   #--------------------------------------------------------------------------
  2071.   def update_cursor(*args, &block)
  2072.     super(*args, &block)
  2073.     @info.item = @data[index] if @data && @info
  2074.   end
  2075.   #--------------------------------------------------------------------------
  2076.   # * Definição de resultado ao pressionar o botão de confirmação
  2077.   #--------------------------------------------------------------------------
  2078.   def process_ok
  2079.   end
  2080.   #--------------------------------------------------------------------------
  2081.   # * Define janela de informação
  2082.   #     win : Janela
  2083.   #--------------------------------------------------------------------------
  2084.   def info=(win)
  2085.     @info = win
  2086.     win.item = @data[index] if @data
  2087.   end
  2088.   #--------------------------------------------------------------------------
  2089.   # * Máximo de itens desenhados
  2090.   #--------------------------------------------------------------------------
  2091.   def item_max
  2092.     @data ? @data.size : 0
  2093.   end
  2094.   #--------------------------------------------------------------------------
  2095.   # * Definição de herói
  2096.   #     actor : herói
  2097.   #--------------------------------------------------------------------------
  2098.   def actor=(actor)
  2099.     return if @actor == actor
  2100.     @actor = actor
  2101.     refresh
  2102.     self.oy = 0
  2103.   end
  2104.   #--------------------------------------------------------------------------
  2105.   # * Definição da ID do tipo de habilidade
  2106.   #     stype_id : ID do tipo de habilidade
  2107.   #--------------------------------------------------------------------------
  2108.   def stype_id=(stype_id)
  2109.     return if @stype_id == stype_id
  2110.     @stype_id = stype_id
  2111.     refresh
  2112.     self.oy = 0
  2113.   end
  2114.   #--------------------------------------------------------------------------
  2115.   # * Aquisição das informações da skill
  2116.   #--------------------------------------------------------------------------
  2117.   def item
  2118.     @data && index >= 0 ? @data[index] : nil
  2119.   end
  2120.   #--------------------------------------------------------------------------
  2121.   # * Definição de habilitação de seleção
  2122.   #--------------------------------------------------------------------------
  2123.   def current_item_enabled?
  2124.     enable?(@data[index])
  2125.   end
  2126.   #--------------------------------------------------------------------------
  2127.   # * Inclusão do item na lista
  2128.   #     item : item
  2129.   #--------------------------------------------------------------------------
  2130.   def include?(item)
  2131.     item && item.stype_id == @stype_id
  2132.   end
  2133.   #--------------------------------------------------------------------------
  2134.   # * Definição de habilitação do item
  2135.   #     item : item
  2136.   #--------------------------------------------------------------------------
  2137.   def enable?(item)
  2138.     @actor && @actor.usable?(item)
  2139.   end
  2140.   #--------------------------------------------------------------------------
  2141.   # * Criação da lista de itens
  2142.   #--------------------------------------------------------------------------
  2143.   def make_item_list
  2144.     @data = @actor ? @actor.skills.select {|skill| include?(skill) } : []
  2145.   end
  2146.   #--------------------------------------------------------------------------
  2147.   # * Desenho de um item
  2148.   #     index : índice do item
  2149.   #--------------------------------------------------------------------------
  2150.   def draw_item(index)
  2151.     skill = @data[index]
  2152.     if skill
  2153.       rect = item_rect(index)
  2154.       rect.width -= 4
  2155.       draw_item_name(skill, rect.x, rect.y, enable?(skill))
  2156.       draw_skill_cost(rect, skill)
  2157.     end
  2158.   end
  2159.   #--------------------------------------------------------------------------
  2160.   # * Desenho do custo das habilidades
  2161.   #     rect  : retângulo
  2162.   #     skill : habilidade
  2163.   #--------------------------------------------------------------------------
  2164.   def draw_skill_cost(rect, skill)
  2165.     if @actor.skill_tp_cost(skill) > 0
  2166.       change_color(tp_cost_color, enable?(skill))
  2167.       draw_text(rect, @actor.skill_tp_cost(skill), 2)
  2168.     elsif @actor.skill_mp_cost(skill) > 0
  2169.       change_color(mp_cost_color, enable?(skill))
  2170.       draw_text(rect, @actor.skill_mp_cost(skill), 2)
  2171.     end
  2172.   end
  2173.   #--------------------------------------------------------------------------
  2174.   # * Renovação
  2175.   #--------------------------------------------------------------------------
  2176.   def refresh
  2177.     make_item_list
  2178.     create_contents
  2179.     draw_all_items
  2180.   end
  2181.   #--------------------------------------------------------------------------
  2182.   # * Criação do conteúdo das janelas
  2183.   #--------------------------------------------------------------------------
  2184.   def create_contents(*args, &block)
  2185.     super(*args, &block)
  2186.     self.applyFont(contents)
  2187.   end
  2188.  
  2189.   protected
  2190.   #-------------------------------------------------------------------------
  2191.   # * Aplica opções de fonte no bitmap
  2192.   #     b : Bitmap
  2193.   #-------------------------------------------------------------------------
  2194.   def applyFont(b)
  2195.     b.font.name    = MRM::ExtremeMenu::Font[:Name]
  2196.     b.font.size    = MRM::ExtremeMenu::Font[:Size]
  2197.     b.font.color   = Color.new(*MRM::ExtremeMenu::Font[:Color])
  2198.     b.font.shadow  = MRM::ExtremeMenu::Font[:Shadow]
  2199.     b.font.outline = MRM::ExtremeMenu::Font[:Outline]
  2200.     return b
  2201.   end
  2202. end
  2203.  
  2204. #==============================================================================
  2205. # ** Menu_ActorBase_Window
  2206. #------------------------------------------------------------------------------
  2207. #  Esta classe mostra as informações simples do ator
  2208. #==============================================================================
  2209. class Menu_ActorBase_Window < Menu_Base_Window
  2210.   #-------------------------------------------------------------------------
  2211.   # * Inícialização do objeto
  2212.   #     actor : Ator
  2213.   #     x     : Posição X inicial da janela
  2214.   #     y     : Posição Y inicial da janela
  2215.   #     w     : Largura
  2216.   #     h     : Altura
  2217.   #-------------------------------------------------------------------------
  2218.   def initialize(actor, x, y, w, h)
  2219.     super(x, y, w, h)
  2220.     self.opacity          = 0
  2221.     self.contents_opacity = 0
  2222.     self.actor = actor
  2223.   end
  2224.   #-------------------------------------------------------------------------
  2225.   # * Seleção do ator
  2226.   #   actor : Game_Actor da janela
  2227.   #-------------------------------------------------------------------------
  2228.   def actor=(actor)
  2229.     @actor = actor
  2230.    
  2231.     @charBitmap = Cache.character(@actor.character_name)
  2232.    
  2233.     sign = @actor.character_name[/^[\!\$]./]
  2234.     if sign && sign.include?('$')
  2235.       @cw = @charBitmap.width / 3
  2236.       @ch = @charBitmap.height / 4
  2237.     else
  2238.       @cw = @charBitmap.width / 12
  2239.       @ch = @charBitmap.height / 8
  2240.     end
  2241.      
  2242.     @pattern = 1
  2243.    
  2244.     refresh
  2245.   end
  2246.   #-------------------------------------------------------------------------
  2247.   # * Desenho do conteúdo
  2248.   #-------------------------------------------------------------------------
  2249.   def refresh
  2250.     half_width = contents.width/2
  2251.    
  2252.     contents.clear
  2253.     # FACE
  2254.     draw_actor_face(@actor, half_width - 48, line_height * 2)
  2255.     # NOME
  2256.     change_color(hp_color(@actor))
  2257.     draw_text(0, 0, contents_width, line_height, @actor.name, 1)
  2258.     # LINHA HORIZONTAL
  2259.     draw_horz_line(line_height * 1)
  2260.     # LINHA HORIZONTAL
  2261.     draw_horz_line(line_height * 6)
  2262.     # LEVEL
  2263.     rect = Rect.new(half_width - 44, line_height * 7, 88, line_height)
  2264.     change_color(system_color)
  2265.     draw_text(rect, ::Vocab::level_a)
  2266.     change_color(normal_color)
  2267.     draw_text(rect, @actor.level, 2)
  2268.     # ÍCONES
  2269.     icons = (@actor.state_icons + @actor.buff_icons)[0, contents_width / 24]
  2270.     bx    = half_width - (icons.size * 12)
  2271.     icons.each_with_index{|n, i| draw_icon(n, bx + 24 * i, line_height * 8) }
  2272.     # HP
  2273.     draw_actor_hp(@actor, 3, line_height * 10, contents_width - 6)
  2274.     # MP
  2275.     draw_actor_mp(@actor, 3, line_height * 11, contents_width - 6)
  2276.   end
  2277.   #-------------------------------------------------------------------------
  2278.   # * Determina estado de atividade
  2279.   #   state : Ativa ou não a janela
  2280.   #-------------------------------------------------------------------------
  2281.   def active=(state)
  2282.     @active = state
  2283.     self.cursor_rect.set(@active ? contents.rect : Rect.new)
  2284.   end
  2285. end
  2286.  
  2287. #==============================================================================
  2288. # ** Menu_Formation_Window
  2289. #------------------------------------------------------------------------------
  2290. # Exibe informações do personagem para 'cena' de formação
  2291. #==============================================================================
  2292. class Menu_Formation_Window < Menu_ActorBase_Window
  2293.   #-------------------------------------------------------------------------
  2294.   # * Desenho do conteúdo
  2295.   #-------------------------------------------------------------------------
  2296.   def refresh
  2297.     contents.clear
  2298.     half_height = contents_height / 2
  2299.    
  2300.     # FACE
  2301.     draw_actor_face(@actor, 4, half_height - 48)
  2302.     # NOME
  2303.     change_color(hp_color(@actor))
  2304.     draw_text(156, 0, contents_width - 156, line_height, @actor.name, 0)
  2305.     # LINHA HORIZONTAL
  2306.     draw_horz_line(line_height / 2 - 4)
  2307.     # LEVEL
  2308.     rect = Rect.new(156, line_height * 2.5, 88, line_height)
  2309.     change_color(system_color)
  2310.     draw_text(rect, ::Vocab::level_a)
  2311.     change_color(normal_color)
  2312.     draw_text(rect, @actor.level, 2)
  2313.     # ÍCONES
  2314.     states  = (@actor.state_icons + @actor.buff_icons)
  2315.     num     = (contents_width - 260) / 24
  2316.     [
  2317.       states[  0, num],
  2318.       states[num, num]
  2319.     ].each_with_index{|icons, i|
  2320.       next unless icons
  2321.       icons.each_with_index{|n, j|
  2322.         draw_icon(n, 260 + 24 * j, line_height + i * 26)
  2323.       }
  2324.     }
  2325.     # HP
  2326.     draw_actor_hp(@actor, 156, line_height * 0.75, 100)
  2327.     # MP
  2328.     draw_actor_mp(@actor, 156, line_height * 1.65, 100)
  2329.   end
  2330. end
  2331.  
  2332. #==============================================================================
  2333. # ** Menu_ActorSelect_Window
  2334. #------------------------------------------------------------------------------
  2335. #  Janela que exibe a face dos atores para seleção
  2336. #==============================================================================
  2337. class Menu_ActorSelect_Window < Menu_Base_Window
  2338.   attr_reader :faces
  2339.   attr_reader :index
  2340.  
  2341.   #-------------------------------------------------------------------------
  2342.   # * Inícialização do objeto
  2343.   #     actor : Ator
  2344.   #     x     : Posição X inicial da janela
  2345.   #     y     : Posição Y inicial da janela
  2346.   #     w     : Largura
  2347.   #     h     : Altura
  2348.   #-------------------------------------------------------------------------
  2349.   def initialize(x, y, w, h)
  2350.     super(x, y, w, h)
  2351.     self.opacity = 0
  2352.     @faces = []
  2353.     @index = 0
  2354.   end
  2355.   #-------------------------------------------------------------------------
  2356.   # * Retorna o ator selecionado
  2357.   #-------------------------------------------------------------------------
  2358.   def actor
  2359.     @faces[@index]
  2360.   end
  2361.   #-------------------------------------------------------------------------
  2362.   # * Índice máximo
  2363.   #-------------------------------------------------------------------------
  2364.   def maxIndex
  2365.     @faces.size
  2366.   end
  2367.   #-------------------------------------------------------------------------
  2368.   # * Modificação do índice da janela
  2369.   #     value : Novo índice
  2370.   #-------------------------------------------------------------------------
  2371.   def index=(value)
  2372.     @index = value % @faces.size
  2373.   end
  2374.   #-------------------------------------------------------------------------
  2375.   # * Ajuste do cursor de acordo com a posição ox
  2376.   #     value : Nova posição ox
  2377.   #-------------------------------------------------------------------------
  2378.   def ox=(value)
  2379.     super(value)
  2380.     self.cursor_rect.x = value
  2381.   end
  2382.   #-------------------------------------------------------------------------
  2383.   # * Posição ox correta (para animação)
  2384.   #-------------------------------------------------------------------------
  2385.   def trueOx
  2386.     @index * (standard_padding + 96)
  2387.   end
  2388.   #-------------------------------------------------------------------------
  2389.   # * Modificação das faces
  2390.   #     nfs : Novas faces
  2391.   #-------------------------------------------------------------------------
  2392.   def faces=(value)
  2393.     @faces = value
  2394.     self.index = @index
  2395.     contents.dispose
  2396.     self.contents = Bitmap.new(
  2397.       @faces.size * (96 + standard_padding) - standard_padding,
  2398.       contents_height
  2399.     )
  2400.     self.applyFont(contents)
  2401.     refresh
  2402.   end
  2403.   #-------------------------------------------------------------------------
  2404.   # * Determina se a janela está ou não ativa
  2405.   #     value : Atividade
  2406.   #-------------------------------------------------------------------------
  2407.   def active=(value)
  2408.     @active = value
  2409.     rect = contents.rect
  2410.     rect.x += 1
  2411.     rect.width = width - 2 * standard_padding - 2
  2412.     self.cursor_rect.set(@active ? rect : Rect.new)
  2413.   end
  2414.   #-------------------------------------------------------------------------
  2415.   # * Desenho da janela
  2416.   #-------------------------------------------------------------------------
  2417.   def refresh
  2418.     self.contents.clear
  2419.     faceW = 96 + standard_padding
  2420.     ax    = (contents_width  - 96) / 2 - faceW
  2421.     ay    = (contents_height - 96) / 2
  2422.     @faces.each{|actor| draw_actor_face(actor, ax += faceW, ay) }
  2423.   end
  2424. end
  2425.  
  2426. #==============================================================================
  2427. # ** Menu_ActorFull_Window
  2428. #------------------------------------------------------------------------------
  2429. #  Esta janela exibe as especificações completas na janela de atributos.
  2430. #==============================================================================
  2431. class Menu_ActorFull_Window < Menu_Base_Window
  2432.   #-------------------------------------------------------------------------
  2433.   # * Início
  2434.   #     actor : Ator
  2435.   #     x     : Posição X inicial da janela
  2436.   #     y     : Posição Y inicial da janela
  2437.   #     w     : Largura
  2438.   #     h     : Altura
  2439.   #-------------------------------------------------------------------------
  2440.   def initialize(actor, x, y, w, h)
  2441.     super(x, y, w, h)
  2442.     self.opacity = 0
  2443.     @actor = actor
  2444.   end
  2445.   #--------------------------------------------------------------------------
  2446.   # * Definição de herói
  2447.   #     actor : herói
  2448.   #--------------------------------------------------------------------------
  2449.   def actor=(actor)
  2450.     return if @actor == actor
  2451.     @actor = actor
  2452.     refresh
  2453.   end
  2454.   #--------------------------------------------------------------------------
  2455.   # * Renovação
  2456.   #--------------------------------------------------------------------------
  2457.   def refresh
  2458.     contents.clear
  2459.     draw_block1   (line_height * 0)
  2460.     draw_horz_line(line_height * 1)
  2461.     draw_block2   (line_height * 2)
  2462.     draw_horz_line(line_height * 6)
  2463.     draw_block3   (line_height * 7)
  2464.   end
  2465.   #--------------------------------------------------------------------------
  2466.   # * Desenho do bloco 1
  2467.   #     y : coordenada Y
  2468.   #--------------------------------------------------------------------------
  2469.   def draw_block1(y)
  2470.     draw_actor_name(@actor, 4, y)
  2471.     draw_actor_class(@actor, 128, y)
  2472.     draw_actor_nickname(@actor, 288, y)
  2473.   end
  2474.   #--------------------------------------------------------------------------
  2475.   # * Desenho do bloco 1
  2476.   #     y : coordenada Y
  2477.   #--------------------------------------------------------------------------
  2478.   def draw_block2(y)
  2479.     draw_actor_face(@actor, 8, y)
  2480.     draw_basic_info(136, y)
  2481.     draw_exp_info(304, y)
  2482.   end
  2483.   #--------------------------------------------------------------------------
  2484.   # * Desenho do bloco 3
  2485.   #     y : coordenada Y
  2486.   #--------------------------------------------------------------------------
  2487.   def draw_block3(y)
  2488.     draw_parameters(32, y)
  2489.     draw_equipments(288, y)
  2490.   end
  2491.   #--------------------------------------------------------------------------
  2492.   # * Desenho das informações básicas
  2493.   #     x : coordenada X
  2494.   #     y : coordenada Y
  2495.   #--------------------------------------------------------------------------
  2496.   def draw_basic_info(x, y)
  2497.     draw_actor_level(@actor, x, y + line_height * 0)
  2498.     draw_actor_icons(@actor, x, y + line_height * 1)
  2499.     draw_actor_hp(@actor, x, y + line_height * 2)
  2500.     draw_actor_mp(@actor, x, y + line_height * 3)
  2501.   end
  2502.   #--------------------------------------------------------------------------
  2503.   # * Desenho dos parâmetros
  2504.   #     x : coordenada X
  2505.   #     y : coordenada Y
  2506.   #--------------------------------------------------------------------------
  2507.   def draw_parameters(x, y)
  2508.     6.times {|i| draw_actor_param(@actor, x, y + line_height * i, i + 2) }
  2509.   end
  2510.   #--------------------------------------------------------------------------
  2511.   # * Desenho das informações de experiência
  2512.   #     x : coordenada X
  2513.   #     y : coordenada Y
  2514.   #--------------------------------------------------------------------------
  2515.   def draw_exp_info(x, y)
  2516.     s1 = @actor.max_level? ? "-------" : @actor.exp
  2517.     s2 = @actor.max_level? ? "-------" : @actor.next_level_exp - @actor.exp
  2518.     s_next = sprintf(::Vocab::ExpNext, ::Vocab::level)
  2519.     change_color(system_color)
  2520.     draw_text(x, y + line_height * 0, 180, line_height, ::Vocab::ExpTotal)
  2521.     draw_text(x, y + line_height * 2, 180, line_height, s_next)
  2522.     change_color(normal_color)
  2523.     draw_text(x, y + line_height * 1, 180, line_height, s1, 2)
  2524.     draw_text(x, y + line_height * 3, 180, line_height, s2, 2)
  2525.   end
  2526.   #--------------------------------------------------------------------------
  2527.   # * Desenho dos equipamentos
  2528.   #     x : coordenada X
  2529.   #     y : coordenada Y
  2530.   #--------------------------------------------------------------------------
  2531.   def draw_equipments(x, y)
  2532.     @actor.equips.each_with_index do |item, i|
  2533.       draw_item_name(item, x, y + line_height * i)
  2534.     end
  2535.   end
  2536.   #--------------------------------------------------------------------------
  2537.   # * Desenho da descrição
  2538.   #     x : coordenada X
  2539.   #     y : coordenada Y
  2540.   #--------------------------------------------------------------------------
  2541.   def draw_description(x, y)
  2542.     draw_text_ex(x, y, @actor.description)
  2543.   end
  2544. end
  2545.  
  2546. #==============================================================================
  2547. # ** Menu_PDist_Window
  2548. #------------------------------------------------------------------------------
  2549. #  Esta janela exibe os pontos e controla a adição de novos pontos de atribu-
  2550. #  tos aos atores.
  2551. #==============================================================================
  2552. class Menu_PDist_Window < Menu_ActorFull_Window
  2553.   attr_reader :actor
  2554.   attr_reader :index
  2555.   attr_reader :active
  2556.   attr_reader :drawn
  2557.   #-------------------------------------------------------------------------
  2558.   # * Início
  2559.   #     actor : Ator
  2560.   #     x     : Posição X inicial da janela
  2561.   #     y     : Posição Y inicial da janela
  2562.   #     w     : Largura
  2563.   #     h     : Altura
  2564.   #-------------------------------------------------------------------------
  2565.   def initialize(actor, x, y, w, h)
  2566.     @index  = 0
  2567.     @active = false
  2568.     @drawn  = false
  2569.     ay = line_height
  2570.     @rects  = Array.new(8){|i|
  2571.       Rect.new(300, ay += line_height, 171, line_height)
  2572.     }
  2573.     @actorSheet = actor.pointsSheet
  2574.     super(actor, x, y, w, h)
  2575.   end
  2576.   #--------------------------------------------------------------------------
  2577.   # * Redesenho da janela
  2578.   #--------------------------------------------------------------------------
  2579.   def refresh
  2580.     super
  2581.     @drawn = true
  2582.   end
  2583.   #--------------------------------------------------------------------------
  2584.   # * Definição de atividade de janela
  2585.   #     value : Novo valor
  2586.   #--------------------------------------------------------------------------
  2587.   def active=(value)
  2588.     @active = value
  2589.     if @active
  2590.       self.cursor_rect.set(@rects[@index])
  2591.     else
  2592.       self.cursor_rect.set(0, 0, 0, 0)
  2593.     end
  2594.   end
  2595.   #--------------------------------------------------------------------------
  2596.   # * Definição do índice da janela
  2597.   #     value : Novo valor
  2598.   #--------------------------------------------------------------------------
  2599.   def index=(value)
  2600.     @index = value
  2601.     self.cursor_rect.set(@rects[@index])
  2602.     refresh
  2603.   end
  2604.   #--------------------------------------------------------------------------
  2605.   # * Desenho dos parâmetros
  2606.   #     x : coordenada X
  2607.   #     y : coordenada Y
  2608.   #--------------------------------------------------------------------------
  2609.   def draw_parameters(x, y)
  2610.     8.times {|i| draw_actor_param(@actor, x, y + line_height * i, i) }
  2611.   end
  2612.   #--------------------------------------------------------------------------
  2613.   # * Desenho do bloco 2
  2614.   #     y : coordenada Y
  2615.   #--------------------------------------------------------------------------
  2616.   def draw_block2(y)
  2617.     draw_actor_face(@actor, 8, y)
  2618.     draw_basic_info(136, y)
  2619.     draw_parameters(304, y)
  2620.   end
  2621.   #--------------------------------------------------------------------------
  2622.   # * Desenho do bloco 3
  2623.   #     y : coordenada Y
  2624.   #--------------------------------------------------------------------------
  2625.   def draw_block3(y)
  2626.     draw_actor_sheetInfo(32, y)
  2627.   end
  2628.   #--------------------------------------------------------------------------
  2629.   # * Desenho dos parâmetros
  2630.   #     actor : herói
  2631.   #     x     : coordenada X
  2632.   #     y     : coordenada Y
  2633.   #--------------------------------------------------------------------------
  2634.   def draw_actor_param(actor, x, y, param_id)
  2635.     plus = actor.param_plus(param_id)
  2636.    
  2637.     change_color(system_color)
  2638.     draw_text(x, y, 120, line_height, ::Vocab::param(param_id))
  2639.     change_color(normal_color)
  2640.     draw_text(x + 90, y, 36, line_height, actor.param(param_id) - plus, 2)
  2641.    
  2642.     if plus >= 0
  2643.       clr = plus == 0 ? normal_color : power_up_color
  2644.       sym = "+"
  2645.     elsif plus < 0
  2646.       clr = power_down_color
  2647.       sym = "-"
  2648.     end
  2649.    
  2650.     change_color(clr)
  2651.     draw_text(x + 132, y, 10, line_height, sym, 1)
  2652.     draw_text(x + 142, y, 23, line_height, actor.param_plus(param_id).abs, 2)
  2653.    
  2654.     change_color(normal_color)
  2655.   end
  2656.   #--------------------------------------------------------------------------
  2657.   # * Desenha mensagem de distribuição de pontos
  2658.   #     x     : coordenada X
  2659.   #     y     : coordenada Y
  2660.   #--------------------------------------------------------------------------
  2661.   def draw_actor_sheetInfo(x, y)
  2662.     PDistDiag.each_with_index{|line, i|
  2663.       draw_text_ex(x, y + line_height * i, parseDiag(line))
  2664.     }
  2665.   end
  2666.   #--------------------------------------------------------------------------
  2667.   # * Desenho de uma linha horzontal
  2668.   #--------------------------------------------------------------------------
  2669.   def draw_horz_line(y)
  2670.     line_y = y + line_height / 2 - 1
  2671.     color = normal_color
  2672.     color.alpha = 48
  2673.     contents.fill_rect(0, line_y, 275, 2, color)
  2674.   end
  2675.   #--------------------------------------------------------------------------
  2676.   # * Desenho do texto com caracteres de controle
  2677.   #     x    : coordenada X
  2678.   #     y    : coordenada Y
  2679.   #     text : string de texto
  2680.   #--------------------------------------------------------------------------
  2681.   def draw_text_ex(x, y, text)
  2682.     text = convert_escape_characters(text)
  2683.     pos = {x: x, y: y, new_x: x, height: calc_line_height(text)}
  2684.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  2685.   end
  2686.  
  2687.   protected
  2688.   #--------------------------------------------------------------------------
  2689.   # * Trata a linha para substituir as informações do ator
  2690.   #     line : String
  2691.   #--------------------------------------------------------------------------
  2692.   def parseDiag(line)
  2693.     paramSym = @actorSheet.keys[@index + 1]
  2694.  
  2695.     line
  2696.       .gsub("{actorName}"  , @actor.name)
  2697.       .gsub("{actorPoints}", @actor.attrPoints.to_s)
  2698.       .gsub("{attrName}",    ::Vocab::param(@index))
  2699.       .gsub("{attrNPoints}", @actorSheet[paramSym].first.to_s)
  2700.       .gsub("{attrGPoints}", @actorSheet[paramSym].last.to_s)
  2701.   end
  2702. end
  2703.  
  2704. #==============================================================================
  2705. # ** Menu_MonsterList_Window
  2706. #------------------------------------------------------------------------------
  2707. # Janela que mostra informações de monstros descobertos
  2708. #==============================================================================
  2709. class Menu_MonsterList_Window < Menu_Base_Window
  2710.  
  2711.   attr_reader :columns
  2712.   attr_reader :index
  2713.   attr_reader :rowMax
  2714.  
  2715.   #-------------------------------------------------------------------------
  2716.   # * Inicialização
  2717.   #     monsters : Lista de Monstros
  2718.   #     x        : Posição X inicial da janela
  2719.   #     y        : Posição Y inicial da janela
  2720.   #     w        : Largura
  2721.   #     h        : Altura
  2722.   #-------------------------------------------------------------------------
  2723.   def initialize(monsters, x, y, w, h)
  2724.     super(x, y, w, h)
  2725.     self.opacity = 0
  2726.     @rects    = []
  2727.     @columns  = 3
  2728.     @monsters = monsters
  2729.     @index    = 0
  2730.     @rowMax   = 1
  2731.     refresh
  2732.   end
  2733.   #-------------------------------------------------------------------------
  2734.   # * Define atividade da janela
  2735.   #     value : Nova definição
  2736.   #-------------------------------------------------------------------------
  2737.   def active=(value)
  2738.     @active = value
  2739.     if @active
  2740.       self.cursor_rect.set(@rects[@index])
  2741.     else
  2742.       self.cursor_rect.set(0,0,0,0)
  2743.     end
  2744.   end
  2745.   #-------------------------------------------------------------------------
  2746.   # * Define índice
  2747.   #     value : Novo índice
  2748.   #-------------------------------------------------------------------------
  2749.   def index=(value)
  2750.     @index = value
  2751.     self.cursor_rect.set(@rects[@index])
  2752.   end
  2753.   #-------------------------------------------------------------------------
  2754.   # Desenho da janela
  2755.   #-------------------------------------------------------------------------
  2756.   def refresh
  2757.     contents.clear
  2758.     monsters    = $data_enemies
  2759.    
  2760.     rate = (@monsters.size.to_f / (monsters.size - 1))
  2761.     text = Vocab[:BComplete].gsub("{c}", (100 * rate).round(1).to_s)
  2762.    
  2763.     gc1 = Color.new( 80 * rate, 14 * rate,  80 - 24 * rate, 192)
  2764.     gc2 = Color.new(240 * rate, 62 * rate, 240 - 72 * rate, 192)
  2765.     draw_special_gauge(0, 0, contents_width, rate, gc1, gc2)    
  2766.    
  2767.     draw_text(0, 0, contents_width, line_height, text, 1)
  2768.    
  2769.     x, y, i, cw = 0, line_height * 1.5, 0, contents_width / @columns
  2770.     @monsters.each_with_index{|id, index|
  2771.       @rects << Rect.new(x, y, cw, line_height)
  2772.      
  2773.       draw_text(x + 4, y, cw - 8, line_height, "#{index + 1}.")
  2774.       draw_text(@rects.last, monsters[id].name, 1)
  2775.      
  2776.       x += cw
  2777.       if (i += 1) == @columns
  2778.         i = x = 0
  2779.         y += line_height
  2780.       end
  2781.     }
  2782.    
  2783.     @rowMax = @monsters.size / @columns
  2784.   end
  2785. end
  2786.  
  2787. #==============================================================================
  2788. # ** Menu_Monster_Window
  2789. #------------------------------------------------------------------------------
  2790. #  Esta classe mostra as informações de um monstro
  2791. #==============================================================================
  2792. class Menu_Monster_Window < Menu_Base_Window
  2793.   attr_reader :monster
  2794.   #-------------------------------------------------------------------------
  2795.   # * Inicialização
  2796.   #     monster : Monstro (RPG::Enemy)
  2797.   #     x       : Posição X inicial da janela
  2798.   #     y       : Posição Y inicial da janela
  2799.   #     w       : Largura
  2800.   #     h       : Altura
  2801.   #-------------------------------------------------------------------------
  2802.   def initialize(monster, x, y, w, h)
  2803.     super(x, y, w, h)
  2804.     self.applyFont(self.contents)
  2805.     self.opacity = 0
  2806.    
  2807.     @fill = Bitmap.new(276, contents_height)
  2808.     @fill.fill_rect(@fill.rect, Color.new(0, 0, 0, 127))
  2809.    
  2810.     self.monster = monster
  2811.   end
  2812.   #-------------------------------------------------------------------------
  2813.   # * Determina inimigo que deverá ser mostrado
  2814.   #     monster : Novo inimigo (RPG::Enemy)
  2815.   #-------------------------------------------------------------------------
  2816.   def monster=(monster)
  2817.     @monster = monster
  2818.     return unless @monster
  2819.     @battler = Cache.battler(@monster.battler_name, @monster.battler_hue)
  2820.     refresh
  2821.   end
  2822.   #-------------------------------------------------------------------------
  2823.   # Desenho da janela
  2824.   #-------------------------------------------------------------------------
  2825.   def refresh
  2826.     contents.clear
  2827.    
  2828.     contents.blt(
  2829.       contents_width - @battler.width,
  2830.       contents_height - @battler.height,
  2831.       @battler, @battler.rect
  2832.     )
  2833.     contents.blt(0, 0, @fill, @fill.rect)
  2834.    
  2835.     lh = line_height
  2836.     ay = lh * 4
  2837.    
  2838.     change_color(system_color)
  2839.     draw_text(6, 0, 124, line_height, @monster.name, 1)
  2840.     draw_text(6, ay += lh, 124, line_height, Vocab[:Experience])
  2841.     draw_text(6, ay += lh + lh, 124, line_height, Vocab[:Loot], 1)
  2842.     change_color(normal_color)
  2843.    
  2844.     ay = lh
  2845.    
  2846.     draw_hp(6, ay += lh)
  2847.     draw_mp(6, ay += lh)
  2848.     draw_text(6, ay += lh * 2, 124, line_height, @monster.exp, 2)
  2849.     ay += lh * 2
  2850.    
  2851.     draw_icon(Icon[:Gold], 6, ay += lh)
  2852.     draw_text(30, ay, 80, line_height, @monster.gold, 1)
  2853.    
  2854.     if @monster.drop_items.any?{|item| item.kind != 0}
  2855.       @monster.drop_items.each{|item|
  2856.         next if item.kind.zero?
  2857.         draw_item_name(item_object(item.kind, item.data_id), 6, ay += lh)
  2858.       }
  2859.     end
  2860.    
  2861.     ay = -lh
  2862.     6.times{|index| draw_param(144, ay += lh, index + 2) }
  2863.    
  2864.   end
  2865.   #--------------------------------------------------------------------------
  2866.   # * Aquisição das informações do item
  2867.   #     kind    : tipo do item
  2868.   #     data_id : ID do item
  2869.   #--------------------------------------------------------------------------
  2870.   def item_object(kind, data_id)
  2871.     return $data_items  [data_id] if kind == 1
  2872.     return $data_weapons[data_id] if kind == 2
  2873.     return $data_armors [data_id] if kind == 3
  2874.     return nil
  2875.   end
  2876.   #--------------------------------------------------------------------------
  2877.   # * Desenho do HP
  2878.   #     x      : coordenada X
  2879.   #     y      : coordenada Y
  2880.   #     width  : largura
  2881.   #--------------------------------------------------------------------------
  2882.   def draw_hp(x, y, width = 124)
  2883.     gc1 = Color.new( 56,  80, 14, 192)
  2884.     gc2 = Color.new(168, 240, 62, 192)
  2885.    
  2886.     draw_special_gauge(x, y, width, 1, gc1, gc2)
  2887.    
  2888.     change_color(system_color)
  2889.     draw_text(x + width/2 - 20, y, 30, line_height, ::Vocab::hp_a)
  2890.     change_color(normal_color)
  2891.     draw_text(x + width/2 + 5, y, width/2, line_height, @monster.params[0])
  2892.   end
  2893.   #--------------------------------------------------------------------------
  2894.   # * Desenho do MP
  2895.   #     x      : coordenada X
  2896.   #     y      : coordenada Y
  2897.   #     width  : largura
  2898.   #--------------------------------------------------------------------------
  2899.   def draw_mp(x, y, width = 124)
  2900.     gc1 = Color.new(14,  56,  80, 192)
  2901.     gc2 = Color.new(62, 168, 240, 192)
  2902.    
  2903.     draw_special_gauge(x, y, width, 1, gc1, gc2)
  2904.    
  2905.     change_color(system_color)
  2906.     draw_text(x + width/2 - 20, y, 30, line_height, ::Vocab::mp_a)
  2907.     change_color(normal_color)
  2908.     draw_text(x + width/2 + 5, y, width/2, line_height, @monster.params[1])
  2909.   end
  2910.   #--------------------------------------------------------------------------
  2911.   # * Desenho dos parâmetros
  2912.   #     x        : coordenada X
  2913.   #     y        : coordenada Y
  2914.   #     param_id : ID do parâmetro
  2915.   #--------------------------------------------------------------------------
  2916.   def draw_param(x, y, param_id)
  2917.     change_color(system_color)
  2918.     draw_text(x, y, 120, line_height, ::Vocab::param(param_id))
  2919.     change_color(normal_color)
  2920.     draw_text(x + 90, y, 36, line_height, @monster.params[param_id], 2)
  2921.     change_color(normal_color)
  2922.   end
  2923. end
  2924.  
  2925. #==============================================================================
  2926. # ** Menu_SaveFile_Window
  2927. #------------------------------------------------------------------------------
  2928. #  Mostra a informação de save e criação de novo jogo
  2929. #==============================================================================
  2930. class Menu_SaveFile_Window < Menu_Base_Window
  2931.   attr_reader :active
  2932.   attr_reader :exist
  2933.   attr_reader :index
  2934.   #-------------------------------------------------------------------------
  2935.   # * Inicialização
  2936.   #     x     : Posição X inicial da janela
  2937.   #     y     : Posição Y inicial da janela
  2938.   #     w     : Largura
  2939.   #     h     : Altura
  2940.   #     index : Index do save
  2941.   #     exist : Save existe? (Se não, será criada uma janela de "Novo Save"
  2942.   #-------------------------------------------------------------------------
  2943.   def initialize(x, y, w, h, index, exist)
  2944.     super(x, y, w, h)
  2945.     self.opacity = 0
  2946.     self.applyFont(contents)
  2947.    
  2948.     @active  = false
  2949.     @pattern = 0
  2950.     self.load_data(index, exist)
  2951.    
  2952.     @blankRect = Rect.new
  2953.    
  2954.     refresh(true)
  2955.   end
  2956.   #-------------------------------------------------------------------------
  2957.   # * Carregamento da informação do save
  2958.   #     index : Index do save
  2959.   #     header : Save existe? (Se não, será criada uma janela de "Novo Save"
  2960.   #-------------------------------------------------------------------------
  2961.   def load_data(index, header)
  2962.     @index = index
  2963.     if header
  2964.       @data    = header
  2965.       @preview = Bitmap.new_from_data(@data[:preview], 157)
  2966.     end
  2967.    
  2968.     @previewRect = Rect.new(0, line_height, contents_width, line_height)
  2969.   end
  2970.   #-------------------------------------------------------------------------
  2971.   # * Atualização
  2972.   #-------------------------------------------------------------------------
  2973.   def update
  2974.     super
  2975.     if (Graphics.frame_count % Graphics.frame_rate) == 0
  2976.       refresh
  2977.     elsif (Graphics.frame_count % ActorsSpeed) == 0
  2978.       @pattern += 1
  2979.       @pattern %= 3
  2980.       redraw_chars
  2981.     end
  2982.   end
  2983.   #-------------------------------------------------------------------------
  2984.   # * Redesenha janela
  2985.   #   complete : Redesenho completo?
  2986.   #-------------------------------------------------------------------------
  2987.   def refresh(complete = false)
  2988.     if complete
  2989.       contents.clear
  2990.       if @data
  2991.         contents.blt(0, line_height, @preview, @preview.rect)
  2992.         @previewRect.y = 86 + 4 * line_height
  2993.         draw_text(@previewRect, @data[:playtime_s], 1)
  2994.       else
  2995.         change_color(system_color)
  2996.         draw_text(@previewRect, Vocab[:FreeSlot], 1)
  2997.         change_color(normal_color)
  2998.         @previewRect.y += line_height
  2999.         draw_text(@previewRect, Vocab[:NewSave], 1)
  3000.       end
  3001.      
  3002.       change_color(system_color)
  3003.       @previewRect.y = 86 + 3 * line_height
  3004.       draw_text(@previewRect, Vocab[:PlayTime], 1)
  3005.       @previewRect.y = 86 + 6 * line_height
  3006.       draw_text(@previewRect, Vocab[:Party], 1)
  3007.       change_color(normal_color)
  3008.     elsif !@data
  3009.       @previewRect.y = 86 + 4 * line_height
  3010.       contents.clear_rect(@previewRect)
  3011.       draw_text(@previewRect, $game_system.playtime_s, 1)
  3012.     end
  3013.    
  3014.     redraw_chars
  3015.   end
  3016.   #-------------------------------------------------------------------------
  3017.   # * Redesenha atores
  3018.   #-------------------------------------------------------------------------
  3019.   def redraw_chars
  3020.     y = 86 + line_height * 7
  3021.     contents.clear_rect(0, y, contents_width, contents_height - y)
  3022.     if @data
  3023.       space = (contents_width / @data[:characters].size)
  3024.       @data[:characters].each_with_index{|data, index|
  3025.         draw_character(data[0], data[1], (index + 0.5) * space, y)        
  3026.       }
  3027.     else
  3028.       chars = $game_party.battle_members
  3029.       space = (contents_width / chars.size)
  3030.  
  3031.       chars.each_with_index{|char, index|
  3032.         draw_character(char.character_name, char.character_index, (index + 0.5) * space, y)
  3033.       }
  3034.     end
  3035.   end
  3036.   #--------------------------------------------------------------------------
  3037.   # * Desenho do gráfico do personagem
  3038.   #     character_name  : nome do gráfico do personagem
  3039.   #     character_index : índice do gráfico de personagem
  3040.   #     x               : coordenada X
  3041.   #     y               : coordenada Y
  3042.   #--------------------------------------------------------------------------
  3043.   def draw_character(character_name, character_index, x, y)
  3044.     return unless character_name
  3045.     bitmap = Cache.character(character_name)
  3046.     sign = character_name[/^[\!\$]./]
  3047.     if sign && sign.include?('$')
  3048.       cw = bitmap.width / 3
  3049.       ch = bitmap.height / 4
  3050.     else
  3051.       cw = bitmap.width / 12
  3052.       ch = bitmap.height / 8
  3053.     end
  3054.     n = character_index
  3055.    
  3056.     src_rect = Rect.new((n%4*3+@pattern)*cw, (n/4*4)*ch, cw, ch)
  3057.     contents.blt(x - cw / 2, y, bitmap, src_rect)
  3058.    
  3059.     return cw
  3060.   end
  3061.   #-------------------------------------------------------------------------
  3062.   # * Determina se a janela é de novo save ou já possui um
  3063.   #-------------------------------------------------------------------------
  3064.   def exist
  3065.     return !!@data
  3066.   end
  3067.   #-------------------------------------------------------------------------
  3068.   # * Determina estado de atividade
  3069.   #   state : Ativa ou não a janela
  3070.   #-------------------------------------------------------------------------
  3071.   def active=(state)
  3072.     @active = state
  3073.     self.cursor_rect.set(@active ? contents.rect : @blankRect)
  3074.   end
  3075. end
  3076. #==============================================================================
  3077. # ** StaticMiniMap
  3078. #------------------------------------------------------------------------------
  3079. # Classe responsável por gerar um mini-map estático que será usado no menu
  3080. #==============================================================================
  3081. class StaticMiniMap  
  3082.   include MRM::ExtremeMenu
  3083.  
  3084.   attr_reader :viewport
  3085.  
  3086.   #-------------------------------------------------------------------------
  3087.   # * Inicialização do objeto
  3088.   #     viewport : Camada de visibilidade
  3089.   #-------------------------------------------------------------------------
  3090.   def initialize(viewport)
  3091.     @viewport = viewport
  3092.     @opacity  = 255
  3093.    
  3094.     precalculus
  3095.     refresh
  3096.    
  3097.     sx = -$game_player.real_x * TileSize + MapOffset
  3098.     sy = -$game_player.real_y * TileSize + MapOffset
  3099.     @map.x = @object_layer.x = sx
  3100.     @map.y = @object_layer.y = sy
  3101.    
  3102.     draw_object_layer
  3103.   end
  3104.   #-------------------------------------------------------------------------
  3105.   # * Realiza pré-calculo
  3106.   #-------------------------------------------------------------------------
  3107.   def precalculus
  3108.     @finalSize = [
  3109.       $game_map.width  * TileSize + @viewport.rect.width,
  3110.       $game_map.height * TileSize + @viewport.rect.height
  3111.     ]
  3112.    
  3113.     @halfWidth  = @viewport.rect.width  / 2
  3114.     @halfHeight = @viewport.rect.height / 2
  3115.    
  3116.     @tsm2 = TileSize - 2
  3117.    
  3118.     @objColor = {}
  3119.     ObjectColor.each_pair{|key, value|
  3120.       @objColor[key] = Color.new(*value)
  3121.     }
  3122.    
  3123.     @playerColor    = Color.new(*PlayerColor)
  3124.     @mapColor       = Color.new(*MapColor)
  3125.     @mapBorderColor = Color.new(*MapBorderColor)
  3126.     @borderColor    = Color.new(*BorderColor)
  3127.   end
  3128.   #-------------------------------------------------------------------------
  3129.   # * Desenha o conteúdo
  3130.   #-------------------------------------------------------------------------
  3131.   def refresh
  3132.     @map        = Sprite.new(@viewport)
  3133.     @map.z      = 0
  3134.     @map.bitmap = draw_map
  3135.    
  3136.     @object_layer         = Sprite.new(@viewport)
  3137.     @object_layer.z       = 1
  3138.     @object_layer.bitmap  = Bitmap.new(*@finalSize)
  3139.     @object_layer.opacity = ObjectLayerOpacity
  3140.    
  3141.     draw_object_layer
  3142.   end
  3143.   #-------------------------------------------------------------------------
  3144.   # * Desenha a camada com eventos e com o jogador
  3145.   #-------------------------------------------------------------------------
  3146.   def draw_object_layer
  3147.     comment = [108, 408]
  3148.     for event in $game_map.events.keys
  3149.       next unless $game_map.events[event].list
  3150.       $game_map.events[event].list.each{|item|
  3151.         next unless comment.include?(item.code)
  3152.         type = item.parameters[0]
  3153.         next unless @objColor.has_key?(type)
  3154.         draw_object($game_map.events[event], @objColor[type])
  3155.       }
  3156.     end
  3157.    
  3158.     draw_object($game_player, @playerColor)
  3159.   end
  3160.   #-------------------------------------------------------------------------
  3161.   # * Desenha um character
  3162.   #     obj   : Game_Character
  3163.   #     color : Cor de preenchimento
  3164.   #-------------------------------------------------------------------------
  3165.   def draw_object(obj, color)
  3166.     x = obj.real_x * TileSize + @halfWidth
  3167.     y = obj.real_y * TileSize + @halfHeight
  3168.    
  3169.     @object_layer.bitmap.fill_rect(x + 1,     y,    @tsm2, TileSize, @borderColor)
  3170.     @object_layer.bitmap.fill_rect(    x, y + 1, TileSize,    @tsm2, @borderColor)
  3171.     @object_layer.bitmap.fill_rect(x + 1, y + 1,    @tsm2,    @tsm2, color)
  3172.   end
  3173.   #-------------------------------------------------------------------------
  3174.   # * Desenha os obstáculos do mapa
  3175.   #-------------------------------------------------------------------------
  3176.   def draw_map
  3177.     front  = make_map_bitmap(@mapColor)
  3178.     border = make_map_bitmap(@mapBorderColor)
  3179.    
  3180.     result = Bitmap.new(*@finalSize)
  3181.                        
  3182.     result.blt(-1,  0, border, border.rect)
  3183.     result.blt( 1,  0, border, border.rect)
  3184.     result.blt( 0, -1, border, border.rect)
  3185.     result.blt( 0,  1, border, border.rect)
  3186.     result.blt( 0,  0, front,  front.rect )
  3187.    
  3188.     return result
  3189.   end
  3190.   #-------------------------------------------------------------------------
  3191.   # * Desenha os obstáculos do mapa em determinada cor
  3192.   #     color : Cor de destino
  3193.   #-------------------------------------------------------------------------
  3194.   def make_map_bitmap(color)
  3195.     bitmap = Bitmap.new(*@finalSize)
  3196.    
  3197.     $game_map.width.times{|x| $game_map.height.times{|y|
  3198.       next if $game_map.passable?(x, y, 4)
  3199.       ax = x * TileSize + @halfWidth
  3200.       ay = y * TileSize + @halfHeight
  3201.       bitmap.fill_rect(ax, ay, TileSize, TileSize, color)
  3202.     }}
  3203.    
  3204.     return bitmap
  3205.   end
  3206.   #-------------------------------------------------------------------------
  3207.   # * Retorna coordenada X
  3208.   #-------------------------------------------------------------------------
  3209.   def x
  3210.     return @viewport.rect.x
  3211.   end
  3212.   #-------------------------------------------------------------------------
  3213.   # * Redefine a coordenada X
  3214.   #     value : Nova coordenada
  3215.   #-------------------------------------------------------------------------
  3216.   def x=(value)
  3217.     @viewport.rect.x = value
  3218.   end
  3219.   #-------------------------------------------------------------------------
  3220.   # * Retorna opacidade
  3221.   #-------------------------------------------------------------------------
  3222.   def opacity
  3223.     return @opacity
  3224.   end
  3225.   #-------------------------------------------------------------------------
  3226.   # * Redefine a opacidade
  3227.   #     value : Nova opacidade
  3228.   #-------------------------------------------------------------------------
  3229.   def opacity=(value)
  3230.     @opacity = value
  3231.     @map.opacity = value
  3232.     @object_layer.opacity = value * ObjectLayerOpacity / 255.0
  3233.   end
  3234.   #-------------------------------------------------------------------------
  3235.   # * Dispõe o conjunto
  3236.   #-------------------------------------------------------------------------
  3237.   def dispose
  3238.     @map.dispose
  3239.     @object_layer.dispose
  3240.   end
  3241. end
  3242. #==============================================================================
  3243. # ** Menu_Options_Window
  3244. #------------------------------------------------------------------------------
  3245. # Classe controladora das opções no menu
  3246. #==============================================================================
  3247. class Menu_Options_Window < Menu_Base_Window
  3248.   attr_accessor :barActive
  3249.   attr_reader   :index
  3250.  
  3251.   #-------------------------------------------------------------------------
  3252.   # * Inicialização
  3253.   #     x     : Posição X inicial da janela
  3254.   #     y     : Posição Y inicial da janela
  3255.   #     w     : Largura
  3256.   #     h     : Altura
  3257.   #-------------------------------------------------------------------------
  3258.   def initialize(x, y, w, h)
  3259.     super(x, y, w, h)
  3260.     self.opacity = 0
  3261.     self.applyFont(self.contents)
  3262.    
  3263.     cx = contents_width/2
  3264.    
  3265.     @rect = {
  3266.       sfx:   Rect.new(0,        line_height * 4, cx * 2, line_height * 2),
  3267.       music: Rect.new(cx - 140, line_height * 6, 125,    line_height    ),
  3268.       sound: Rect.new(cx - 140, line_height * 7, 125,    line_height    )
  3269.     }
  3270.    
  3271.     @barActive = false
  3272.     @index     = 0
  3273.    
  3274.     refresh
  3275.     self.index = -1
  3276.   end
  3277.   #-------------------------------------------------------------------------
  3278.   # * Redesenha conteúdo
  3279.   #-------------------------------------------------------------------------
  3280.   def refresh
  3281.     contents.clear
  3282.    
  3283.     # Texto
  3284.     change_color(system_color)
  3285.     contents.font.size *= 1.1
  3286.     contents.draw_text(@rect[:sfx],   Vocab[:OptionsSFX], 1)
  3287.     contents.font.size /= 1.1
  3288.     change_color(normal_color)
  3289.     contents.draw_text(@rect[:music], Vocab[:OptionsMsc], 1)
  3290.     contents.draw_text(@rect[:sound], Vocab[:OptionsSnd], 1)
  3291.    
  3292.     # Barras
  3293.     drawRect(:music, $game_system.musicRate)
  3294.     drawRect(:sound, $game_system.soundRate)
  3295.   end
  3296.   #-------------------------------------------------------------------------
  3297.   # * Desenha Barra
  3298.   #   type : Tipo
  3299.   #   rate : Proporção do preenchimento
  3300.   #-------------------------------------------------------------------------
  3301.   def drawRect(type, rate)
  3302.     rect = Rect.new.set(@rect[type])
  3303.     rect.x      += rect.width + 26
  3304.     rect.y      += 3
  3305.     rect.width  -= 6
  3306.     rect.height -= 10
  3307.  
  3308.     gc1 = Color.new(14 * rate,  80 - 24 * rate, 80 * rate, 192)
  3309.     gc2 = Color.new(62 * rate, 240 - 72 * rate, 240 * rate, 192)
  3310.    
  3311.     draw_special_gauge(rect.x, rect.y, rect.width, rect.height, rate, gc1, gc2)
  3312.    
  3313.     change_color(system_color)
  3314.     draw_text(rect, "-   #{(rate * 100).round}%   +", 1)
  3315.     change_color(normal_color)
  3316.   end
  3317.   #-------------------------------------------------------------------------
  3318.   # * Desenha a barra especial estilo Cogwheel
  3319.   #     x      : Posição X
  3320.   #     y      : Posição Y
  3321.   #     width  : Largura
  3322.   #     height : Altura
  3323.   #     rate   : Porção de preenchimento
  3324.   #     gc1    : Cor 1
  3325.   #     gc2    : Cor 2
  3326.   #-------------------------------------------------------------------------
  3327.   def draw_special_gauge(x, y, width, height, rate, gc1, gc2)
  3328.     y += line_height/2
  3329.     contents.fill_rect(x, y - 10, width, height, BC1)
  3330.     contents.fill_rect(x + 1, y -  9,  width - 2,  height - 2, BC2)
  3331.     contents.gradient_fill_rect(x + 2, y - 8, width - 4, height - 4, BC3, BC4)
  3332.     contents.gradient_fill_rect(x + 2, y - 8, (width*rate) - 4, height-4, gc1, gc2)    
  3333.   end
  3334.   #-------------------------------------------------------------------------
  3335.   # * Atualização do índice
  3336.   #-------------------------------------------------------------------------
  3337.   def index=(value)
  3338.     @index = value
  3339.     if (@index == -1)
  3340.       self.cursor_rect.set(0,0,0,0)
  3341.     else
  3342.       _rect = @rect[@index == 0 ? :music : :sound].dup
  3343.       if @barActive
  3344.         _rect.x      += _rect.width + 25
  3345.         _rect.y      += 4
  3346.         _rect.width  -= 4
  3347.         _rect.height -= 8
  3348.       end
  3349.      
  3350.       self.cursor_rect.set(_rect)
  3351.     end
  3352.   end
  3353. end
  3354.  
  3355. # Remove menu anterior
  3356. Object.send(:remove_const, :Scene_Menu)
  3357.  
  3358. #==============================================================================
  3359. # ** Scene_Menu
  3360. #------------------------------------------------------------------------------
  3361. #  Esta classe executa o processamento da tela de menu.
  3362. #==============================================================================
  3363. class Scene_Menu < Scene_Base
  3364.  
  3365.   #-------------------------------------------------------------------------
  3366.   # * Início da cena
  3367.   #-------------------------------------------------------------------------
  3368.   def start
  3369.     super
  3370.    
  3371.     @stage           = :Base
  3372.     @baseIndex       = 0
  3373.     @itemIndex       = 0
  3374.     @equipsIndex     = 0
  3375.     @skillsIndex     = 0
  3376.     @formationIndex1 = 0
  3377.     @formationIndex2 = 0
  3378.     @statusIndex     = 0
  3379.     @bestiaryIndex   = 0
  3380.     @pdistIndex      = 0
  3381.     @optionIndex     = 0
  3382.     @saveIndex       = 0
  3383.     @saveOverIndex   = 0
  3384.     @exitIndex       = 0
  3385.    
  3386.     @removedFormationWin = nil
  3387.     @iconset         = Cache.system("Iconset")
  3388.    
  3389.     # Flag necessária para remover lag
  3390.     # de inicialização do menu.
  3391.     @__NeedRefresh = []
  3392.    
  3393.     load_vocabulary
  3394.     process_move_data
  3395.     create_background
  3396.     create_icons
  3397.     if @baseIcons.size > 0
  3398.       create_cursor
  3399.       create_message
  3400.     end
  3401.     create_windows
  3402.     create_minimap if @baseIcons.size > 0
  3403.    
  3404.     #RPG::BGM.fade(@winsEnter[:time] * 1000)
  3405.     #RPG::BGS.fade(@winsEnter[:time] * 1000)
  3406.   end
  3407.   #-------------------------------------------------------------------------
  3408.   # * Atualização da cena
  3409.   #-------------------------------------------------------------------------
  3410.   def update
  3411.     super
  3412.     Tween.update
  3413.     if @baseIcons.size == 0
  3414.       process_return if Input.trigger?(:B)
  3415.       return
  3416.     end
  3417.    
  3418.     update_input
  3419.    
  3420.     # Faz processo de desenho das janelas de distribuição
  3421.     # de pontos. Este é um método necessário para remover
  3422.     # o lag de inicialização do menu, simulando uma espé-
  3423.     # cie de processo paralelo entre os frames. Garante
  3424.     # que as janelas existam mas remove o tempo inicial
  3425.     # usado para desenho e distribui entre os frames até
  3426.     # que todas as janelas tenham sido desenhadas.
  3427.     unless @__NeedRefresh.empty?
  3428.       if Graphics.frame_count % (Graphics.frame_rate/5) == 0
  3429.         @__NeedRefresh.shift.refresh
  3430.       end
  3431.     end
  3432.  
  3433.     case @stage
  3434.     when :Base, :Exit, :Formation, :Equips, :Skills
  3435.       update_actors_windows
  3436.     when :Items, :ItemsSelection, :EquipsTrade
  3437.       update_items_window
  3438.     when :ItemsActorSelection, :SkillsActorSelection
  3439.       @actorSelect.update
  3440.     when :EquipsSelection
  3441.       update_equips_windows
  3442.     when :SkillsTSelection, :SkillsSelection
  3443.       update_skills_windows
  3444.     when :PDist
  3445.       update_pdist_windows
  3446.     when :Save, :SaveOverWrite
  3447.       update_save_windows
  3448.     when :FormationNextActor
  3449.       @actorsWindows[@formationIndex1].update
  3450.       update_formation_windows
  3451.     end
  3452.   end
  3453.   #-------------------------------------------------------------------------
  3454.   # * Finalização da cena
  3455.   #-------------------------------------------------------------------------
  3456.   def terminate
  3457.     super
  3458.     dispose_background
  3459.     return dispose_actors_windows if @baseIcons.size == 0
  3460.     dispose_icons
  3461.     dispose_cursor
  3462.     dispose_message
  3463.     dispose_windows
  3464.   end
  3465.   #-------------------------------------------------------------------------
  3466.   # * Carrega informação de vocabulário
  3467.   #-------------------------------------------------------------------------
  3468.   def load_vocabulary
  3469.     @baseVocab = MRM::ExtremeMenu.enabledOptions(:name)
  3470.     @itemVocab = MRM::ExtremeMenu.enabledSubOption(:Items, :Names)
  3471.     @saveVocab = MRM::ExtremeMenu.enabledSubOption(:Save,  :Names)
  3472.     @exitVocab = MRM::ExtremeMenu.enabledSubOption(:Exit,  :Names)
  3473.   end
  3474.   #-------------------------------------------------------------------------
  3475.   # * Processa informação de movimento
  3476.   #-------------------------------------------------------------------------
  3477.   def process_move_data
  3478.     [
  3479.       [:IconsEnter,     :@iconsEnter    ],
  3480.       [:IconsMove,      :@iconsMove     ],
  3481.       [:CursorEnter,    :@cursorEnter   ],
  3482.       [:CursorMove,     :@cursorMove    ],
  3483.       [:Message,        :@messageAnim   ],
  3484.       [:ActorSelEnter,  :@actorSelEnter ],
  3485.       [:ActorSelMove,   :@actorSelMove  ],
  3486.       [:ItemsEnter,     :@itemsEnter    ],
  3487.       [:ItemsMove,      :@itemsMove     ],
  3488.       [:EquipsEnter,    :@equipsEnter   ],
  3489.       [:EquipsMove,     :@equipsMove    ],
  3490.       [:SkillsEnter,    :@skillsEnter   ],
  3491.       [:SkillsMove,     :@skillsMove    ],
  3492.       [:WindowsEnter,   :@winsEnter     ],
  3493.       [:WindowsMove,    :@winsMove      ],
  3494.       [:SaveEnter,      :@saveEnter     ],
  3495.       [:SaveMove,       :@saveMove      ],
  3496.       [:StatusEnter,    :@statusEnter   ],
  3497.       [:StatusMove,     :@statusMove    ],
  3498.       [:BestiaryEnter,  :@bestiaryEnter ],
  3499.       [:BestiaryMove,   :@bestiaryMove  ],
  3500.       [:PDistEnter,     :@pdistEnter    ],
  3501.       [:PDistMove,      :@pdistMove     ],
  3502.       [:MiniMapEnter,   :@minimapEnter  ],
  3503.       [:MiniMapMove,    :@minimapMove   ],
  3504.       [:OptionEnter,    :@optionEnter   ],
  3505.       [:FormationEnter, :@formationEnter],
  3506.       [:FormationMove,  :@formationMove ],
  3507.     ].each{|key, var|
  3508.       data  = MRM::ExtremeMenu::Animation[key]
  3509.       moveData = {
  3510.         :style => Tween::EASERS[data[0]] || Tween::Linear,
  3511.         :time  => data[1]
  3512.       }
  3513.       moveData[:off] = data[2] if data[2]
  3514.       self.instance_variable_set(var, moveData)
  3515.     }
  3516.   end
  3517.   #-------------------------------------------------------------------------
  3518.   # * Cria fundo
  3519.   #-------------------------------------------------------------------------
  3520.   def create_background
  3521.     @background_sprite = Sprite.new
  3522.     @background_sprite.bitmap = SceneManager.background_bitmap
  3523.     @background_sprite.color.set(16, 16, 16, 128)
  3524.   end
  3525.   #-------------------------------------------------------------------------
  3526.   # * Cria ícones
  3527.   #-------------------------------------------------------------------------
  3528.   def create_icons
  3529.     create_base_icons
  3530.     create_item_icons
  3531.     create_save_icons if MRM::ExtremeMenu::ConfirmOverwrite
  3532.     create_exit_icons
  3533.   end
  3534.   #-------------------------------------------------------------------------
  3535.   # * Cria ícones base
  3536.   #-------------------------------------------------------------------------
  3537.   def create_base_icons
  3538.     icons  = MRM::ExtremeMenu.enabledOptions(:icon)
  3539.     @baseIcons = self.create_generic_icons(icons)
  3540.   end
  3541.   #-------------------------------------------------------------------------
  3542.   # * Cria ícones de itens
  3543.   #-------------------------------------------------------------------------
  3544.   def create_item_icons
  3545.     icons      = MRM::ExtremeMenu.enabledSubOption(:Items, :Icons)
  3546.     @itemIcons = self.create_generic_icons(icons, false)
  3547.   end
  3548.   #-------------------------------------------------------------------------
  3549.   # * Cria ícones de save (confirmação de sobreescrita)
  3550.   #-------------------------------------------------------------------------
  3551.   def create_save_icons
  3552.     icons      = MRM::ExtremeMenu.enabledSubOption(:Save, :Icons)
  3553.     @saveIcons = self.create_generic_icons(icons, false)
  3554.   end
  3555.   #-------------------------------------------------------------------------
  3556.   # * Cria ícones de saída
  3557.   #-------------------------------------------------------------------------
  3558.   def create_exit_icons
  3559.     icons      = MRM::ExtremeMenu.enabledSubOption(:Exit, :Icons)
  3560.     @exitIcons = self.create_generic_icons(icons, false)
  3561.   end
  3562.   #-------------------------------------------------------------------------
  3563.   # * Cria cursor
  3564.   #-------------------------------------------------------------------------
  3565.   def create_cursor
  3566.     b = self.applyFont(Bitmap.new(1,1))
  3567.    
  3568.     s = (@baseVocab + @exitVocab).inject([0,0]){|max,act|
  3569.       v = b.text_size(act)
  3570.       [
  3571.         v.width  > max[0] ? v.width  : max[0],
  3572.         v.height > max[1] ? v.height : max[1]
  3573.       ]
  3574.     }
  3575.    
  3576.     b.dispose
  3577.    
  3578.     @cursor         = Sprite.new
  3579.     @cursor.opacity = 0
  3580.     @cursor.bitmap  = self.applyFont(Bitmap.new(*s))
  3581.     @cursor.ox      = @cursor.width / 2.0
  3582.     @cursor.x       = Graphics.width / (2 * @baseIcons.size)
  3583.     @cursor.y       = @baseIcons.first.y - @cursor.height - 60
  3584.     @cursor.bitmap.draw_text(0, 0, *s, @baseVocab.first, 1)
  3585.    
  3586.     Tween.start(
Advertisement
Add Comment
Please, Sign In to add comment