O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Masked Scripts - Sistema de Quest + add on no menuv1.2

Iniciado por Brandt, 29/09/2013 às 22:55

29/09/2013 às 22:55 Última edição: 02/05/2014 às 21:56 por Masked
[box2 class=titlebg]MS - Quest System[/box2]

[box2 class=titlebg title=Introdução]Depois de séculos de espera, finalmente atualizei o script, agora bem mais bonito visualmente e mais fácil de usar. Devo confessar que quando fiz a primeira versão do script eu não sabia quase nada de RGSS...[/box2]

[box2 class=titlebg title=Características]O script cria um sistema de missões para o seu jogo, afinal, é um Quest System! O script é customizável e muito bonito :3[/box2]

[box2 class=titlebg title=Screenshots][/box2]

[box2 class=titlebg title=Instruções]Para adicionar uma nova missão, use esse call:
MS_Quests.unlock(id)

Sendo o id o ID da quest, configurado no script

Para chamar a cena de quests, use esse call:
SceneManager.call(Scene_Quest)
[/box2]

[box2 class=titlebg title=Script]
#==============================================================================
# MS - Quest System
#------------------------------------------------------------------------------
# por Masked
#==============================================================================
($imported ||= {})[:ms_quest_system] = true
#==============================================================================
# Configurações:
#==============================================================================
module MS_Quests
  Quests = Array.new # Não mexa
  #===========================================================================#
  #                               Vocabulário                                 #
  #===========================================================================#
 
  # Palavra para 'Rank'
  Rank = "Rank:"
 
  # Palavra para 'NPC'
  NPC = "NPC: "
 
  # Palavra para 'Local'
  Location = "Local:"
 
  # Palavra para 'Progresso'
  Progress = "Progresso: "
 
  # Palavra para 'Recompensa'
  Rewards = "Recompensa: "
 
  # Palavra para '???'
  Unknown = "???"
 
  # Palavra para 'EXP'
  EXP_Word = "EXP: "
 
  # Palavra para 'Ouro'
  Gold_Word = "Ouro: "
 
  #===========================================================================#
  #                                  Ícones                                   #
  #===========================================================================#
 
  # Índice do ícone para a experiência
  EXP_Icon = 125
 
  # Índice do ícone para o ouro
  Gold_Icon = 361
 
  #===========================================================================#
  #                                  Missões                                  #
  #===========================================================================#
  #----------------------------------------------------------------------------
  # 1ª Missão: Caça às Slimes
  #----------------------------------------------------------------------------  
  Quests[0] = {
 
    # Nome da missão
    name: "Caça às Slimes",
   
    # Dificuldade da missão
    rank: "E",
   
    # Configurações do primeiro estágio da missão
    stage_1: {
     
      # Descrição do estágio
      description: "As Slimes estão infestando o meu \njardim! Mate 10 Slimes",
     
      # Variáveis que guardam o progresso do estágio
      progress_vars: [1],
     
      # Valor que as variáveis devem ter para a missão ser considerada completa
      completion: [10],
     
      # IDs das recompensas, se ela for EXP ou Ouro, deixe como 0
      rewards: [0,0],
     
      # Quantidade das recompensas
      r_quantity: [100, 500],
     
      # Tipos das recompensas, os tipos são:
      # E = Experiência
      # G = Ouro
      # A = Armadura
      # W = Arma
      # I = Item
      r_types: "EG",
     
      # Se quiser que a recompensa seja mostrada na descição da missão, deixe
      # como true, senão, deixe como false
      s_rewards: [true,true],
     
      # NPC da missão, o primeiro texto é o nome do NPC, o segundo o nome do
      # arquivo do char dele e o terceiro é o índice do char dele no arquivo
      npc: ['Camponês',"People2",3],
     
      # Lugar onde a missão acontece (apenas um texto a ser mostrado, não
      # influencia na missão em si)
      location: "Campo"
    },
   
    # Configurações do segundo estágio da missão
    stage_2: {
   
      # Descrição do estágio
      description: "Ainda não é suficiente!\nMate mais 30 Slimes",
     
      # Variáveis que guardam o progresso do estágio
      progress_vars: [1],
     
      # Valor que as variáveis devem ter para a missão ser considerada completa
      completion: [30],
     
      # IDs das recompensas, se ela for EXP ou Ouro, deixe como 0
      rewards: [0,0],
     
      # Quantidade das recompensas
      r_quantity: [300,2000],
     
      # Tipos das recompensas, os tipos são:
      # E = Experiência
      # G = Ouro
      # A = Armadura
      # W = Arma
      # I = Item
      r_types: "EG",
     
      # Se quiser que a recompensa seja mostrada na descição da missão, deixe
      # como true, senão, deixe como false
      s_rewards: [true,true],
     
      # NPC da missão, o primeiro texto é o nome do NPC, o segundo o nome do
      # arquivo do char dele e o terceiro é o índice do char dele no arquivo
      npc: ['Camponês',"People2",3],
     
      # Lugar onde a missão acontece (apenas um texto a ser mostrado, não
      # influencia na missão em si)
      location: "Campo"
    }
  }
 
#==============================================================================
# Fim das Configurações
#==============================================================================
 
  UnlockedQuests = Array.new
  Completed = Hash.new
  QuestStages = Hash.new
  Rewarded = Hash.new
 
  def self.unlock(id,stage)
    if Quests[id]
      UnlockedQuests << quests[id][:name]
      QuestStages[quests[id][:name]] = stage
    end
  end
 
  def self.complete_stage(id)
    Completed[quests[id][:name]] ||= Array.new
    Completed[quests[id][:name]] << QuestStages[quests[id][:name]]
    Completed[quests[id][:name]].uniq!
    QuestStages[quests[id][:name]] += 1
   
    UnlockedQuests.delete(quests[id][:name]) if QuestStages[quests[id][:name]] > stages(id)
   
  end
 
  def self.quests
    return Quests.compact
  end
 
  def self.stages(id)
    stages = 0
   
    quests[id].keys.each {|key|
    stages += 1 if key.to_s =~ /stage_\d*/
    }
   
    return stages
  end
 
end
#==============================================================================
# ** Scene_Quest
#==============================================================================
class Scene_Quest < Scene_Base
  #--------------------------------------------------------------------------
  # * Inicialização do processo
  #--------------------------------------------------------------------------
  def start
    super
    create_windows
    create_background    
  end
  #--------------------------------------------------------------------------
  # * Atualização do processo
  #--------------------------------------------------------------------------  
  def update
    super
    SceneManager.return if Input.trigger?(:B)
  end
  #--------------------------------------------------------------------------
  # * Finalização do processo
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_background
  end
  #--------------------------------------------------------------------------
  # * Criação das janelas
  #--------------------------------------------------------------------------
  def create_windows
    @quest_d_window = Window_QuestDescription.new
    @quest_window = Window_QuestList.new(@quest_d_window)
  end
  #--------------------------------------------------------------------------
  # * Criação do plano de fundo
  #--------------------------------------------------------------------------
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end
  #--------------------------------------------------------------------------
  # * Disposição do plano de fundo
  #--------------------------------------------------------------------------
  def dispose_background
    @background_sprite.dispose
  end
end
#==============================================================================
# ** Window_QuestList
#==============================================================================
class Window_QuestList < Window_Command
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #--------------------------------------------------------------------------
  def initialize(quest_window)
    @handler = {}
    super(0,0)
    @quest_window = quest_window
  end
  #--------------------------------------------------------------------------
  # * Atualização do objeto
  #--------------------------------------------------------------------------
  def update
    super
    @quest_window.id = MS_Quests::UnlockedQuests[self.index] ? self.index : nil
    @quest_window.active = true
  end
  #--------------------------------------------------------------------------
  # * Criação da lista de comandos
  #--------------------------------------------------------------------------
  def make_command_list
   
    MS_Quests.quests.each {|quest|
    add_command(MS_Quests::UnlockedQuests.include?(quest[:name]) ? quest[:name] : MS_Quests::Unknown, method(:check_quest))
    }
   
  end
  #-------------------------------------------------------------------------
  # * Processo de confirmação
  #-------------------------------------------------------------------------
  def call_ok_handler
    check_quest
    super
  end
  #--------------------------------------------------------------------------
  # * Verificação da missão
  #--------------------------------------------------------------------------
  def check_quest
    stage = MS_Quests.quests[self.index]["stage_#{MS_Quests::QuestStages[MS_Quests.quests[self.index][:name]]}".to_sym]
    if stage
      b_ary = []
      stage[:progress_vars].size.times {|i|
        b_ary << false unless $game_variables[stage[:progress_vars][i]] >= stage[:completion][i]
      }
   
      MS_Quests::Completed[MS_Quests.quests[self.index][:name]] ||= Array.new
      MS_Quests.complete_stage(self.index) unless b_ary.include?(false)
      refresh
      apply_rewards(MS_Quests.quests[self.index]) if MS_Quests::Completed[MS_Quests.quests[self.index][:name]].include?(MS_Quests::QuestStages[MS_Quests.quests[self.index][:name]]-1)
    end
  end
  #--------------------------------------------------------------------------
  # * Aplicação das recompensas da missão
  #--------------------------------------------------------------------------
  def apply_rewards(quest)
    stage = quest["stage_#{MS_Quests::QuestStages[quest[:name]]-1}".to_sym]
    stage[:rewards].size.times {|i|
      case stage[:r_types][i]
      when "E"
        $game_party.members[0].gain_exp(stage[:r_quantity][i])
      when "G"
        $game_party.gain_gold(stage[:r_quantity][i])
      when "W"
        $game_party.gain_item($data_weapons[stage[:rewards][i]],stage[:r_quantity],false)
      when "A"      
        $game_party.gain_item($data_armors[stage[:rewards][i]],stage[:r_quantity],false)
      when "I"
        $game_party.gain_item($data_items[stage[:rewards][i]],stage[:r_quantity],false)
      end
    }
  end
end
#==============================================================================
# ** Window_QuestDescription
#==============================================================================
class Window_QuestDescription < Window_Base
  attr_accessor :id
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #--------------------------------------------------------------------------
  def initialize
    super(160,0,Graphics.width-160,Graphics.height)
    @id = nil
    self.active = false
  end
  #--------------------------------------------------------------------------
  # * Atualização do objeto
  #--------------------------------------------------------------------------
  def update
    super
    @quest = @id.is_a?(Integer) ? MS_Quests.quests[@id] : nil
    @quest_stage = @quest ? @quest["stage_#{MS_Quests::QuestStages[@quest[:name]]}".to_sym] : nil
   
    if self.active
      self.contents.clear
      draw_header
      draw_description
      draw_progress
      draw_rewards
    end
   
  end
  #--------------------------------------------------------------------------
  # * Desenho do cabeçalho da missão
  #--------------------------------------------------------------------------
  def draw_header
    change_color(system_color)
    draw_text(5,32,100,24,MS_Quests::Rank)
    change_color(normal_color)
   
    change_color(system_color)
    draw_text(140,32,200,24,MS_Quests::NPC)
    change_color(normal_color)
   
    change_color(system_color)
    draw_text(5,64,200,24,MS_Quests::Location)
    change_color(normal_color)
     
    if @quest_stage
      draw_text(5,0,200,24,MS_Quests.quests[@id][:name])
      draw_text_ex(300,0,"#{MS_Quests::QuestStages[@quest[:name]].to_i}/#{MS_Quests.stages(@id)}")
      draw_text_ex(5+MS_Quests::Rank.size*12,32,@quest[:rank])
 
      draw_text_ex(156+MS_Quests::NPC.size*12,32,@quest_stage[:npc][0])
      draw_character(@quest_stage[:npc][1],@quest_stage[:npc][2],140+MS_Quests::NPC.size*12,64)
     
      draw_text_ex(5+MS_Quests::Location.size*12,64,@quest_stage[:location])
    else
      draw_text_ex(5,0,MS_Quests::Unknown)
     
      draw_text_ex(325,0,MS_Quests::Unknown)
     
      draw_text_ex(5+MS_Quests::Rank.size*12,32,MS_Quests::Unknown)
 
      draw_text_ex(140+MS_Quests::NPC.size*12,32,MS_Quests::Unknown)
 
      draw_text_ex(5+MS_Quests::Location.size*12,64,MS_Quests::Unknown)
    end
  end
  #--------------------------------------------------------------------------
  # * Desenho da descrição da missão
  #--------------------------------------------------------------------------
  def draw_description
    if @quest_stage
      draw_text_ex(5,96,@quest_stage[:description])
    else
      draw_text_ex(5,96,MS_Quests::Unknown)
    end
  end
  #--------------------------------------------------------------------------
  # * Desenho do progresso da missão
  #--------------------------------------------------------------------------
  def draw_progress
   
    change_color(system_color)
    draw_text(5,178,200,24,MS_Quests::Progress)
    change_color(normal_color)
   
    if @quest_stage
      @quest_stage[:progress_vars].size.times {|i|
        draw_text_ex(5+MS_Quests::Progress.size*12,178+24*i,"#{$game_variables[@quest_stage[:progress_vars][i]]}/#{@quest_stage[:completion][i]}")
      }
    else
      draw_text_ex(5+MS_Quests::Progress.size*12,178,"#{MS_Quests::Unknown}/#{MS_Quests::Unknown}")      
    end
   
  end
  #--------------------------------------------------------------------------
  # * Desenho das recompensas da missão
  #--------------------------------------------------------------------------
  def draw_rewards
    change_color(system_color)
    draw_text(5,226,200,24,MS_Quests::Rewards)
    change_color(normal_color)
    if @quest_stage  
    @quest_stage[:rewards].size.times {|i|
      next unless @quest_stage[:s_rewards][i]
      case @quest_stage[:r_types][i]
      when "E"
        draw_icon(MS_Quests::EXP_Icon,5,250+24*i)
        draw_text_ex(32,250+24*i,MS_Quests::EXP_Word+@quest_stage[:r_quantity][i].to_s)
      when "G"
        draw_icon(MS_Quests::Gold_Icon,5,250+24*i)
        draw_text_ex(32,250+24*i,MS_Quests::Gold_Word+@quest_stage[:r_quantity][i].to_s)
      when "W"
        weapon = $data_weapons[@quest_stage[:rewards]]
        draw_text_ex(5,250+24*i,@quest_stage[:r_quantity])
        draw_icon(weapon.icon_index,5+@quest_stage[:r_quantity][i].to_s.size*12,250+24*i)
        draw_text_ex(26,250+24*i,weapon.name)
      when "A"
        armor = $data_armors[@quest_stage[:rewards]]
        draw_text_ex(5,250+24*i,@quest_stage[:r_quantity])
        draw_icon(armor.icon_index,5+@quest_stage[:r_quantity][i].to_s.size*12,250+24*i)
        draw_text_ex(26,250+24*i,armor.name)
      when "I"
        item = $data_items[@quest_stage[:rewards]]
        draw_text_ex(5,250+24*i,@quest_stage[:r_quantity])
        draw_icon(item.icon_index,5+@quest_stage[:r_quantity][i].to_s.size*12,250+24*i)
        draw_text_ex(26,250+24*i,item.name)
      else  
        next
      end
    }
    else
      draw_text_ex(5,250,MS_Quests::Unknown)
    end
  end
end
Apenas cole acima do main e abaixo do "▼ Scripts Adicionais"[/box2]

[box2 class=titlebg title=Créditos e Agradecimentos]
- a mim, por criar e disponibilizar[/box2]
~ Masked

Não entendi uma coisa. O que seria esta "fase"? O que devo inserir neste campo quando for incrementar a variável da quest? Obrigado.
"Ah, se o que eu sou é também o que eu escolhi ser, aceito a condição."

06/03/2014 às 00:28 #2 Última edição: 06/03/2014 às 00:31 por Masked
 Fase seria tipo aparte da missão que você está, por exemplo:

A missão é fazer um baú para um menino guardar seus brinquedos. Para isso, temos três coisas a fazer:
Fase 1: comprar madeira, Fase 2: comprar ferramentas, Fase 3: Montar o baú
Aí, dependendo da fase em que você incrementar a variável, o 'nível de completamento' da missão aumenta naquela fase, tipo, você pegou 10 madeiras de 20 na primeira fase, comprou 1 de 3 ferramentas na segunda e fez 0 de 1 baú na terceira.

~ Masked

Ah sim, entendi! Muito obrigado pela resposta, Masked ^^
"Ah, se o que eu sou é também o que eu escolhi ser, aceito a condição."

Mask, da um help aí, eu "comentei" as linhas que tive dúvida, daí se puder tirar minhas dúvidas, agradeço {:
Quest[3] = [                                      
# configurações da Quest 3
RewardsTypes = ["I"],                         
RewardId = [4], #No caso esse 4 é o ID do item que vou receber, certo ?                                
RewardNumber = [1], # No caso seria a quantidade de itens que vou receber certo ?
Description = "Passe a fase 1 em no mínimo 30 segundos!",                   
Complete_values = [30], # Não intendi essa parte
Initial_values = [0], # Também não intendi essa
enabled = false,                                     
RewardsDisplayed = "Você ganhou 1 Moeda !",      
complete = false
]
Tudo vai dar certo (y(8.

Sim, sim, o CompleteValues é o valor que a variável de progresso deve ter para a missão estar 'completada', tipo, tem que matar 855 slimes, então aí você põe 855 e aí quando a variável que guarda o número de slimes que você matou estiver em 855, a missão é considerada completada, InitialValues é o valor inicial da variável, tipo, a missão é você levar um item pra um cara, então o objetivo é ter 0 itens, aí a variável começa em 1, serve pra contagem regressiva, basicamente.

Eita, eu declarei constantes dentro de uma array? :hein: preciso rever esse script aí :seei:
Ah, vou refazer a interface dessabagaça, tá muito feinho...

Enfim, espero ter ajudado
~ Masked

Bom, no caso se for para passar uma fase, no final da fase eu teria que colocar um evento adicionando +1 na variável X que assim que a variável X tiver 1, ele completará a quest né ?

E nesse mesmo caso, o initial values ficaria como ? 0?
Tudo vai dar certo (y(8.

19/03/2014 às 19:24 #7 Última edição: 20/03/2014 às 20:00 por Masked
Sim, aí Complete_values vai ser [1] e Initial_Values vai ser [0 ], tem como você usar vários valores, tipo [1,1] aí se a variável da fase 1 (primeira variável) for um, ela está completa, se a variável da fase 2 (segunda variável) for 1, essa fase vai estar completa, o Initial_Values é a mesma coisa
~ Masked

Mask, quando eu adiciono a quest tudo certinho e páh, adciono a quest e chamo o script, fica assim :


Missão 1 :

????????????????


Sendo que eu pus descrição D:
HELP PLEASE
Tudo vai dar certo (y(8.

Como ficou o call? Você sabe que se configurou a quest na Quest[0] o ID dela é 0 né?
~ Masked

A call ficou assim : MS_Quests.quest_add(2)
SceneManager.call(MS_Quests)

e no script assim :

Quest[2] = [                                      
# configurações da Quest 2
RewardsTypes = ["I"],                         
RewardId = [17], #No caso esse 4 é o ID do item que vou receber, certo ?                               
RewardNumber = [1], # No caso seria a quantidade de itens que vou receber certo ?
Description = "Passe a fase 1 com mais de  30 segundos!",                   
Complete_values = [1],
Initial_values = [0], 
enabled = true,                                     
RewardsDisplayed = "Você ganhou 1 Cartão de ponto !",      
complete = false
]
Tudo vai dar certo (y(8.

20/03/2014 às 20:01 #11 Última edição: 20/03/2014 às 20:03 por Masked
Não sei o que é, assim que puder eu testo, mas tente pôr enabled = false

Edit: ah, velho, essa é a quest 2, não a 1, veja a página da quest 2 (ou 3) como está :facepalm:
~ Masked

Citação de: Masked online 20/03/2014 às 20:01
Não sei o que é, assim que puder eu testo, mas tente pôr enabled = false

Edit: ah, velho, essa é a quest 2, não a 1, veja a página da quest 2 (ou 3) como está :facepalm:

? olhar aonde ? não intendi muito bem ._. pelo o que eu vi eu realmente chamei a Quest 2 .-.
Tudo vai dar certo (y(8.

Na verdade você chamou a cena de quest, ela mostra as quests, todas elas, pra ver as outras quests, aperte baixo ou cima...
~ Masked

AAAAAAAAAAAAAAAH  tendi kkkkkk

Teria como fazer tipo, você conversa com o npc, e daí o NPC te da a quest ? sem precisar de ficar apertando pra baixo :S
Tudo vai dar certo (y(8.