Salvar e carregar array [ VXAce]

5 Respostas   765 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Tópico criado em: 12/05/2015 às 08:27

Então, o problema é em especifico à esse script.

O problema é que, ao salvar um jogo, o jogo salva, beleza. Porém, se eu fechar o jogo e voltar a abrí-lo, os dados
das missões são perdidos, o que me leva a crer que a array que guarda os valores das missões não está sendo salva.
Eu vi alguns tópicos por aí, e fiz assim (o Data Manager tá lá no final), porém dá erro no método tone, da Window_Base ._.
Alguém me ajudaria a resolver?
  :ded:

Código: [Selecionar]
#==============================================================================
# Cataclisman - Quest
# por King Gerar
#------------------------------------------------------------------------------
# Este script permite implementar missões ao jogo, com a adição de uma Scene e
# manusear as missões.
#==============================================================================
# Módulo CTCM001
#------------------------------------------------------------------------------
# - Este módulo serve para você fazer as configurações deste script.
#==============================================================================
module CTCM001
#-------------------------------------------------------------------------------
# Escolha o tamanho da fonte.
#-------------------------------------------------------------------------------
  Font_size = 16
#-------------------------------------------------------------------------------
# Adicionar o comando no menu principal? Coloque true(sim) ou false(não).
#-------------------------------------------------------------------------------
  Add_Quests = true
#-------------------------------------------------------------------------------
# Texto que ficará no menu e no topo da scene.
#-------------------------------------------------------------------------------
  Command = "Quests"
#-------------------------------------------------------------------------------
# Tipos de missões que podem haver.
#-------------------------------------------------------------------------------
  Tipos = ["Principal", "Opcional"]
#-------------------------------------------------------------------------------
# Estados que são as situações em que a missão pode estar, sendo eles: "não
# descoberta", ou seja, quando ainda você não tem acesso à missão; "em
# progresso", que é quando você está cumprindo ela; "completa" que é quando
# realiza todos objetivos e; "fracassada" que é quando falha em um ou mais
# objetivos.
# É imprescindível manter esta ordem, somente substitua as palavras pelas que
# preferir.
#-------------------------------------------------------------------------------
  Estados = ["Não descoberta", "Em Progresso", "Completa", "Fracassada"]
#-------------------------------------------------------------------------------
# Escolha aqui a ordem de exibição das missões. Utilizando os números 1 (não
# descobertas), 2 (fracassadas) e 3 (completas), coloque na ordem que preferir.
# Por padrão a ordem é 1, 2, 3, ou seja, primeiro serão exibidas as missões
# não descobertas, em seguida as fracassadas e por fim as já completadas.
#-------------------------------------------------------------------------------
  Ordem = [1, 2, 3]
#-------------------------------------------------------------------------------
# Aqui é a parte de criação das missões. Existe uma de exemplo abaixo. Para
# criar uma nova é só copiar o exemplo, modificando principalmente o valor
# entre os colchetes "[]" na frente da palavra "Quests", este valor corresponde
# ao ID da missão e ela será controlada por ele, portanto não podem haver duas
# missões com o mesmo ID. Depois, modifique e deixe a quest como quiser.
#-------------------------------------------------------------------------------
  Quests = Array.new   #Não modifique a esta linha!
#-------------------------------------------------------------------------------
# Quests[ID] = ["Nome da Missão", Tipo, ID do Ícone, Estado, Símbolo, Progresso,
#              "Descrição: Escreva aqui sobre a missão.",
#              "Quem a lhe deu e a recompensa por exemplo.",
#              "Podem ser usadas até três linhas para isso.",
#              "Primeiro objetivo",
#              "Segundo objetivo",
#              "Terceiro objetivo",
#              "Quarto objetivo",
#              "Quinto objetivo",
#              ID do item de recompensa, Quantidade,
#              ID da arma de recompensa, Quantidade,
#              ID da proteção de recompensa, Quantidade,
#              Ouro, EXP,
#              Valor, Valor final, Valor de adição, Texto 1, Texto 2, Objetivo]
#
# Explicações: TIPO = 0 para missões "Principais" ou 1 para "Opcionais".
#              ESTADO = 0 (não descoberta), 1 (em progresso), 2 (completa) ou
#                       3 (fracassada).
#              SÍMBOLO = pode colocar qualquer coisa, desde que venha precedido
#                        por : (dois pontos).
#              PROGRESSO = é o objetivo atual em que a missão se encontra.
#                          0 significa que não tem nenhum objetivo ainda,
#                          portanto ela não foi descoberta. Logo que ela é
#                          descoberta/obtida, o progresso para a ter valor 1.
#-------------------------------------------------------------------------------
# Se não for utilizar a janela auxiliar, não é preciso colocar os dados após a
# exp dada como recompensa.
#-------------------------------------------------------------------------------
#              VALOR = O valor inicial usado na janela auxiliar (explica-se
#                      abaixo).
#              VALOR FINAL = O valor final, ou seja, o que precisa ser alcançado
#                            para o objetivo ser completado.
#              VALOR DE ADIÇÃO = o valor que se soma ao primeiro gradativamente
#                                a fim de alcançar o valor final.
#              TEXTO 1 = Primeira linha do texto que será exibido na janela.
#              TEXTO 2 = Segunda linha do texto que será exibido na janela.
#              OBJETIVO = número do objetivo da missão em que a janela será
#                         utilizada. Lembrando que é um valor de 1 a 5.
#-------------------------------------------------------------------------------
#              NÃO ESQUEÇA DAS VÍRGULAS, SE NÂO VAI BUGAR è-é
#-------------------------------------------------------------------------------
  Quests[0] = ["O Resgate dos Mineiros", 0, 276, 0, :quest00, 0,
               "Na entrada da caverna, um mineiro se encontrava",
               "caído, e disse que seus companheiros estavam",
               "presos no interior da caverna.",
               "- Encontrar 5 mineiros.",
               "- Achar uma saída.",
               "- Salvar o mineiro restante.",
               "- Encontrar uma saída alternativa.",
               "- Achar um meio de abrir o portão.",
               1, 3,
               1, 1,
               1, 1,
               0, 250,
               0, 5, 1, "Mineiros", "Encontrados", 1]
  Quests[1] = ["Fuga do Templo", 0, 12, 0, :quest01, 0,
               "Precisamos sair do templo, mas para isso",
               "tivemos que passar por um misterioso guarda",
               "aparentemente nos deixou seguir.",
               "- Passar pelo corregor e entrar na porta.",
               "",
               "",
               "",
               "",
               0, 0,
               0, 0,
               0, 0,
               500, 100]
               
  Quests = $game_quests if $game_quests != nil
#-------------------------------------------------------------------------------
# Deseja marcar como completa uma missão assim que todos seus objetivos forem
# completados? Coloque true(sim) ou false(não).
#-------------------------------------------------------------------------------
  Auto_complete = true
#-------------------------------------------------------------------------------
# Ao completar uma missão, deseja que as recompensas sejam dadas
# automaticamente? Coloque true(sim) ou false(não).
#-------------------------------------------------------------------------------
  Auto_reward = true
#-------------------------------------------------------------------------------
# Quanto à experiência dada como recompensa. Gostaria de distribuir a quantidade
# de exp entre os membros do grupo? Coloque true(sim) ou false(não). Colocando
# false, cada membro do grupo receberá o valor de exp integral.
#-------------------------------------------------------------------------------
  Divide_exp = true
#-------------------------------------------------------------------------------
# ID dos ícones de ouro e experiência, respectivamente.
#-------------------------------------------------------------------------------
  Gold_Icon = 361
  Exp_Icon = 121
#-------------------------------------------------------------------------------
#                         COMO MANUSEAR AS MISSÕES?
#-------------------------------------------------------------------------------
# Para desbloquear uma missão, avançar um objetivo, marcá-la como completada
# ou fracassada, você irá utilizar pequenos códigos via comando por eventos
# "Chamar Script", os quais seguem abaixo.
#-------------------------------------------------------------------------------
# Para avançar um objetivo e/ou DESBLOQUEAR uma missão, você utilizará:
#
# advance_quest(id)
#
# Onde "id" é o id da missão, mencionado na explicação de como criar uma
# quest. Por exemplo, para avançar um objetivo na Quest[5], você deve por
# "advance_quest(5)". Lembrando que, na primeira vez que se usa esse comando
# a missão é desbloqueada e é liberado o primeiro objetivo dela.
#-------------------------------------------------------------------------------
# Para marcar uma missão como COMPLETA, você utilizará:
#
# advance_quest(id)
#
# Onde "id" é o id da missão. Caso estejam faltando objetivos a serem marcados
# como completados, eles serão marcados também.
#-------------------------------------------------------------------------------
# Para marcar uma missão como FRACASSADA, você utilizará:
#
# failed_quest(id)
#
# Onde "id" é o id da missão. Os objetivos não desbloqueados continuarão
# ocultos, porém, se nenhum objetivo estiver sido exibido, o primeiro será
# revelado.
#-------------------------------------------------------------------------------
# Supondo que o jogador fracasse em uma missão e a mesma seja marcada como
# fracassada, e caso o jogador volte onde pegou a missão, é possível
# REABILITAR uma missão que estej marcada como fracassada, utilizando:
#
# reactive_quest(id)
#
# Onde "id" é o id da missão. Os objetivos serão "resetados" e somente o
# primeiro será liberado até que os próximos sejam desbloqueados.
#-------------------------------------------------------------------------------
# Para acrescentar um de valor (o valor acrescentado corresponde ao VALOR DE
# ADIÇÃO da missão respectiva), utilize:
#
# add_quest_obj(id)
#
# Onde "id" é o id da missão. Importante ressaltar que este comando só
# funcionará se a missão cujo id foi usado neste comando estiver em progresso
# e no mesmo objetivo indicado nas configurações da janela auxiliar da própria
# quest (ou seja, o último valor das configurações da quest).
#-------------------------------------------------------------------------------
# Para verificar se uma missão já foi descoberta, utilize:
#
# verify_quest(id)
#
# Onde "id" é o id da missão. Caso a missão já tenha sido descoberta,completada
# ou fracassada, irá retornar "true", caso contrário, retornará "false". É ideal
# para usar em condições.
#-------------------------------------------------------------------------------
#                             JANELA AUXILIAR
#-------------------------------------------------------------------------------
# A janela auxiliar irá exibir o estado de alguns progressos da missão, como
# por exemplo, a quantidade de itens encontrados em uma missão de encontrar
# itens, ou o número de poções que faltam entregar em uma missão d entregar
# poções. Os dados utilizados por esta janela correspondem à ultima linha de
# informações da quest, como explicado acima (na criação da mesma).
#-------------------------------------------------------------------------------
# Deseja utilizar a janela auxiliar? Coloque true(sim) ou false(não).
#-------------------------------------------------------------------------------
  Aux_window = true
#-------------------------------------------------------------------------------
# Posição da janela auxiliar.
# "left_top", "right_top", "left_bottom" ou "right_bottom"
#-------------------------------------------------------------------------------
  Aux_pos = "right_top"
#-------------------------------------------------------------------------------
# Tempo em frames que a janela mantém uma informação.
#-------------------------------------------------------------------------------
  Aux_time = 300
#-------------------------------------------------------------------------------
# Opacidade da janela auxiliar. Valor de 0 a 255.
#-------------------------------------------------------------------------------
  Aux_opacity = 255
#-------------------------------------------------------------------------------
# Completar objetivo ao igualar os valores da janela auxiliar e objetivo
# auxiliar? Por exemplo, em uma missão de encontrar 5 pedras, ao encontrar as
# 5 pedras, deseja habilitar automaticamente o próximo onjetivo?
# Coloque true(sim) ou false(não).
#-------------------------------------------------------------------------------
  Aux_next_objective = true
#-------------------------------------------------------------------------------
#                            AVISOS DAS MISSÕES
#-------------------------------------------------------------------------------
# Os avisos das missões, se habilitados, serão exibidos automaticamente quando
# um objetivo for concluído, uma missão for completada, fracassada ou
# desbloqueada.
#-------------------------------------------------------------------------------
# Deseja utilizar os avisos das missões? Coloque true(sim) ou false(não).
#-------------------------------------------------------------------------------
  Advice_use = true
#-------------------------------------------------------------------------------
# Tempo em que o aviso permanece na tela.
#-------------------------------------------------------------------------------
  Advice_time = 300
#-------------------------------------------------------------------------------
# Ao invés de window, uma imagem pode ser usada como fundo para exibição dos
# avisos, para isto a imagem deve estar na pasta "Graphics\Pictures" do projeto.
# É importante que a imagem tenha dimensões de 120 x 96 pixels.
#-------------------------------------------------------------------------------
  Advice_img = "Quest - Advice"
#-------------------------------------------------------------------------------
# Textos para objetivo concluído, missão descoberta, completada e fracassada,
# respectivamente. Cada linha deve estar entre aspas e separadas por vírgula
# como nos padrões. É um máximo de duas linhas.
#-------------------------------------------------------------------------------
  Txt_obj_ok = ["Objetivo", "Concluído"]
  Txt_learn = ["Nova Missão", "Descoberta"]
  Txt_ok = ["Missão", "Completada"]
  Txt_fail = ["Missão", "Fracassada"]
#-------------------------------------------------------------------------------
# SE para serem executados na mesma ordem acima. Escreva o nome do SE utilizado
# entre aspas, como nos padrões.
#-------------------------------------------------------------------------------
  SE_obj_ok = "Chime2"
  SE_learn = "Save"
  SE_ok = "Skill3"
  SE_fail = "Down4"
#==============================================================================
#                           NÃO MODIFIQUE ABAIXO
#==============================================================================
end
#==============================================================================
#                                   SCENES
#==============================================================================
#  Scene_Quests
#------------------------------------------------------------------------------
#  Esta classe executa o processamento da tela de missões.
#==============================================================================
class Scene_Quests < Scene_Base
  #--------------------------------------------------------------------------
  # Inicialização do processo
  #--------------------------------------------------------------------------
  def start
    super
    create_upper_window
    create_quests_window
    create_descript_window
  end
  #--------------------------------------------------------------------------
  # Criação da janela superior com o nome da Scene.
  #--------------------------------------------------------------------------
  def create_upper_window
    @upper_window = Window_UpperWindow.new
    @upper_window.write_total_quests
  end
  #--------------------------------------------------------------------------
  # Criação da janela com a lista de missões.
  #--------------------------------------------------------------------------
  def create_quests_window
    @quests_window = Window_QuestSelect.new(0, @upper_window.height)
    @quests_window.height = Graphics.height - @upper_window.height
    @quests_window.set_handler(:ok,     method(:on_quests_ok))
    @quests_window.set_handler(:cancel, method(:return_scene))
    @quests_window.make_icon_command_list
  end
  #--------------------------------------------------------------------------
  # Criação da janela com as informações da missão.
  #--------------------------------------------------------------------------
  def create_descript_window
    width = Graphics.width - @quests_window.width
    height = Graphics.height - @upper_window.height
    @descript_window = Window_QuestDescript.new(@quests_window.width, @upper_window.height, width, height)
  end
  #--------------------------------------------------------------------------
  # Quest [Confirmação]
  #--------------------------------------------------------------------------
  def on_quests_ok
    $selected_quest = @quests_window.command_name(@quests_window.index)
    @descript_window.data_quest($selected_quest)
    @quests_window.activate
  end
end
#==============================================================================
#  Scene_Menu
#------------------------------------------------------------------------------
#  Esta classe executa o processamento da tela de menu.
#==============================================================================
class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # Criação da janela de comando
  #--------------------------------------------------------------------------
  alias create_menu_command_window create_command_window
  def create_command_window
    create_menu_command_window
    @command_window.set_handler(:quests, method(:command_ctcmquests)) if CTCM001::Add_Quests == true
  end
  #--------------------------------------------------------------------------
  # Comando [Missões]
  #--------------------------------------------------------------------------
  def command_ctcmquests
    SceneManager.call(Scene_Quests)
  end
end
#==============================================================================
# Scene_Map
#------------------------------------------------------------------------------
# Esta classe executa o processamento da tela de mapa.
#==============================================================================
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # Inicialização do processo
  #--------------------------------------------------------------------------
  alias aux_quest_start start
  def start
    aux_quest_start
    $aux_quest_window = Window_AuxQuest.new if CTCM001::Aux_window == true
    $adv_quest_window = Window_AdviceQuest.new if CTCM001::Advice_use == true
  end
  #--------------------------------------------------------------------------
  # Atualização da tela
  #--------------------------------------------------------------------------
  alias aux_quest_update update
  def update
    aux_quest_update
    $aux_quest_window.refresh if CTCM001::Aux_window == true
    $adv_quest_window.refresh if CTCM001::Advice_use == true
  end
  #--------------------------------------------------------------------------
  # Finalização do processo
  #--------------------------------------------------------------------------
  alias aux_quest_terminate terminate
  def terminate
    aux_quest_terminate
    $aux_quest_window.dispose if CTCM001::Aux_window == true
    $adv_quest_window.dispose if CTCM001::Advice_use == true
  end
end
#==============================================================================
#                                   WINDOWS
#==============================================================================
#  Window_Base
#------------------------------------------------------------------------------
#  Esta é a superclasse para todas as janelas no jogo.
#==============================================================================
class Window_Base < Window
  #--------------------------------------------------------------------------
  # Desenho de uma linha horzontal
  #--------------------------------------------------------------------------
  def draw_hr(y)
    contents.fill_rect(0, y, contents_width, 1, normal_color)
  end
end
#==============================================================================
#  Window_MenuCommand
#------------------------------------------------------------------------------
#  Esta janela exibe os comandos do menu.
#==============================================================================
class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # Adição de comandos próprios
  #--------------------------------------------------------------------------
  alias add_ctcm_commands add_original_commands
  def add_original_commands
    add_ctcm_commands
    add_command(CTCM001::Command, :quests, quests_verify) if CTCM001::Add_Quests == true
  end
  #--------------------------------------------------------------------------
  # Verificar de existem missões descorbertas.
  #--------------------------------------------------------------------------
  def quests_verify
    n = 0
    while n < CTCM001::Quests.size do
      if CTCM001::Quests[n][3] == 0
        n += 1
      else
        return true
      end
    end
    return false
  end
end
#==============================================================================
#  Window_UpperWindow
#------------------------------------------------------------------------------
#  Esta janela exibe o nome da Scene no topo da tela.
#==============================================================================
class Window_UpperWindow < Window_Base
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, Graphics.width, (standard_padding * 2) + line_height)
  self.contents.font.size = CTCM001::Font_size + 2
  draw_text( 0, 0, contents_width, line_height, CTCM001::Command, 1)
  end
  #--------------------------------------------------------------------------
  # Exibição do número de missões completas/descobertas + fracassadas.
  #--------------------------------------------------------------------------
  def write_total_quests
    @completeds = Array.new if @completeds == nil
    @total = Array.new if @total == nil
    n = 0
    while n < CTCM001::Quests.size do
      @completeds.push(n) if CTCM001::Quests[n][3] == 2
      @total.push(n) if CTCM001::Quests[n][3] > 0
      n += 1
    end
    self.contents.font.size = CTCM001::Font_size
    draw_text( contents_width - 64, 0, 32, line_height, @completeds.size.to_s, 2)
    draw_text( contents_width - 32, 0, 32, line_height, "/ " + @total.size.to_s, 0)
  end
end
#==============================================================================
#  Window_QuestSelect
#------------------------------------------------------------------------------
#  Esta janela exibe as missões disponíveis dentro da categoria selecionada.
#==============================================================================
class Window_QuestSelect < Window_Command
  include CTCM001
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y)
  end
  #--------------------------------------------------------------------------
  # Inicialização da posição do comando de seleção (método da classe).
  #--------------------------------------------------------------------------
  def self.init_command_position
    return 0
  end
  #--------------------------------------------------------------------------
  # Aquisição da largura da janela.
  #--------------------------------------------------------------------------
  def window_width
    return 208
  end
  #--------------------------------------------------------------------------
  # Aquisição do número de linhas exibidas.
  #--------------------------------------------------------------------------
  def visible_line_number
    return 10
  end
  #--------------------------------------------------------------------------
  # Criação da lista de comandos.
  #--------------------------------------------------------------------------
  def make_command_list
    @discovereds = Array.new if @discovereds == nil
    @completeds = Array.new if @completeds == nil
    @faileds = Array.new if @faileds == nil
    #--------------------------------------------------------------------------
    # Criando as arrays com cada tipo de missão.
    #--------------------------------------------------------------------------
    n = 0
    while n < Quests.size do
      @discovereds.push(n) if Quests[n][3] == 1 && @discovereds.include?(n) == false
      @completeds.push(n) if Quests[n][3] == 2 && @completeds.include?(n) == false
      @faileds.push(n) if Quests[n][3] == 3 && @faileds.include?(n) == false
      n += 1
    end
    #--------------------------------------------------------------------------
    # Colocando na ordem selecionada.
    #--------------------------------------------------------------------------
    a = Ordem.index(1)
    b = Ordem.index(2)
    c = Ordem.index(3)
    order = Array.new
    order[a] = @discovereds
    order[b] = @faileds
    order[c] = @completeds
    @ordered_quests =  order[0] + order[1] + order[2]
    #--------------------------------------------------------------------------
    # Criando os comandos.
    #--------------------------------------------------------------------------
    n = 0
    while n < @ordered_quests.size do
      add_command(Quests[@ordered_quests[n]][0], Quests[@ordered_quests[n]][4])
      n += 1
    end
  end
  #--------------------------------------------------------------------------
  # Criação dos ícones da lista de comandos.
  #--------------------------------------------------------------------------
  def make_icon_command_list
    n = 0
    while n < @ordered_quests.size do
      draw_icon(Quests[@ordered_quests[n]][2], 0, n * line_height)
      n += 1
    end
  end
  #--------------------------------------------------------------------------
  # Desenho do item
  #     index : índice do item
  #--------------------------------------------------------------------------
  def draw_item(index)
    change_color(normal_color, command_enabled?(index))
    draw_text(item_rect_for_text(index), command_name(index), alignment)
  end
  #--------------------------------------------------------------------------
  # Aquisição do retangulo para desenhar o item (para texto)
  #     index : índice do item
  #--------------------------------------------------------------------------
  def item_rect_for_text(index)
    rect = item_rect(index)
    rect.x += 28
    rect.width -= 8
    rect
  end
end
#==============================================================================
#  Window_QuestDescript
#------------------------------------------------------------------------------
#  Esta janela exibe as informações da missão selecionada.
#==============================================================================
class Window_QuestDescript < Window_Base
  include CTCM001
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
  end
  #--------------------------------------------------------------------------
  # Dados da missão selecionada.
  #--------------------------------------------------------------------------
  def data_quest(index)
    $all_quest_names = Array.new if $all_quest_names == nil
    n = 0
    while n < Quests.size do
      $all_quest_names.push(Quests[n][0])
      n += 1
    end
    contents.clear
    change_color(normal_color)
    quest = $all_quest_names.index(index) # "quest" = ID da missão selecionada.
    #------------------------------------------------------------------------
    # Cabeçalho.
    #------------------------------------------------------------------------
    draw_icon(Quests[quest][2], 0, 0)
    contents.font.size = Font_size + 4
  draw_text(0, 0, contents_width, line_height, Quests[quest][0], 1)
    contents.font.size = Font_size - 1
    draw_text(0, line_height, contents_width, line_height, Tipos[Quests[quest][1]], 1)
    draw_hr(line_height * 2)
    #------------------------------------------------------------------------
    # Descrição.
    #------------------------------------------------------------------------
    contents.font.size = Font_size
    draw_text(0, (line_height * 3), contents_width, line_height, Quests[quest][6], 0)
    draw_text(0, (line_height * 4), contents_width, line_height, Quests[quest][7], 0)
    draw_text(0, (line_height * 5), contents_width, line_height, Quests[quest][8], 0)
    #------------------------------------------------------------------------
    # Objetivos.
    #------------------------------------------------------------------------
    n = Quests[quest][5]
    while n > 0 do
      if n == Quests[quest][5] && Quests[quest][3] == (1 || 2)
        change_color(normal_color)
      else
        change_color(Color.new(255, 255, 255, 150))
      end
      text = Quests[quest][8 + n]
      if Quests[quest].size > 22 && Quests[quest][5] == Quests[quest][27]
        text += (" (" + Quests[quest][22].to_s + "/" + Quests[quest][23].to_s + ")")
      end
      draw_text(0, (line_height * (n + 5)), contents_width, line_height, text, 0)
      n -= 1
    end
    change_color(normal_color)
    #------------------------------------------------------------------------
    # Recompensas.
    #------------------------------------------------------------------------
    draw_hr(line_height * 11)
    draw_text(0, (line_height * 11), contents_width, line_height, "Recompensas", 1)
    contents.font.size = Font_size - 3
    if Quests[quest][15] > 0
      draw_icon($data_items[Quests[quest][14]].icon_index, 0, line_height * 12)
      draw_text(24, (line_height * 12), contents_width, line_height, "x" + Quests[quest][15].to_s, 0)
    end
    if Quests[quest][17] > 0
      draw_icon($data_weapons[Quests[quest][16]].icon_index, 48, line_height * 12)
      draw_text(72, (line_height * 12), contents_width, line_height, "x" + Quests[quest][17].to_s, 0)
    end
    if Quests[quest][19] > 0
      draw_icon($data_armors[Quests[quest][18]].icon_index, 96, line_height * 12)
      draw_text(120, (line_height * 12), contents_width, line_height, "x" + Quests[quest][19].to_s, 0)
    end
    contents.font.size = Font_size - 1
    if Quests[quest][20] > 0
      draw_icon(Gold_Icon, contents_width - 148, line_height * 12)
      draw_text(contents_width - 124, (line_height * 12), 50, line_height, Quests[quest][20].to_s + " G", 0)
    end
    if Quests[quest][21] > 0
      draw_icon(Exp_Icon, contents_width - 64, line_height * 12)
      draw_text(contents_width - 40, (line_height * 12), 40, line_height, Quests[quest][21].to_s, 0)
    end
    #------------------------------------------------------------------------
    # Estado.
    #------------------------------------------------------------------------
    contents.font.size = Font_size + 2
    case Quests[quest][3]
    when 2
      change_color(Color.new(190, 255, 50, 255))
    when 3
      change_color(Color.new(255, 100, 75, 255))
    end
    draw_text(0, (line_height * 13) + 8, contents_width, line_height, Estados[Quests[quest][3]].to_s, 1)
  end
end
#==============================================================================
#  Window_AuxQuest
#------------------------------------------------------------------------------
#  Esta janela exibe status de algum(ns) objetivo(s) das missões ativas.
#==============================================================================
class Window_AuxQuest < Window_Base
  include CTCM001
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 120, 96)
    set_x
    set_y
    opacity = 0
    contents_opacity = 0
    self.back_opacity = Aux_opacity
    @current_quest = 0
    @timer = Aux_time - 1
    refresh
  end
  #--------------------------------------------------------------------------
  # Posição x
  #--------------------------------------------------------------------------
  def set_x
    case Aux_pos
    when "left_top" || "left_bottom"
      self.x = 0
    when "right_top" || "right_bottom"
      self.x = Graphics.width - 120
    end
  end
  #--------------------------------------------------------------------------
  # Posição y
  #--------------------------------------------------------------------------
  def set_y
    case Aux_pos
    when "left_top" || "right_top"
      self.y = 0
    when "left_bottom" || "right_bottom"
      self.y = Graphics.height - 96
    end
  end
  #--------------------------------------------------------------------------
  # Atualização das informações.
  #--------------------------------------------------------------------------
  def refresh
    @infos_quest = [nil]
    n = 0
    while n < Quests.size do
      if Quests[n].size > 22 && Quests[n][3] == 1
        @infos_quest.push(n) if Quests[n][5] == Quests[n][27]
      end
      n += 1
    end
    @infos_quest.delete(nil)
    @timer += 1
    if @infos_quest[0] != nil
      self.opacity = 255
      self.contents_opacity = 255
      if @timer >= Aux_time
        @current_quest += 1
        @current_quest = 0 if @current_quest >= @infos_quest.size
        @timer = 0
        draw_infos
      end
    else
      contents.clear
      self.opacity = 0
      self.contents_opacity = 0
    end
  end
  #--------------------------------------------------------------------------
  # Escrever s informações na janela.
  #--------------------------------------------------------------------------
  def draw_infos
    contents.clear
    draw_text(0, 0, contents_width, line_height, Quests[@infos_quest[@current_quest]][25], 1)
    draw_text(0, line_height, contents_width, line_height, Quests[@infos_quest[@current_quest]][26], 1)
    text = Quests[@infos_quest[@current_quest]][22].to_s + " / " + Quests[@infos_quest[@current_quest]][23].to_s
    draw_text(0, line_height * 2, contents_width, line_height, text, 1)
  end
end
#==============================================================================
#  Window_AdviceQuest
#------------------------------------------------------------------------------
#  Esta janela exibe informações quando uma missão é manuseada.
#==============================================================================
class Window_AdviceQuest < Window_Base
  include CTCM001
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize
    super(Graphics.width - 120, -96, 120, 96)
    if Advice_img != ""
      @layout = Sprite.new
      @layout.bitmap = Cache.picture(Advice_img)
      @layout.x = self.x
      @layout.y = self.y
      @layout.z = $aux_quest_window.z if $aux_quest_window != nil
      self.opacity = 0
      self.z = @layout.z + 1
    end
    @timer = 0
  end
  #--------------------------------------------------------------------------
  # Criação e atualização do texto.
  #--------------------------------------------------------------------------
  def quest_advice(text, icon)
    text = text
    icon = icon
    contents.clear
    draw_text(0, 0, contents_width, line_height, text[0], 1)
    draw_text(0, line_height, contents_width, line_height, text[1], 1)
    draw_icon(icon, (contents_width - 24) / 2, line_height * 2)
    @adviced = false
    @timer = 0
  end
  #--------------------------------------------------------------------------
  # Atualização das informações.
  #--------------------------------------------------------------------------
  def refresh
    if @adviced == false
      if self.y < -48
        self.y += 10
      elsif self.y >= -48 && self.y < -24
        self.y += 5
      elsif self.y >= -24 && self.y < -12
        self.y += 3
      elsif self.y >= -12 && self.y < 0
        self.y += 1
      elsif self.y == 0
        @adviced = true
      end
      @layout.y = self.y
      $aux_quest_window.y = self.y + 96 if $aux_quest_window != nil
    else
      if @timer < 300
        @timer += 1
      else
        if self.y >= -12
          self.y -= 1
        elsif self.y < -12 && self.y >= -24
          self.y -= 3
        elsif self.y < -24 && self.y >= -48
          self.y -= 5
        elsif self.y < -48 && self.y > -96
          self.y -= 10
        elsif self.y <= -96
          self.y = -96
          @adviced = nil
          @timer = 0
        end
        @layout.y = self.y
        $aux_quest_window.y = self.y + 96 if $aux_quest_window != nil
      end
    end
  end
end
#==============================================================================
#                                    GAME
#==============================================================================
# Game_Interpreter
#------------------------------------------------------------------------------
# Um interpretador para executar os comandos de evento. Esta classe é usada
# internamente pelas classes Game_Map, Game_Troop e Game_Event.
#==============================================================================
class Game_Interpreter
  include CTCM001
  #--------------------------------------------------------------------------
  # Avançar um objetivo na missão.
  #--------------------------------------------------------------------------
  def advance_quest(id)
    if Quests[id][3] == 0
      Quests[id][3] = 1
      if Advice_use == true
        RPG::SE.new(SE_learn, 60, 100).play
        $adv_quest_window.quest_advice(Txt_learn, Quests[id][2])
      end
    end
    if Quests[id][9 + Quests[id][5]] != "" && Quests[id][9 + Quests[id][5]].is_a?(String)
      Quests[id][5] += 1
      if Advice_use == true && Quests[id][5] > 1
        RPG::SE.new(SE_obj_ok, 60, 100).play
        $adv_quest_window.quest_advice(Txt_obj_ok, Quests[id][2])
      end
    elsif Auto_complete == true
      complete_quest(id)
    end
  end
  #--------------------------------------------------------------------------
  # Marcar uma missão como completa.
  #--------------------------------------------------------------------------
  def complete_quest(id)
    Quests[id][3] = 2
    if Advice_use == true
      RPG::SE.new(SE_ok, 60, 100).play
      $adv_quest_window.quest_advice(Txt_ok, Quests[id][2])
    end
    n = Quests[id][5]
    while Quests[id][9 + n] != "" && n < 5
      Quests[id][5] += 1
      n += 1
    end
    give_rewards_quest(id) if Auto_reward == true
  end
  #--------------------------------------------------------------------------
  # Marcar uma missão como fracassada.
  #--------------------------------------------------------------------------
  def failed_quest(id)
    Quests[id][3] = 3
    Quests[id][5] = 1 if Quests[id][5] == 0
    if Advice_use == true
      RPG::SE.new(SE_fail, 60, 100).play
      $adv_quest_window.quest_advice(Txt_fail, Quests[id][2])
    end
  end
  #--------------------------------------------------------------------------
  # Reabilitar uma missão que foi fracassada.
  #--------------------------------------------------------------------------
  def reactive_quest(id)
    if Quests[id][3] == 3
      Quests[id][3] = 1
      Quests[id][5] = 1
      if Advice_use == true
        RPG::SE.new(SE_learn, 60, 100).play
        $adv_quest_window.quest_advice(Txt_learn, Quests[id][2])
      end
    else
      return
    end
  end
  #--------------------------------------------------------------------------
  # Acrescentar um de valor na janela auxiliar de missões.
  #--------------------------------------------------------------------------
  def add_quest_obj(id)
    return if Quests[id][3] == 0
    Quests[id][22] += Quests[id][24] if Quests[id][22] < Quests[id][23] && Quests[id][5] == Quests[id][27]
    advance_quest(id) if Aux_next_objective == true && Quests[id][22] == Quests[id][23]
    $aux_quest_window.draw_infos
  end
  #--------------------------------------------------------------------------
  # Distribuir as recompensas se esta opção estiver habilitada.
  #--------------------------------------------------------------------------
  def give_rewards_quest(id)
    $game_party.gain_item($data_items[Quests[id][14]], Quests[id][15])
    $game_party.gain_item($data_weapons[Quests[id][16]], Quests[id][17])
    $game_party.gain_item($data_armors[Quests[id][18]], Quests[id][19])
    $game_party.gain_gold(Quests[id][20])
    if Divide_exp == true
      each_exp = (Quests[id][21] / $game_party.members.size)
      n = 0
      while n < $game_party.members.size do
        $game_party.members[n].gain_exp(each_exp)
        n += 1
      end
    else
      n = 0
      while n < $game_party.members.size do
        $game_party.members[n].gain_exp(Quests[id][21])
        n += 1
      end
      $game_party.members[0].gain_exp(Quests[id][21])
    end
  end
  #--------------------------------------------------------------------------
  # Distribuir as recompensas se esta opção estiver habilitada.
  #--------------------------------------------------------------------------
  def verify_quest(id)
    if Quests[id][3] != 0
      return true
    else
      return false
    end
  end
end
#==============================================================================
# DataManager
#------------------------------------------------------------------------------
# Este módulo gerencia o jogo e objetos do banco de dados utilizados no jogo.
# Quase todas as variáveis globais são inicializadas no módulo.
#==============================================================================
module DataManager
  class << self
    alias make_save_quest_contents make_save_contents
    alias extract_save_quest_contents extract_save_contents
    alias save_game_with_quests_without_rescue save_game_without_rescue
  end

  def self.make_save_contents
    make_save_quest_contents
    contents = {} if !contents
    contents[:quests] = {}
    $game_quests = CTCM001::Quests
    contents[:quests] = $game_quests
    contents
  end

  def self.extract_save_contents(contents)
    extract_save_quest_contents(contents)
    $game_quests = contents[:quests]
  end
end

Raizen

  • Administrador
  • *
  • Posts: 3224
  • Ouros: 3192
  • Medalhas Vencedor do Protótipo Premiado Participante notável do evento "A Estação das Luzes do Norte" Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!
Resposta 1: 12/05/2015 às 09:35

ao invés de criar uma variável, não seria melhor colocar como atributo de uma que já é salva no RPG Maker :D?

Eu uso a Game_Timer que é a classe menos "fussada" dos scripts, ai você cria um atributo lá e usa pelo seu script, acho bem mais simples e rápido do que ficar tentando salvar variáveis.

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 2: 13/05/2015 às 08:37

Bom, pode ser. Fiz daquela maneira pois não imaginava outra, mas desde que resolva,
pra mim tá ótimo. Porém, como faço isso que tu falou? x.x
Tem algum exemplo? Daí eu só vejo e faço igual.

Raizen

  • Administrador
  • *
  • Posts: 3224
  • Ouros: 3192
  • Medalhas Vencedor do Protótipo Premiado Participante notável do evento "A Estação das Luzes do Norte" Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!
Resposta 3: 13/05/2015 às 09:52

Só colocar uma array no Game_Timer, por exemplo

Código: [Selecionar]
#==============================================================================
# ** Game_Timer
#------------------------------------------------------------------------------
#  Esta classe gerencia o cronômetro.
# A instância desta classe é referenciada por $game_timer.
#==============================================================================

class Game_Timer
attr_accessor :array_gerar
alias :gerar_initialize :initialize
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #--------------------------------------------------------------------------
  def initialize
    @array_gerar = Array.new
    gerar_initialize
  end
end

Ai só usar o $game_timer.array_gerar, já que o Ace já vai salvar essa classe mesmo :P, é uma "gambiarra" de um certo modo, mas evita de ter que ficar caçando um jeito de salvar variáveis no Save e mexendo em um monte de outros métodos com dump e coisas que afetam a compatibilidade e talz xD.

Se for algo relacionado a alguma classe que você vai usar, tipo Game_Party, ai você usa essas classes, para ficar mais "a ver" com a variável que está salvando ^^

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 4: 14/05/2015 às 07:22

Entendi que criando a array aí, o Game_Timer vai entender como se fosse uma dado dela
e salvar normalmente. Mas como eu manejo isso? Tipo, tenho que passar o módulo que fiz
para configuração todo pra dentro da Game_Timer? Eu fiz dois métodos pra salvar a array
quando salvar e carregar o jogo, mas não funciona.
  :aiaiai:

Código: [Selecionar]
#==============================================================================
# Game_Timer
#==============================================================================
class Game_Timer
  attr_accessor :ctcm_quests
  #--------------------------------------------------------------------------
  # Arquivamento das missões.
  #--------------------------------------------------------------------------
  def store_ctcm_quests
    @quests = CTCM001::Quests
  end
  #--------------------------------------------------------------------------
  # Arquivamento das missões.
  #--------------------------------------------------------------------------
  def restore_ctcm_quests
    CTCM001::Quests = @quests if @quests != nil
  end
end
#==============================================================================
# Scene_Load
#==============================================================================
class Scene_Load < Scene_File
  alias on_quest_load_success on_load_success
  def on_load_success
    $game_timer.restore_ctcm_quests
    on_quest_load_success
  end
end
#==============================================================================
# Scene_Save
#==============================================================================
class Scene_Save < Scene_File
  alias on_quest_save_success on_save_success
  def on_save_success
    $game_timer.store_ctcm_quests
    on_quest_save_success
  end
end

Brandt

Resposta 5: 14/05/2015 às 10:05

Eu sugiro que você use uma variável pro progresso, e não uma constante, isso pode dar problemas já que não dá (ou dá, mas dá problemas) pra redefinir uma constante e você precisa disso pra carregar o progresso.

Ficaria tipo assim:
Código: [Selecionar]
module CTCM001
  Quests = [] # Defina as quests normalmente...
  @@progress = {} # Aqui você define o progresso, veja que isto é uma variável, pois o progresso vai mudar.

  # Aquisição do progresso da missão
  def self.progress
    @@progress[id]
  end

  def self.progress=(p)
    @@progress = p
  end

  # Outras constantes
end

module DataManager
  class << self
    alias makesavecontesnts make_save_contents
    alias extractsavecontents extract_save_contents
  end
  def self.make_save_contents
    contents = makesavecontents
    contents[:quests] = CTCM001.progress
    contents
  end

  def self.extract_save_contents(contents)
    extractsavecontents(contents)
    CTCM001.progress = contents[:quests]
  end
end

Pra falar a verdade, o seu erro mesmo foi ter ignorado o alias do make_save_contents, você chamou ele mas esqueceu de pegar o valor que ele retorna e usar pra por as missões. Agora estou sem o computador para testar, mas assim deve funcionar.
~ Masked