Erro ao tentar pegar valor duma variável em um jogo salvo [VXAce]

5 Respostas   469 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/02/2015 às 22:33 - Última modificação por King Gerar em 13/02/2015 às 09:46

O problema é no seguinte método draw_file_infos(index):

Código: [Selecionar]
  def draw_file_infos(index)
    if File.exist?("Save0" + (index + 1).to_s + ".rvdata2")
      @header = DataManager.load_header(index)
      self.draw_text(0, 0, $game_files[index].contents.width, 24, @header[:playtime_s], 2)
      File.open("Save0" + (index + 1).to_s + ".rvdata2") do |file|
        vars = Marshal.load(file)[:variables]
        $file_chapter = vars[6].to_i
      end
    else
      self.contents.font.size = $font_size + 2
      self.draw_text(0, 36, $game_files[index].contents.width, 24, $vocab[$game_variables[5]][0], 1)
    end
  end

Script todo (em desenvolvimento)
[close]

Esse método é chamado numa scene, para escrever dados dentro da janela.
Ele chama, consegue pegar o tempo de jogo do arquivo de save, porém buga
na linha $file_chapter = vars[6].to_i em que era para ele pegar o valor
de uma variável no arquivo salvo e armazenar para mim. O erro segue abaixo:



Alguém tem ideia do que é?
Ou se tiverem uma forma melhor de fazer isso, o que quero é pegar o valor de uma variável
e o tempo de jogo de um arquivo de save. O tempo tá conseguindo pegar, porém a variável não...  :rick9:

felipefalcon

Resposta 1: 12/02/2015 às 23:36 - Última modificação por felipefalcon em 12/02/2015 às 23:38

Quando eu editei minha Scene_File do meu joguinho também encuquei com a mesma coisa XD

Porém consegui, não foi desse jeito que você fez aí, mas deu XD.

No module DataManager tem um método chamado self.make_save_header eu editei ele criando os "header's" e armazendo nele as variáveis desejadas.

Exemplo:

Código: [Selecionar]
header[:jewel_pts] = $game_variables[4]Eu criei ele logo abaixo dos já existentes lá, o characters e playtime_s.

E depois chamei no método desejado da Scene_File, da seguinte maneira.

Código: [Selecionar]
header = DataManager.load_header(@file_index)
draw_text(119, 46, 200, line_height, header[:jewel_pts])#exemplo de como usei desenhando a var

Bem isso não é necessariamente uma resposta, mas pode te dar uma luz de algum modo, e se alguém pode vir explicar melhor XD

PS:  Só vi o primeiro método do post.
Lembrando que uma edição dessa como acima, pode ficar vazio o número, no caso é só você ir no Save e salvar de novo.
  

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/02/2015 às 07:42

Hum, eu tinha até tentado, mas com o "contents" ao invés do "header", porque
as variáveis estavam nele, mesmo eu não sabendo o que são, haha.
Mexi aqui um pouco, mas por hora nada, dá o mesmo erro. Penso em ser algo
na no código mesmo que eu tenha escrito errado, sei la.
Mas vou mexer mais, qualquer coisa dou um edit. Valeu!  :XD:

LeonM²

  • *
  • Posts: 163
  • Ouros: 207
  • Drifter Coder
Resposta 3: 13/02/2015 às 08:26

Esse erro é porque a variável esta vazia, ai quando tu usa o [] da método indefinido, ou seja:
"$file_chapter = vars[6].to_i" esse "vars[6].to_i", esta vazio, nulo, não sei se no Ace o comando "p" ainda funciona para mostrar debugs e talz na tela, usa antes desse "$file_chapter = vars[6].to_i" esse comando:
Código: [Selecionar]
p vars[6]Se ele retornar Nil a minha suposição acima esta certa, e se estiver certa, o erro esta nesse código:
"vars = Marshal.load(file)[:variables]", este código não carrega o que tu quer.
Posso não estar certo, eu só mexo com script pra RMXP e entendo básico de Ruby e C#.

Brandt

Resposta 4: 13/02/2015 às 09:37

O erro deve estar no que o Leon disse mesmo, a variável não existe.
Os arquivos de save são meio chatos de se mexer usando scripts, o que acontece é que os arquivos de save tem dois "níveis" de Marshal.dump, o primeiro é o header e o segundo é o content, então tente asssim:
Código: [Selecionar]
  def draw_file_infos(index)
    if File.exist?("Save0" + (index + 1).to_s + ".rvdata2")
      @header = DataManager.load_header(index)
      self.draw_text(0, 0, $game_files[index].contents.width, 24, @header[:playtime_s], 2)
      File.open("Save0" + (index + 1).to_s + ".rvdata2") do |file|
        Marshal.load(file)
        vars = Marshal.load(file)[:variables]
        return unless var
        $file_chapter = vars[6].to_i
      end
    else
      self.contents.font.size = $font_size + 2
      self.draw_text(0, 36, $game_files[index].contents.width, 24, $vocab[$game_variables[5]][0], 1)
    end
  end

Note que eu adicionei um Marshal.load(file) voador ali, sem atribuir nada, mas mesmo assim deve resolver, porque esse primeiro Marshal.load lê a primeira parte do arquivo (o header) e o segundo, que está sendo atribuido à variável vars, lê a outra, que é onde estão as variáveis.
Lógico que o arquivo de save pode ser inválido também, então é sempre bom colocar um return para o caso de a variável ser nula.

Obs.: Fiz sem poder testar, posso estar errado, mas pelo que eu lembro é isso aí mesmo.
~ Masked

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 5: 13/02/2015 às 09:46

Perfeito, Masked:wow:
A única coisa que bugou foi o return. Falou que não tinha método definido, mas apaguei ele
e funcionou de boa.

Valeu mesmo, Leon e Masked:clap: