Creare Videogiochi - Game Developer
[SCRIPT]Simple Quest System - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Rpg Maker Italia (https://www.making-videogames.net/giochi/Forum-Rpg-Maker-Italia)
+--- Forum: RPG Maker VX Ace (https://www.making-videogames.net/giochi/Forum-RPG-Maker-VX-Ace)
+---- Forum: Script Rpg Maker Vx Ace (https://www.making-videogames.net/giochi/Forum-Script-Rpg-Maker-Vx-Ace)
+---- Discussione: [SCRIPT]Simple Quest System (/thread-SCRIPT-Simple-Quest-System)



[SCRIPT]Simple Quest System - Johnny 97 - 11-10-2012

DESCRIZIONE:
Questo script aggiunge una voce al menù, per accedere ad una schermata dove verrà mostrata la missione in corso, impostata interamente da voi.
E' uno script molto semplice strutturalmente, cioè, potrete scrivere una missione alla volta. Diciamo chè è più una schermata per far ricordare al giocatore cosa deve fare, nel caso in cui dovesse riprendere il gioco dopo un po' di tempo, oppure nel caso in cui ci sia una lista lunga di cose da fare.

AUTORE/I:
Interamente Johnny 97 (Io u.u)

SCREENSHOTS:
[spoiler][Immagine: sxj9tz.png][/spoiler]


ISTRUZIONI:
Come avrete potuto notare dallo screen, la finestra della missione è strutturata in 3 sezioni:
-Obiettivo Attuale: Diciamo che questo è il titolo della missione;
-Descrizione Obiettivo: Ci sono 5 righe a disposizione per descrivere l'obiettivo da raggiungere per completare la missione.
-Ricompense: Ci sono 4 righe a disposizione per elencare le ricompense.

Potrete strutturare come volete la descrizione e le ricompense (ad esempio scrivere una ricompensa per ogni riga, come se fosse una lista).

Per scrivere nelle varie righe, dovrete utilizzare il Call Script in qualsiasi momento vogliate! Ecco i vari codici per scrivere nella finestra:
Codice:
$questname = "Scrivete qui quel che volete che compaia accanto a Obiettivo Attuale."
$questdescription1 = "Scrivete qui quel che volete che compaia nella riga 1 della Descrizione dell'Obiettivo"
$questdescription2 = "Scrivete qui quel che volete che compaia nella riga 2 della Descrizione dell'Obiettivo"
$questdescription3 = "Scrivete qui quel che volete che compaia nella riga 3 della Descrizione dell'Obiettivo"
$questdescription4 = "Scrivete qui quel che volete che compaia nella riga 4 della Descrizione dell'Obiettivo"
$questdescription5 = "Scrivete qui quel che volete che compaia nella riga 5 della Descrizione dell'Obiettivo"
$questdescription6 = "Scrivete qui quel che volete che compaia nella riga 6 della Descrizione dell'Obiettivo"
$questdescription7 = "Scrivete qui quel che volete che compaia nella riga 7 della Descrizione dell'Obiettivo"
$questdescription8 = "Scrivete qui quel che volete che compaia nella riga 8 della Descrizione dell'Obiettivo"
$questreward1 = "Scrivete qui quel che volete che compaia nella riga 1 delle Ricompense"
$questreward2 = "Scrivete qui quel che volete che compaia nella riga 2 delle Ricompense"
$questreward3 = "Scrivete qui quel che volete che compaia nella riga 3 delle Ricompense"
$questreward4 = "Scrivete qui quel che volete che compaia nella riga 4 delle Ricompense"

Inoltre fra i 5 script ci sarà anche uno script per personalizzare un po' la grafica della finestra... Niente di chè, se volete spostare le righe o cambiare le scritte "Obiettivo Attuale", "Descrizione Obiettivo" e "Ricompense" vi basterà seguire le istruzioni dentro quello script.

SCRIPT:
Allooooooora, gli script sono 5, e dovrete metterli in posti diversi dentro lo script editor per evitare incompatibilità e problemi vari.
Chiamate questo primo script Quest e mettetelo sotto la categoria Modules (La prima categoria per intenderci meglio.)
NB: Questo è lo script per le impostazioni di cui vi ho parlato sopra.
[SPOILER]
Codice:
#==============================================================================
# ** Impostazioni Johnny 97's Quest System v1.1
#------------------------------------------------------------------------------
# In questo modulo sono contenute variabili che potrete modificare a vostro
# piacimento per personalizzare lo script.
#==============================================================================
module Johnny
#==============================================================================
# ** Stringhe
#------------------------------------------------------------------------------
# Modificate soltanto la parte dentro "".
#==============================================================================
  #Voce del menù
  Obiettivi = "Obiettivi"
  #Obiettivo Attuale
  Attuale = "Obiettivo Attuale"
  #Descrizione Obiettivo
  Descrizione = "Descrizione Obiettivo"
  #Ricompense
  Ricompense = "Ricompense"
end

class QuestSettings
#==============================================================================
# ** Variabili
#------------------------------------------------------------------------------
# Impostate le variabili con numeri differenti per avere allineamenti di testo
# differenti.
# 0 = Allineato a Sinistra
# 1 = Allineato al Centro
# 2 = Allineato a Destra
#==============================================================================
  #Righe Descrizione Obiettivo
  $AllDescr = 0
  #Righe Ricompense
  $AllRicom = 0
end
[/SPOILER]


Il prossimo script è una modifica che ho dovuto apportare alla finestra del menù classico, quindi SOSTITUITE questo script allo script Window_MenuCommand (Non cancellate lo script dalla lista degli script, ma sostituite il codice.)
[spoiler]
Codice:
#==============================================================================
# ** Window_MenuCommand ADAPTED
#------------------------------------------------------------------------------
#  Window_MenuCommand adattato per il Johnny 97's Quest System
#==============================================================================

class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Initialize Command Selection Position (Class Method)
  #--------------------------------------------------------------------------
  def self.init_command_position
    @@last_command_symbol = nil
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
    select_last
  end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_width
    return 160
  end
  #--------------------------------------------------------------------------
  # * Get Number of Lines to Show
  #--------------------------------------------------------------------------
  def visible_line_number
    item_max
  end
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list
    add_main_commands
    add_formation_command
    add_original_commands
    add_save_command
    add_game_end_command
  end
  #--------------------------------------------------------------------------
  # * Add Main Commands to List
  #--------------------------------------------------------------------------
  def add_main_commands
    add_command(Vocab::item,   :item,   main_commands_enabled)
    add_command(Vocab::skill,  :skill,  main_commands_enabled)
    add_command(Vocab::equip,  :equip,  main_commands_enabled)
    add_command(Vocab::status, :status, main_commands_enabled)
    add_command(Johnny::Obiettivi,  :quest,  main_commands_enabled)
  end
  #--------------------------------------------------------------------------
  # * Add Formation to Command List
  #--------------------------------------------------------------------------
  def add_formation_command
    add_command(Vocab::formation, :formation, formation_enabled)
  end
  #--------------------------------------------------------------------------
  # * For Adding Original Commands
  #--------------------------------------------------------------------------
  def add_original_commands
  end
  #--------------------------------------------------------------------------
  # * Add Save to Command List
  #--------------------------------------------------------------------------
  def add_save_command
    add_command(Vocab::save, :save, save_enabled)
  end
  #--------------------------------------------------------------------------
  # * Add Exit Game to Command List
  #--------------------------------------------------------------------------
  def add_game_end_command
    add_command(Vocab::game_end, :game_end)
  end
  #--------------------------------------------------------------------------
  # * Get Activation State of Main Commands
  #--------------------------------------------------------------------------
  def main_commands_enabled
    $game_party.exists
  end
  #--------------------------------------------------------------------------
  # * Get Activation State of Formation
  #--------------------------------------------------------------------------
  def formation_enabled
    $game_party.members.size >= 2 && !$game_system.formation_disabled
  end
  #--------------------------------------------------------------------------
  # * Get Activation State of Save
  #--------------------------------------------------------------------------
  def save_enabled
    !$game_system.save_disabled
  end
  #--------------------------------------------------------------------------
  # * Processing When OK Button Is Pressed
  #--------------------------------------------------------------------------
  def process_ok
    @@last_command_symbol = current_symbol
    super
  end
  #--------------------------------------------------------------------------
  # * Restore Previous Selection Position
  #--------------------------------------------------------------------------
  def select_last
    select_symbol(@@last_command_symbol)
  end
end
[/spoiler]


Passiamo al terzo script, dovrete fare come avete fatto con quello di sopra, ma questa volta dovrete sostituire un altro script, lo script Scene_Menu.
[spoiler]
Codice:
#==============================================================================
# ** Scene_Menu ADAPTED
#------------------------------------------------------------------------------
#  Menù originale adattato per il Johnny 97's Quest System
#==============================================================================

class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start
    super
    create_command_window
    create_gold_window
    create_status_window
  end
  #--------------------------------------------------------------------------
  # * Create Command Window
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_MenuCommand.new
    @command_window.set_handler(:item,      method(:command_item))
    @command_window.set_handler(:skill,     method(:command_personal))
    @command_window.set_handler(:equip,     method(:command_personal))
    @command_window.set_handler(:status,    method(:command_personal))
    @command_window.set_handler(:quest,     method(:command_quest))
    @command_window.set_handler(:formation, method(:command_formation))
    @command_window.set_handler(:save,      method(:command_save))
    @command_window.set_handler(:game_end,  method(:command_game_end))
    @command_window.set_handler(:cancel,    method(:return_scene))
  end
  #--------------------------------------------------------------------------
  # * Create Gold Window
  #--------------------------------------------------------------------------
  def create_gold_window
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = Graphics.height - @gold_window.height
  end
  #--------------------------------------------------------------------------
  # * Create Status Window
  #--------------------------------------------------------------------------
  def create_status_window
    @status_window = Window_MenuStatus.new(@command_window.width, 0)
  end
  #--------------------------------------------------------------------------
  # * [Item] Command
  #--------------------------------------------------------------------------
  def command_item
    SceneManager.call(Scene_Item)
  end
  #--------------------------------------------------------------------------
  # * [Skill], [Equipment] and [Status] Commands
  #--------------------------------------------------------------------------
  def command_personal
    @status_window.select_last
    @status_window.activate
    @status_window.set_handler(:ok,     method(:on_personal_ok))
    @status_window.set_handler(:cancel, method(:on_personal_cancel))
  end
  #--------------------------------------------------------------------------
  # * [Formation] Command
  #--------------------------------------------------------------------------
  def command_formation
    @status_window.select_last
    @status_window.activate
    @status_window.set_handler(:ok,     method(:on_formation_ok))
    @status_window.set_handler(:cancel, method(:on_formation_cancel))
  end
  #--------------------------------------------------------------------------
  # * [Save] Command
  #--------------------------------------------------------------------------
  def command_save
    SceneManager.call(Scene_Save)
  end
  #--------------------------------------------------------------------------
  # * [Exit Game] Command
  #--------------------------------------------------------------------------
  def command_game_end
    SceneManager.call(Scene_End)
  end
  #--------------------------------------------------------------------------
  # * [OK] Personal Command
  #--------------------------------------------------------------------------
  def on_personal_ok
    case @command_window.current_symbol
    when :skill
      SceneManager.call(Scene_Skill)
    when :equip
      SceneManager.call(Scene_Equip)
    when :status
      SceneManager.call(Scene_Status)
    end
  end
  #--------------------------------------------------------------------------
  # * [Cancel] Personal Command
  #--------------------------------------------------------------------------
  def on_personal_cancel
    @status_window.unselect
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # * Formation [OK]
  #--------------------------------------------------------------------------
  def on_formation_ok
    if @status_window.pending_index >= 0
      $game_party.swap_order(@status_window.index,
                             @status_window.pending_index)
      @status_window.pending_index = -1
      @status_window.redraw_item(@status_window.index)
    else
      @status_window.pending_index = @status_window.index
    end
    @status_window.activate
  end
  #--------------------------------------------------------------------------
  # * Formation [Cancel]
  #--------------------------------------------------------------------------
  def on_formation_cancel
    if @status_window.pending_index >= 0
      @status_window.pending_index = -1
      @status_window.activate
    else
      @status_window.unselect
      @command_window.activate
    end
  end
  #--------------------------------------------------------------------------
  # * [Quest] Command
  #--------------------------------------------------------------------------
  def command_quest
    SceneManager.call(Scene_Quest)
  end
end
[/spoiler]


Il quarto script dovrete aggiungerlo sotto a tutti gli script della categoria Window, chiamandolo Window_Quest.
[spoiler]
Codice:
#==============================================================================
# ** Window_Quest
#------------------------------------------------------------------------------
#  Johnny 97's Quest System v1.1
#==============================================================================
class Window_Quest < Window_Selectable
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
    self.contents = Bitmap.new( width - 32, height - 32)
    self.opacity = 255
    refresh
    activate
  end
  
  def refresh
    self.contents.clear
    self.contents.draw_text(5, 5, 175, fitting_height(1), Johnny::Attuale + ":", 0)
    self.contents.draw_text(170, 5, width - 64, fitting_height(1), $questname, 0)
    self.contents.draw_text(5, 60, width - 64, fitting_height(1), Johnny::Descrizione + ":", 0)
    self.contents.draw_text(5, 80, width - 64, fitting_height(1), $questdescription1, $AllDescr)
    self.contents.draw_text(5, 100, width - 64, fitting_height(1), $questdescription2, $AllDescr)
    self.contents.draw_text(5, 120, width - 64, fitting_height(1), $questdescription3, $AllDescr)
    self.contents.draw_text(5, 140, width - 64, fitting_height(1), $questdescription4, $AllDescr)
    self.contents.draw_text(5, 160, width - 64, fitting_height(1), $questdescription5, $AllDescr)
    self.contents.draw_text(5, 180, width - 64, fitting_height(1), $questdescription6, $AllDescr)
    self.contents.draw_text(5, 200, width - 64, fitting_height(1), $questdescription7, $AllDescr)
    self.contents.draw_text(5, 220, width - 64, fitting_height(1), $questdescription8, $AllDescr)
    self.contents.draw_text(5, 260, width - 64, fitting_height(1), Johnny::Ricompense + ":", 0)
    self.contents.draw_text(5, 280, width - 64, fitting_height(1), $questreward1, $AllRicom)
    self.contents.draw_text(5, 300, width - 64, fitting_height(1), $questreward2, $AllRicom)
    self.contents.draw_text(5, 320, width - 64, fitting_height(1), $questreward3, $AllRicom)
    self.contents.draw_text(5, 340, width - 64, fitting_height(1), $questreward4, $AllRicom)
  end
end
[/spoiler]


Il quinto ed ultimo script, dovrete metterlo sotto tutti gli script della categoria Scene, e dovrete chiamarlo Scene_Quest.
[spoiler]
Codice:
#==============================================================================
# ** Scene_Quest
#------------------------------------------------------------------------------
#  Johnny 97's Quest System v1.1
#==============================================================================

class Scene_Quest < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start
    super
    @quest_window = Window_Quest.new
    @quest_window.set_handler(:cancel, method(:return_scene))
  end
end
[/spoiler]


BUG E CONFLITTI NOTI:
Compatibile soltanto con RPG Maker VX Ace.
Oh, quasi dimenticavo: Ovviamente lo script non funzionerà se modificherete il menù di base. Per il corretto funzionamento dello script è necessario che gli script Window_MenuCommand e Scene_Menu non vengano modificati dopo averli sostituiti con i miei script.

AGGIORNAMENTI:
L'attuale versione è la versione 1.0, in futuro probabilmente farò alcuni aggiornamenti. E' quindi importante lasciare agli script i nomi che vi ho detto di dare, così se io dovessi applicare qualche importante cambiamento, non avrete difficoltà a distinguere i vari script!

AGIORNAMENTO 11/10/2012: Dopo circa un'ora dal rilascio del mio script, ho l'esigenza di aggiornare alla versione 1.1
Nessun cambio che può portare problemi: Ho aggiunto 3 righe nella descrizione e le corrispondenti variabili per impostare i testi dal Call Script. Aggiornamenti più importanti avverranno in seguito.


RE: [SCRIPT]Simple Quest System - war10hacker - 12-10-2012

Dallo screen sembra carino Wink


RE: [SCRIPT]Simple Quest System - Johnny 97 - 12-10-2012

Non è chissa che cosa, è soltanto una finestra con del testo...
In seguito cercherò di migliorarlo, aggiungendo magari la possibilità di aggiungere più missioni alla volta, e altre funzioni...