Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.00 KB | None | 0 0
  1. class Game_Party < Game_Unit
  2.   alias initialize_without_step_alert initialize
  3.   alias increase_steps_without_step_alert increase_steps
  4.   alias gain_item_without_step_alert gain_item
  5.  
  6.   def initialize
  7.     initialize_without_step_alert
  8.     # Hash para contagem regressiva para os passos por item.
  9.     @item_steps = {}
  10.   end
  11.  
  12.   # Sobrescrevemos a função `increase_steps`, que é chamada cada
  13.   # vez que o jogador conta um passo.
  14.   # A diferença de modificar esse método ou modificar o `update`
  15.   # da Scene_Map é que o `update` roda a todo frame, e este método
  16.   # roda apenas quando o evento em que estamos interessados acontece.
  17.   def increase_steps
  18.     increase_steps_without_step_alert
  19.  
  20.     # Para cada item que temos no Hash, diminuímos em 1 a contagem
  21.     # a cada vez que o jogador conta um passo.
  22.     # Optei pela contagem regressiva porque contagem progressiva
  23.     # exigiria armazenar o valor máximo para poder disparar o
  24.     # alerta, enquanto a contagem regressiva permite só comparar
  25.     # com zero.
  26.     @item_steps.each_key { |item| @item_steps[item] -= 1 }
  27.  
  28.     # Feito isso, chamamos o método de atualização para mostrar
  29.     # o alerta se cabível.
  30.     # Veja que isso não precisa estar no método update, porque o
  31.     # valor da contagem de passos só muda no `increase_steps`.
  32.     check_step_alerts
  33.   end
  34.  
  35.   def check_step_alerts
  36.     # Vamos verificar o alerta para cada item no Hash.
  37.     # O .to_a aqui serve para copiar os pares de item/contagem do
  38.     # Hash para um Array antes de percorrer, e é necessário porque
  39.     # enquanto percorremos o hash queremos deletar elementos dele.
  40.     # Ao invés de .to_a, poderíamos usar o método .dup, apesar que
  41.     # o .to_a deve ser mais eficiente.
  42.     @item_steps.to_a.each do |item, steps|
  43.  
  44.       # Como temos uma contagem *regressiva*, só nos interessa o
  45.       # momento em que ela chega a zero.
  46.       next if steps > 0
  47.  
  48.       # Nesse caso, ativamos o alerta. É legal colocar isso em um
  49.       # método à parte para segmentar bem as coisas.
  50.       step_alert(item)
  51.  
  52.       # Feito isso, tiramos o item do Hash, porque não faz mais
  53.       # sentido contar passos para ele.
  54.       @item_steps.delete(item)
  55.     end
  56.   end
  57.  
  58.   # Modificamos também o método responsável por adicionar itens ao
  59.   # inventário. Assim, conseguimos marcar todos os itens para os
  60.   # quais os passos devem ser contados sem ter que checar o
  61.   # inventário da party a cada frame.
  62.   def gain_item(item, amount, include_equip = false)
  63.     gain_item_without_step_alert(item, amount, include_equip)
  64.  
  65.     # Aqui, sim, vemos se o item tem nas notas a anotação que queremos.
  66.     # Se ele não tiver, ignoramos ele.
  67.     note_steps = item.note.scan(/steps:\s*(\d+)/i).flatten.last
  68.     return if note_steps.nil?
  69.  
  70.     add_step_alert(item, note_steps.to_i)
  71.   end
  72.  
  73.   def add_step_alert(item, max_steps)
  74.     @item_steps[item] = note_steps.to_i
  75.   end
  76.  
  77.   def step_alert(item)
  78.     msgbox "Número de passos excedido para o item [#{item.name}]."
  79.   end
  80. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement