Skrypt powtórzenia walki po przegranej. - Athanor - 06-01-14 06:22
To znowu ja. 
A więc, skrypt na powtórzenie walki od nowa kiedy ją przegraliśmy sprawił problem. Były w nim linijki otwierające, zamykające i usuwające "data/retry.sg". Napisałem do Reptil'a która polecił mi je usunąć. Tak też zrobiłem. Jednak wywala linijkę 59. A dokładniej pisze:
Script "Przegrania" line 59 NameError occurred.
undefined local variable or method `file' for #<Scene_Save:0x417c038 @help_text="Który plik zapisac?">
Proszę. czy ktoś mógłby dla mnie zedytować ten skrypt? Gdy dochodzi do końca
Skrypt normalny:
http://www.ultimateam.pl/viewtopic.php?t=10456 Z usuniętymi mam nadzieje wszystkimi retry.sg:
#======================================================================
# ** SG Battle Retry
#==========================================================================
# Script feito por sandgolem
# Traduzido por Fael000 - Membro da Jogos RPG
#==========================================================================
module SG
BattleRetryCommands = ['Spróbuj Ponownie','Exit']
BattleRetryDisableSwitch = 14
end
#==========================================================================
# Este script permite que você quando perder uma batalha você possa
# reinicia-la, ou seja, tentar de novo.
#==========================================================================
if Object.const_defined?('SDK')
SDK.log('SG Battle Retry', 'sandgolem', 6, '15.01.08')
@sg_battleretry_disabled = true if !SDK.enabled?('SG Battle Retry')
end
if !@sg_battleretry_disabled
#--------------------------------------------------------------------------
class Interpreter
alias_method :sg_battleretry_interp601, :command_601
def command_601
if $sg_retrywon
@branch[@list[@index].indent] = 0
$sg_retrywon = nil
end
return sg_battleretry_interp601
end
alias_method :sg_battleretry_interp602, :command_602
def command_602
if $game_temp.battle_can_escape && $sg_retryescaped
@branch[@list[@index].indent] = 1
$sg_retryescaped = nil
end
return sg_battleretry_interp602
end
end
# class Game_System; attr_accessor :playing_bgm; end
class Game_Temp; attr_accessor :battle_music_playing; end
class Scene_Map
alias_method :sg_battleretry_callbattle, :call_battle
def call_battle
sg_battleretry_callbattle
$game_temp.battle_music_playing = $game_system.playing_bgm.clone
end
end
class Scene_Save < Scene_File
def sg_write_retrysave_data
write_save_data(file)
file.close
end
end
class Scene_Load < Scene_File
def sg_read_retrysave_data
read_save_data(file)
file.close
end
end
class Scene_Battle
alias_method :sg_battleretry_main, :main
def main
$sg_retryescaped = nil
$sg_retrywon = nil
if !$game_switches[SG::BattleRetryDisableSwitch]
if !$sg_battleretry_inbattle && !$game_temp.battle_can_lose
$sg_battleretry_inbattle = $game_temp
sg_scene_save_temp = Scene_Save.new
sg_scene_save_temp.sg_write_retrysave_data
end
end
sg_battleretry_main
if !$scene.is_a?(Scene_Gameover)
$sg_battleretry_inbattle = nil
end
end
alias_method :sg_battleretry_battleend, :battle_end
def battle_end(result)
$sg_retrywon = true if result == 0
$sg_retryescaped = true if result == 1
sg_battleretry_battleend(result)
end
end
class Scene_Gameover
alias_method :sg_battleretry_gameovermain, :main
def main
if $sg_battleretry_inbattle
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.gameover($data_system.gameover_name)
$game_system.bgm_stop
$game_system.me_play($data_system.gameover_me)
Graphics.transition(90)
@command_window = Window_Command.new(192,SG::BattleRetryCommands)
@command_window.back_opacity = 160
@command_window.x = 320 - @command_window.width / 2
@command_window.y = 288
loop do
Graphics.update
Input.update
sg_retry_update
if $scene != self
break
end
end
@command_window.dispose
Graphics.freeze
@sprite.bitmap.dispose
@sprite.dispose
Graphics.transition(30)
Graphics.freeze
else
sg_battleretry_gameovermain
end
end
def sg_retry_update
@command_window.update
if Input.trigger?(Input::C)
case @command_window.index
when 0
sg_scene_save_temp = Scene_Load.new
sg_scene_save_temp.sg_read_retrysave_data
$game_temp = $sg_battleretry_inbattle
$game_temp.gameover = nil
$game_system.bgm_play($game_temp.battle_music_playing)
$scene = Scene_Battle.new
when 1
$sg_battleretry_inbattle = nil
$scene = Scene_Title.new
end
end
end
end
#--------------------------------------------------------------------------
end
Bardzo proszę o pomoc.
RE: Skrypt powtórzenia walki po przegranej. - Ayene - 06-01-14 13:36
No dobrze chcesz usunąć te linijki, ale po co? Przecież te pliki powstają po to, by zapisać zmienne sprzed walki. Przecież program musi jakoś zapisać stan drużyny przed starciem.
Jak ma zatem działać, jeśli chcesz je pousuwać?
RE: Skrypt powtórzenia walki po przegranej. - Athanor - 06-01-14 16:18
(06-01-14 13:36)Ayene napisał(a): No dobrze chcesz usunąć te linijki, ale po co? Przecież te pliki powstają po to, by zapisać zmienne sprzed walki. Przecież program musi jakoś zapisać stan drużyny przed starciem.
Jak ma zatem działać, jeśli chcesz je pousuwać?
Sytuacja wygląda tak: Demo gry skończone, wszystko działa można testować. Skrypty działają jest pięknie. Nadchodzi koniec i ostateczna walka. Co się dzieje? Skrypt wywala ponieważ nie może znaleźć tego pliku retry.sg I zniszczyło to troche klimatu.
Napisałem do pana R. w tej sprawie o tak mi odpisał:
Tak jak błąd mówi brakuje pliku - to brakuje pliku. Ty być może nie
używasz takiego pliku i ok., ale może dodałeś jakiś skrypt ruby,
który do owego pliku się odwołuje.
==============================================================================================
Zakodowane gry nie posiadają folderu "DATA/" dlatego odwołuje się do
czegoś, czego nie ma.
Skrypt musisz zmodyfikować, usuwając wszystkie linijki co się odwołują
do folderu DATA/
Pierwszy skrypt:
file = File.open('Data/retry.sg', 'wb')
file = File.open('Data/retry.sg', 'rb')
if FileTest.exist?('Data/retry.sg')
File.delete('Data/retry.sg')
File.delete <- jest ponoć użyte dwa razy
drugi:
file = File.open("Data/sg_temps.rxdata", "wb")
file = File.open("Data/sg_temps.rxdata", "rb")
==============================================================================================
Taką poradę udało się znaleźć, może pomoże. Nie chciałbym zrezygnować z skryptu a też nie wiem jak go naprawić. Ostatecznie mogę go usunąć, podupadnie to na grze w dużym stopniu ale jak nie można nic zrobić to trudno.
Uprzedzam że grę wywala zanim się walka rozpoczyna, więc nie mógł się ten plik nawet stworzyć.
RE: Skrypt powtórzenia walki po przegranej. - Ayene - 06-01-14 18:17
Oczywiście, że w zapakowanym projekcie nie utworzy się pliku w folderze Data. Wydaje mi się, że wystarczy, że wszystkie odwołania zamienisz na katalog główny z grą, czyli pousuwasz 'Data/' ze wszystkich linii, w których występuje, np.:
Kod:
file = File.open('Data/retry.sg', 'wb')
zamień na:
Kod:
file = File.open('retry.sg', 'wb')
Plik powinien być wówczas tworzony, nadpisywany i usuwany bez problemów.
|