1. Wchodzimy w Edytor skryptów i w lewym pasku wyszukujemy Scene_Menu (sekcja Scenes). Zaimplementowana tam klasa odwołuje się do Menu - tylko do pierwszego okna, które pojawia się po wciśnięciu ESC.
2. Wyszukujemy definicji (linijka 53)
Kod: |
def create_command_window |
Jak sama nazwa wskazuje definicja tworzy okno poleceń. Znajdują się tu poszczególne polecenia, którym przyporządkowano zmienne lokalne: s1, s2, s3, s4 itd.
Kod: |
s1 = Vocab::item
s2 = Vocab::skill
s3 = Vocab::equip
s4 = Vocab::status
s5 = Vocab::save
s6 = Vocab::game_end |
Spójrzmy na zmienną s5. Przyporządkowane jest zostało słówko 'save' ('vocab' to skrót od angielskiego 'vocabulary' - słownictwo), a jego tłumaczenie pobierane jest z Bazy Danych z zakładki Terms.
Ale skoro nam niepotrzebny jest zapis w menu, to usuwamy s5 i w jego miejsce wstawiamy kolejny vocab, czyli:
Kod: |
s1 = Vocab::item
s2 = Vocab::skill
s3 = Vocab::equip
s4 = Vocab::status
s5 = Vocab::game_end |
Zauważcie, że zmienną s6 zmieniliśmy na s5. W gruncie rzeczy to tylko cyferka, lecz w 'skrypciarstwie' przydaje się odrobina pedantyzmu.
3. W tej samej definicji, tuż pod zmiennymi znajduje się linijka, która tworzy okno (odwołuje się do zaimplementowanej już klasy - Window_Command)
Kod: |
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) |
160 - to szerokość okna poleceń (można ją dowolnie zmieniać)
[s1, s2, s3, s4, s5, s6] - to tablica, na której elementy składają się modyfikowane przez nas zmienne. Jak widać zmiennych jest o jedną za dużo. Należy ją usunąć, przez co otrzymamy:
Kod: |
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5]) |
4. W porządku. Mamy tyle poleceń, o ile nam chodziło. Gdy uruchomimy grę, zobaczymy jednak, że odwołanie tych komend jest niezmienione, czyli nadal z miejsca, gdzie był Zapis (teraz to komenda Koniec gry) przenosi do okna Zapisu. Koniecznie musimy to naprawić.
Wracamy zatem do Scene_Menu i wyszukujemy definicji (linijka 74):
Kod: |
def update_command_selection |
W tej definicji znajduje się informacje, co się dzieje, gdy będąc w menu wciśniemy Enter (Input::C) lub ESC (Input::B).
Nas interesuje tylko ten fragment:
Kod: |
case @command_window.index
when 0 # Item
$scene = Scene_Item.new
when 1,2,3 # Skill, equipment, status
start_actor_selection
when 4 # Save
$scene = Scene_File.new(true, false, false)
when 5 # End Game
$scene = Scene_End.new
end |
Kod ten można mniej więcej przetłumaczyć następująco: "w zależności od tego (case), jaki jest indeks okna poleceń (@command_window.index) to rób to i to". Indeks odpowiada kolejno :
s1 = indeks 0
s2 = indeks 1
s3 = indeks 2
Czyli pierwsza komenda w oknie zawsze będzie miała indeks 0.
W naszym przypadku indeks 0 ma polecenie Item / Przedmiot.
Domyślnie zatem zapis gry (skoro jest piąte na liście) ma indeks 4. Zatem przyjrzyjmy się linijce:
Kod: |
when 4 # Save
$scene = Scene_File.new(true, false, false) |
W naszej nowej liście indeks 4 powinnien zostać przyporządkowany Końcowi gry, zatem usuwamy powyższą linijkę i 'when' końca gry zmieniamy z 5 na 4. Całość po przeróbkach powinna wyglądać następująco:
Kod: |
case @command_window.index
when 0 # Item
$scene = Scene_Item.new
when 1,2,3 # Skill, equipment, status
start_actor_selection
when 4 # End Game
$scene = Scene_End.new
end |
5. Przetestujmy naszą grę. Wszystko wydaje się funkcjonować prawidłowo, poza jednym wyjątkiem
Gdy wybierzemy polecenie 'End Game' / 'Koniec gry' i po przejściu do nowego okna będziemy chcieli wrócić do menu (po wciśnięciu ESC) przeniesie nas w puste miejsce na liście.
By to zmienić musimy przejść do innej Scene, a mianowicie do Scene_End.
Wyszukujemy definicji:
Jedna linijka tej definicji powoduje, że wychodząc w okna z powrotem do Menu, automatycznie zaznaczona zostanie komenda końca gry. Zgodnie z wcześniejszym omówieniem jest to 5 pozycja na liście, czyli indeks 4. Zamieńmy zatem 5 w nawiasie na 4.
Kod: |
def return_scene
$scene = Scene_Menu.new(4)
end |
Teraz wszystko powinno działać bez zarzutu.
Aha i Uwaga! Pomimo wprowadzenia modyfikacji w kodzie nie została usunięta opcja wyłączenia zapisu (Change Save Access w poleceniach zdarzenia). Nie jest to potrzebne, ale za wyłączenie opcji zapisu odpowiadają kolejno:
Kod: |
if $game_system.save_disabled # If save is forbidden
@command_window.draw_item(4, false) # Disable save
end |
oraz w następnej definicji:
Kod: |
elsif $game_system.save_disabled and @command_window.index == 4
Sound.play_buzzer
return |
Jeśli ktoś chce może bezpiecznie usunąć powyższe fragmenty. Jednak jak już wspomniałam, nie jest to wymagane.