Advertisement
KingGerar

Cataclisman - Choose Drop

Sep 20th, 2015
531
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 21.88 KB | None | 0 0
  1. #==============================================================================
  2. # Cataclisman - Choose Drop
  3. # por King Gerar
  4. #------------------------------------------------------------------------------
  5. # Este script adiciona uma janela em que é possível se escolher os itens que
  6. # deseja pegar, como por exemplo, itens/armas/armaduras que inimigos mortos
  7. # caídos no chão possuem, ou simples baús.
  8. #==============================================================================
  9. # Módulo CTCM002
  10. #------------------------------------------------------------------------------
  11. # - Este módulo serve para você fazer as configurações deste script.
  12. #==============================================================================
  13. module CTCM002
  14.   #-----------------------------------------------------------------------------
  15.   # Texto que aparece acima da janela de itens dropados.
  16.   #-----------------------------------------------------------------------------
  17.   Txt_Drop = "Itens Encontrados"
  18.   #-----------------------------------------------------------------------------
  19.   # Textos para a escolha dos itens a ser pegos.
  20.   #-----------------------------------------------------------------------------
  21.   Txt_Take = "Pegar um"      # Texto para pegar somente um do item.
  22.   Txt_TakeAll = "Pegar tudo" # Texto para pegar toda quantidade do item.
  23.   Txt_Cancel = "Retornar"    # Texto para retornar à escolha do item.
  24.   #-----------------------------------------------------------------------------
  25.   # ID do ícone de dinheiro.
  26.   #-----------------------------------------------------------------------------
  27.   Coin_Icon = 361
  28.   #-----------------------------------------------------------------------------
  29.   # Aqui é criada a array que guarda todos os drops do jogo.
  30.   #-----------------------------------------------------------------------------
  31.   Drops = Array.new   #Não modifique a esta linha!
  32.   #-----------------------------------------------------------------------------
  33.   # Abaixo será o lugar onde você vai criar os drops para os eventos de seu
  34.   # projeto. Os drops seguem a seguinte estrutura de criação:
  35.   #
  36.   # Drops[ID] = [["tipo do item", ID do item, quantidade],
  37.   #             ["tipo do item", ID do item, quantidade],
  38.   #             ["tipo do item", ID do item, quantidade]]
  39.   #
  40.   # ID = É o ID do drop, ou seja, o índice. Você vai usar este valor para
  41.   #      indicar qual dos drops que criou vai pertencer ao evento que quer.
  42.   # "tipo do item" = Aqui você vai escrever "item", se for um item. "weapon", se
  43.   #                  for uma arma, "armor", se for uma armadura ou "gold", se
  44.   #                  for dinheiro.
  45.   # ID do item = É o ID em que o item está na aba que escolheu. Por exemplo: se
  46.   #              você escolheu este para ser uma poção de vida, você vai colocar
  47.   #              nesse espaço o ID da poção de vida que conta no banco de dados.
  48.   #              Caso o item seja dinheiro, coloque 0.
  49.   # quantidade = Aqui você escolhe a quantidade do item que vai estar no drop.
  50.   #              Por exemplo: se quer deixar no drop 5 poções, coloque 5 nesse
  51.   #              espaço.
  52.   #
  53.   # - Um ponto importante: podem reparar que a primeira linha da estrutura do
  54.   # drop estão dois colchetes juntos "[[", e no fim a mesma coisa, porém
  55.   # opostos. Isso deve ser mantido.
  56.   # - Outra observação é que, ao fim de cada linha da estrutura (exceto a
  57.   # última), é necessário colocar vírgula.
  58.   # - O valor do ID dos drops deve ser colocado em ordem crescente. Como pode
  59.   # ver, o exemplo começa em 0 e o seguinte é 1.
  60.   #-----------------------------------------------------------------------------
  61.  
  62.   Drops[0] = [["item",  1,   3],
  63.              ["armor",  1,   1],
  64.              ["weapon", 1,   1],
  65.              ["gold",   0,  10]]
  66.              
  67.   Drops[1] = [["item",  3,   2],
  68.              ["armor",  2,   1],
  69.              ["gold",   0, 200]]
  70.              
  71.   #-----------------------------------------------------------------------------
  72.   #                       COMO COLOCAR O DROP NO EVENTO?
  73.   #-----------------------------------------------------------------------------
  74.   # Cada evento no jogo pode ter somente um drop, indepedente do número de
  75.   # páginas que o evento possuir.
  76.   # Para adicionar um drop à um evento, é só colocar o seguinte código pelo
  77.   # comando "Chamar Script":
  78.   #
  79.   # drops(ID do mapa, ID do evento, ID do drop)
  80.   #
  81.   # ID do mapa = ID do mapa em que o evento escolhido está.
  82.   # ID do evento = ID do evento escolhido.
  83.   # ID do drop = ID do drop escolhido, que você pode conferir acima.
  84.   #-----------------------------------------------------------------------------
  85. #==============================================================================
  86. #                           NÃO MODIFIQUE ABAIXO
  87. #==============================================================================
  88.   $stored_drops = Array.new(Dir.glob("#{Dir.pwd}/Data/Map*").size.pred)
  89. end
  90. #==============================================================================
  91. #                                   SCENES
  92. #==============================================================================
  93. #  Scene_ChooseDrop
  94. #------------------------------------------------------------------------------
  95. #  Esta classe executa o processamento da tela de itens dropados.
  96. #==============================================================================
  97. class Scene_ChooseDrop < Scene_Base
  98.   #--------------------------------------------------------------------------
  99.   # Inicialização do processo
  100.   #--------------------------------------------------------------------------
  101.   def start
  102.     super
  103.     @map_id = $current_drop[0]
  104.     @event_id = $current_drop[1]
  105.     @drop_id = $current_drop[2]
  106.     create_background
  107.     create_drop_window
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # Criação do plano de fundo
  111.   #--------------------------------------------------------------------------
  112.   def create_background
  113.     @background_sprite = Sprite.new
  114.     @background_sprite.bitmap = SceneManager.background_bitmap
  115.     @background_sprite.color.set(16, 16, 16, 128)
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # Criação da janela com a lista de itens dropados.
  119.   #--------------------------------------------------------------------------
  120.   def create_drop_window
  121.     @drop_window = Window_Drop.new
  122.     @drop_window.set_handler(:ok,       method(:choose_drop))
  123.     @drop_window.set_handler(:cancel,   method(:return_scene))
  124.     @drop_window.select(0)
  125.     @drop_window.activate
  126.     @upper_window = Window_UpperWindow.new(@drop_window.height)
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # Escolha do Item.
  130.   #--------------------------------------------------------------------------
  131.   def choose_drop
  132.     if $stored_drops[@map_id][@event_id][@drop_window.index][2] > 9
  133.       @take_window = Window_TakeDrop.new(@drop_window.x + (@drop_window.width / 2), @drop_window.y + (@drop_window.height / 2))
  134.       @take_window.set_handler(:take,      method(:take))
  135.       @take_window.set_handler(:take_all,  method(:take_all))
  136.       @take_window.set_handler(:cancel,    method(:dont_take))
  137.       @take_window.select(0)
  138.       @take_window.activate
  139.     else
  140.       case $stored_drops[@map_id][@event_id][@drop_window.index][0]
  141.       when "item"
  142.         $game_party.gain_item($data_items[$stored_drops[@map_id][@event_id][@drop_window.index][1]], 1)
  143.       when "weapon"
  144.         $game_party.gain_item($data_weapons[$stored_drops[@map_id][@event_id][@drop_window.index][1]], 1)
  145.       when "armor"
  146.         $game_party.gain_item($data_armors[$stored_drops[@map_id][@event_id][@drop_window.index][1]], 1)
  147.       when "gold"
  148.         $game_party.gold += 1
  149.       end
  150.       $stored_drops[@map_id][@event_id][@drop_window.index][2] -= 1
  151.      
  152.       if $stored_drops[@map_id][@event_id][@drop_window.index][2] > 0
  153.         @drop_window.refresh
  154.         @drop_window.activate
  155.       else
  156.         @drop_window.refresh
  157.         if @drop_window.item_max > 0
  158.           if @drop_window.index >= @drop_window.item_max
  159.             @drop_window.select(@drop_window.item_max - 1)
  160.           end
  161.           @drop_window.activate
  162.         else
  163.           SceneManager.return
  164.         end
  165.       end
  166.     end
  167.   end
  168.   #--------------------------------------------------------------------------
  169.   # Comando [Pegar um]
  170.   #--------------------------------------------------------------------------
  171.   def take
  172.     case $stored_drops[@map_id][@event_id][@drop_window.index][0]
  173.     when "item"
  174.       $game_party.gain_item($data_items[$stored_drops[@map_id][@event_id][@drop_window.index][1]], 1)
  175.     when "weapon"
  176.       $game_party.gain_item($data_weapons[$stored_drops[@map_id][@event_id][@drop_window.index][1]], 1)
  177.     when "armor"
  178.       $game_party.gain_item($data_armors[$stored_drops[@map_id][@event_id][@drop_window.index][1]], 1)
  179.     when "gold"
  180.       $game_party.gain_gold(1)
  181.     end
  182.     $stored_drops[@map_id][@event_id][@drop_window.index][2] -= 1
  183.     @drop_window.refresh
  184.     if $stored_drops[@map_id][@event_id][@drop_window.index] != nil
  185.       @take_window.activate
  186.     else
  187.       if @drop_window.item_max > 0
  188.         @take_window.close
  189.         @drop_window.select(@drop_window.index - 1)
  190.         @drop_window.activate
  191.       else
  192.         SceneManager.return
  193.       end
  194.     end
  195.   end
  196.   #--------------------------------------------------------------------------
  197.   # Comando [Pegar tudo]
  198.   #--------------------------------------------------------------------------
  199.   def take_all
  200.     case $stored_drops[@map_id][@event_id][@drop_window.index][0]
  201.     when "item"
  202.       $game_party.gain_item($data_items[$stored_drops[@map_id][@event_id][@drop_window.index][1]], $stored_drops[@map_id][@event_id][@drop_window.index][2])
  203.     when "weapon"
  204.       $game_party.gain_item($data_weapons[$stored_drops[@map_id][@event_id][@drop_window.index][1]], $stored_drops[@map_id][@event_id][@drop_window.index][2])
  205.     when "armor"
  206.       $game_party.gain_item($data_armors[$stored_drops[@map_id][@event_id][@drop_window.index][1]], $stored_drops[@map_id][@event_id][@drop_window.index][2])
  207.     when "gold"
  208.       $game_party.gain_gold($stored_drops[@map_id][@event_id][@drop_window.index][2])
  209.     end
  210.     $stored_drops[@map_id][@event_id][@drop_window.index][2] -= $stored_drops[@map_id][@event_id][@drop_window.index][2]
  211.     @drop_window.refresh
  212.     @take_window.close
  213.     if @drop_window.item_max > 0
  214.       if @drop_window.index >= @drop_window.item_max
  215.         @drop_window.select(@drop_window.item_max - 1)
  216.       end
  217.       @drop_window.activate
  218.     else
  219.       SceneManager.return
  220.     end
  221.   end
  222.   #--------------------------------------------------------------------------
  223.   # Comando [Retornar]
  224.   #--------------------------------------------------------------------------
  225.   def dont_take
  226.     @take_window.close
  227.     @drop_window.select(@drop_window.index)
  228.     @drop_window.activate
  229.   end
  230. end
  231. #==============================================================================
  232. #                                   WINDOWS
  233. #==============================================================================
  234. #  Window_Drops
  235. #------------------------------------------------------------------------------
  236. #  Esta janela exibe a janela de itens dropados.
  237. #==============================================================================
  238. class Window_Drop < Window_Selectable
  239.   include CTCM002
  240.   #--------------------------------------------------------------------------
  241.   # Inicialização do objeto.
  242.   #--------------------------------------------------------------------------
  243.   def initialize
  244.     super(0, 0, 224, 24)
  245.     @map_id = $current_drop[0]
  246.     @event_id = $current_drop[1]
  247.     @drop_id = $current_drop[2]
  248.     adjust_position
  249.     draw_drops
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # Aquisição do número máximo de itens
  253.   #--------------------------------------------------------------------------
  254.   def item_max
  255.     $stored_drops[$current_drop[0]][$current_drop[1]].size
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # Posicionamento da janela no centro da tela.
  259.   #--------------------------------------------------------------------------
  260.   def adjust_position
  261.     self.x = (Graphics.width - self.width) / 2
  262.     self.height = (line_height * $stored_drops[@map_id][@event_id].size) + (standard_padding * 2)
  263.     upper_window_height = line_height + (standard_padding * 2)
  264.     self.y = ((Graphics.height - (self.height + upper_window_height)) / 2) + upper_window_height
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   # Criação da lista de itens dropados.
  268.   #--------------------------------------------------------------------------
  269.   def draw_drops
  270.     n = 0
  271.     while n < item_max do
  272.       case $stored_drops[@map_id][@event_id][n][0]
  273.         when "item"
  274.           icon = $data_items[$stored_drops[@map_id][@event_id][n][1]].icon_index
  275.           name = $data_items[$stored_drops[@map_id][@event_id][n][1]].name
  276.         when "weapon"
  277.           icon = $data_weapons[$stored_drops[@map_id][@event_id][n][1]].icon_index
  278.           name = $data_weapons[$stored_drops[@map_id][@event_id][n][1]].name
  279.         when "armor"
  280.           icon = $data_armors[$stored_drops[@map_id][@event_id][n][1]].icon_index
  281.           name = $data_armors[$stored_drops[@map_id][@event_id][n][1]].name
  282.         when "gold"
  283.           icon = Coin_Icon
  284.           name = Vocab::currency_unit
  285.       end
  286.       quant = $stored_drops[@map_id][@event_id][n][2]
  287.       index = n
  288.       draw_item(index, icon, name, quant)
  289.       n += 1
  290.     end
  291.   end
  292.   #---------------------------------------------------------------------------
  293.   # Desenho de um item
  294.   #---------------------------------------------------------------------------
  295.   def draw_item(index, icon, name, quant)
  296.     rect = item_rect(index)
  297.     rect.width -= 4
  298.     draw_icon(icon, 0, index * line_height)
  299.     draw_text(28, index * line_height, 124, line_height, name, 0)
  300.     draw_text(156, index * line_height, 10, line_height, "x", 1)
  301.     draw_text(170, index * line_height, 24, line_height, quant, 2)
  302.   end
  303.   #---------------------------------------------------------------------------
  304.   # Atualização da janela. Se a quantidade de um item for maior que 1, atualiza
  305.   # para o valor restante, se for igual a 1, retira o item da lista de drops.
  306.   #---------------------------------------------------------------------------
  307.   def refresh
  308.     contents.clear
  309.     #-------------------------------------------------------------------------
  310.     # Verificar se algum dos drops possui quantidade igual a zero.
  311.     #-------------------------------------------------------------------------
  312.     n = 0
  313.     while n < item_max do
  314.       $stored_drops[@map_id][@event_id][n] = nil if $stored_drops[@map_id][@event_id][n][2] <= 0
  315.       $stored_drops[@map_id][@event_id].compact!
  316.       n += 1
  317.     end
  318.     draw_drops
  319.   end
  320. end
  321. #==============================================================================
  322. #  Window_UpperDropWindow
  323. #------------------------------------------------------------------------------
  324. #  Esta janela exibe o nome da Scene no topo da tela.
  325. #==============================================================================
  326. class Window_UpperWindow < Window_Base
  327.   include CTCM002
  328.   #--------------------------------------------------------------------------
  329.   # Inicialização do objeto.
  330.   #--------------------------------------------------------------------------
  331.   def initialize(drop_window_height)
  332.     super(0, 0, 224, line_height + (standard_padding * 2))
  333.     @drop_window_height = drop_window_height
  334.     adjust_position
  335.       draw_text( 0, 0, contents_width, line_height, Txt_Drop, 1)
  336.   end
  337.   #--------------------------------------------------------------------------
  338.   # Posicionamento da janela no centro da tela.
  339.   #--------------------------------------------------------------------------
  340.   def adjust_position
  341.     self.x = (Graphics.width - self.width) / 2
  342.     self.y = (Graphics.height - (self.height + @drop_window_height)) / 2
  343.   end
  344. end
  345. #==============================================================================
  346. # Window_TakeDrop
  347. #------------------------------------------------------------------------------
  348. # Esta jenala é exibida caso a quantidade de um item dropado seja maior ou
  349. # igual a 10. Por ela você pode escolher quantos pegar.
  350. #==============================================================================
  351. class Window_TakeDrop < Window_Command
  352.   include CTCM002
  353.   #--------------------------------------------------------------------------
  354.   # Inicialização do objeto
  355.   #--------------------------------------------------------------------------
  356.   def initialize(x, y)
  357.     super(x, y)
  358.   end
  359.   #--------------------------------------------------------------------------
  360.   # Aquisição da largura da janela
  361.   #--------------------------------------------------------------------------
  362.   def window_width
  363.     return 160
  364.   end
  365.   #--------------------------------------------------------------------------
  366.   # * Aquisição do número de linhas exibidas
  367.   #--------------------------------------------------------------------------
  368.   def visible_line_number
  369.     item_max
  370.   end
  371.   #--------------------------------------------------------------------------
  372.   # Criação da lista de comandos
  373.   #--------------------------------------------------------------------------
  374.   def make_command_list
  375.     add_command(Txt_Take,    :take)
  376.     add_command(Txt_TakeAll, :take_all)
  377.     add_command(Txt_Cancel,  :cancel)
  378.   end
  379. end
  380. #==============================================================================
  381. #                                    GAME
  382. #==============================================================================
  383. # Game_Interpreter
  384. #------------------------------------------------------------------------------
  385. # Um interpretador para executar os comandos de evento. Esta classe é usada
  386. # internamente pelas classes Game_Map, Game_Troop e Game_Event.
  387. #==============================================================================
  388. class Game_Interpreter
  389.   #--------------------------------------------------------------------------
  390.   # Apagar todos os drops.
  391.   #--------------------------------------------------------------------------
  392.   def drops(map_id, event_id, drop_id)
  393.     $current_drop = [map_id, event_id, drop_id]
  394.     #---------------------------------------------------------------------------
  395.     # Se nenhum drop tiver sido criado para o mapa, à array de drops.
  396.     #---------------------------------------------------------------------------
  397.     $stored_drops[map_id] = Array.new($game_temp.totally_event(map_id)) if $stored_drops[map_id] == nil
  398.     #---------------------------------------------------------------------------
  399.     # Se o id do evento for maior do que a quantidade de eventos no mapa (Isso
  400.     # acontece quando se deleta eventos de ID menores), preenche a array até
  401.     # ter o tamanho igual ao ID do evento.
  402.     #---------------------------------------------------------------------------
  403.     $stored_drops[map_id][event_id] = nil if $stored_drops[map_id].size < event_id
  404.     #---------------------------------------------------------------------------
  405.     # Se ainda não tiver sido definido drop para o evento, então será. Se já
  406.     # tiver sido criado e o drop estiver vazio (já foram pegos todos os itens)
  407.     # a tela de escolha de drop não é aberta.
  408.     #---------------------------------------------------------------------------
  409.     if $stored_drops[map_id][event_id] == nil
  410.       $stored_drops[map_id][event_id] = CTCM002::Drops[drop_id]
  411.       SceneManager.call(Scene_ChooseDrop)
  412.     elsif $stored_drops[map_id][event_id] != []
  413.       SceneManager.call(Scene_ChooseDrop)
  414.     end
  415.   end
  416. end
  417. #==============================================================================
  418. # Game_Temp
  419. #------------------------------------------------------------------------------
  420. # Verifica o total de eventos num mapa. Chame: $game_temp.totally_event(id)
  421. # Caso não especificar o id, dará o total de eventos do jogo inteiro.
  422. #==============================================================================
  423. class Game_Temp
  424.   def totally_event(id=nil)
  425.     totally = 0
  426.     glob = Dir.glob("./Data/Map*").collect! { |i| i.split("/").last.match(/Map(\d+)/).to_s << ".rvdata2" rescue next }.select(&:to_s)
  427.     glob.delete_at(glob.size.pred)
  428.     if id.nil?
  429.       glob.each { |i| totally += load_data(sprintf("./Data/#{i}")).events.size }
  430.     else
  431.       totally += load_data(sprintf("./Data/Map%03d.rvdata2", id)).events.size rescue 0
  432.     end
  433.     return totally
  434.   end
  435. end
  436. #==============================================================================
  437. #                                    DATA
  438. #==============================================================================
  439. # DataManager
  440. #------------------------------------------------------------------------------
  441. # Este módulo gerencia o jogo e objetos do banco de dados utilizados no jogo.
  442. # Quase todas as variáveis globais são inicializadas no módulo.
  443. #==============================================================================
  444. class << DataManager
  445.   alias create_game_drops_objects create_game_objects
  446.   def create_game_objects(*a, &b)
  447.     create_game_drops_objects(*a, &b)
  448.     $stored_drops = CTCM002::Drops.clone
  449.   end
  450.  
  451.   alias make_save_drops_contents make_save_contents
  452.   def make_save_contents(*a, &b)
  453.     contents = make_save_drops_contents(*a, &b)
  454.     contents[:stored_drops] = $stored_drops
  455.     contents
  456.   end
  457.  
  458.   alias extract_save_drops_contents extract_save_contents
  459.   def extract_save_contents(contents)
  460.     extract_save_drops_contents(contents)
  461.     $stored_drops = contents[:stored_drops]
  462.   end
  463. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement