Made for a request here.
Features:
[1] Game starting by selecting a Chapter.
[2] Unlock-able new chapters.
[3] Each Chapter able to start with its own map & starting characters.
[4] Inheritable save files for each chapter.
[5] Can set up to 10 Chapters max.
[6] Change-able Background/Text
[7] Able to set whether or not to reset character's level
Snap-Shot:
How to Use:
[1] Paste script below Material and above Main
[2] Set up data accordingly in SETTINGS AREA in the script.
[3] Use this script call at the end of each chapter to enable next chapter.
chapter_cleared
Compatibility:
This script modifies the Title Scene's New Game Command, but the rest are properly aliased.
You can safely put this script below other custom scripts without worrying much about conflicts.
Terms of Use:
Free for both Commercial and Non-Commercial.
Script:
#==============================================================================# ■ Meow Face Chapter Selection#------------------------------------------------------------------------------# Select Chapter to Start Game#==============================================================================# How to Use:# [1] Put this script below Material and above Main# [2] Set up the required data in SETTINGS AREA below# [3] At the end of each chapter, use this script call to save file# chapter_cleared#==============================================================================module MF_CHAPTER#==============================================================================# SETTINGS AREA#==============================================================================#------------------------------------------------------------------------------# How many chapters are there (1 to 10 MAX)#------------------------------------------------------------------------------ MAXCHAPTER = 10#------------------------------------------------------------------------------# Background picture (in Graphics\Titles1 folder)#------------------------------------------------------------------------------ BACKGROUND = "Fountain"#------------------------------------------------------------------------------# Title#------------------------------------------------------------------------------ TITLE = "SELECT CHAPTER"#------------------------------------------------------------------------------# Chapter's Name# Starting from top down, Chapter 1, Chapter 2, etc etc#------------------------------------------------------------------------------ NAME = [ "Chapter One", "Chapter Two", "Chapter Three", "Chapter Four", "Chapter Five", "Chapter Six", "Chapter Seven", "Chapter Eight", "Chapter Nine", "Chapter Ten", ] #Do Not Remove#------------------------------------------------------------------------------# Chapter's Description# Starting from top down, Chapter 1, Chapter 2, etc etc#------------------------------------------------------------------------------ DESC = [ "Chapter 1 Descriptions", "Chapter 2 Descriptions", "Chapter 3 Descriptions", "Chapter 4 Descriptions", "Chapter 5 Descriptions", "Chapter 6 Descriptions", "Chapter 7 Descriptions", "Chapter 8 Descriptions", "Chapter 9 Descriptions", "Chapter 10 Descriptions", ] #Do Not Remove#------------------------------------------------------------------------------# Starting Map for each Chapter# [MapID, StartX, StartY]# Starting top down from Chapter 1 to Chapter 10#------------------------------------------------------------------------------ MAP = [ [1,1,1], [2,1,7], [3,12,16], [4,1,1], [5,1,1], [6,1,1], [7,1,1], [8,1,1], [9,1,1], [10,1,1], ] #Do Not Remove#------------------------------------------------------------------------------# Starting Actors for each Chapter# Starting top down from Chapter 1 to Chapter 10#------------------------------------------------------------------------------ ACTORS = [ [1,2], [1,2,3,4], [1,2,3], [2,3,4,5], [1,2,3,4], [1,2,3,4], [1,2,3,4], [1,2,3,4], [1,2,3,4], [1,2,3,4], ] #Do Not Remove#------------------------------------------------------------------------------# Reset Actor's Level? true/false# Automatic set to true if previous chapter load file = nil#------------------------------------------------------------------------------ RESET = false#------------------------------------------------------------------------------# Data Loading for each Chapter# This loads the data of the previous chapters during chapter selection# So set up the file for each chapter accordingly# Starting top down from Chapter 1 to Chapter 10# nil = No load file#------------------------------------------------------------------------------ LOAD_FILE = [ nil, "Chapter1_Cleared.rvdata2", "Chapter2_Cleared.rvdata2", "Chapter3_Cleared.rvdata2", "Chapter4_Cleared.rvdata2", "Chapter5_Cleared.rvdata2", "Chapter6_Cleared.rvdata2", "Chapter7_Cleared.rvdata2", "Chapter8_Cleared.rvdata2", "Chapter9_Cleared.rvdata2", ] #Do Not Remove#------------------------------------------------------------------------------# Save Data's Name#------------------------------------------------------------------------------ SAVE_FILE = [ "Chapter1_Cleared.rvdata2", "Chapter2_Cleared.rvdata2", "Chapter3_Cleared.rvdata2", "Chapter4_Cleared.rvdata2", "Chapter5_Cleared.rvdata2", "Chapter6_Cleared.rvdata2", "Chapter7_Cleared.rvdata2", "Chapter8_Cleared.rvdata2", "Chapter9_Cleared.rvdata2", "Chapter10_Cleared.rvdata2", ] #Do Not Remove#==============================================================================# END OF SETTINGS AREA# !!EDIT BEYOND THIS LINE AT YOUR OWN RISK!!#==============================================================================endmodule DataManager class <<self alias meow_god create_game_objects alias meow_load extract_save_contents alias meow_save make_save_contents end def self.make_save_contents meowdata = meow_save meowdata[:chapter] = $game_chapter meowdata end def self.extract_save_contents(contents) meow_load(contents) $game_chapter = contents[:chapter] end def self.make_save_party contents = {} contents[:actors] = $game_actors contents[:party] = $game_party contents[:player] = $game_player contents end def self.extract_party(contents) $game_actors =contents[:actors] $game_party = contents[:party] $game_player = contents[:player] end def self.save_chapter(chapter) filename = MF_CHAPTER::SAVE_FILE[chapter] File.open(filename, "wb") do |file| $game_system.on_before_save Marshal.dump(make_save_party, file) end return true end def self.load_chapter(chapter) filename = MF_CHAPTER::LOAD_FILE[chapter] File.open(filename, "rb") do |file| extract_party(Marshal.load(file)) end return true end def self.create_game_objects meow_god $game_chapter = Game_Chapter.new end def self.setup_chapter chapter = $game_chapter.id load_chapter(chapter) if MF_CHAPTER::LOAD_FILE[chapter] != nil $game_party.setup_members(chapter) $game_map.setup(MF_CHAPTER::MAP[chapter][0]) $game_player.moveto(MF_CHAPTER::MAP[chapter][1], MF_CHAPTER::MAP[chapter][2]) $game_player.refresh Graphics.frame_count = 0 endendclass Game_Party < Game_Unit def setup_members(n) if MF_CHAPTER::LOAD_FILE[$game_chapter.id] != nil @actors.each do |m| $game_actors[m].setup(m) if MF_CHAPTER::RESET == true $game_actors[m].hp = $game_actors[m].mhp $game_actors[m].mp = $game_actors[m].mmp end end @actors = [] @meowparty = MF_CHAPTER::ACTORS[n] @meowparty.each do |meow| $game_party.add_actor(meow) end endendclass Game_Chapter attr_accessor :id def initialize @id = 0 end def set(n) @id = n endendclass Game_Interpreter def chapter_cleared DataManager.save_chapter($game_chapter.id) endendclass Window_Chapter < Window_Base def initialize super(0, 0, Graphics.width, Graphics.height) self.opacity = 0 draw_horz_line(Graphics.height - 100) draw_horz_line(Graphics.height - 36) draw_horz_line(68); draw_horz_line(69) draw_horz_line(8); draw_horz_line(7) draw_title end def window_width Graphics.width end def window_height Graphics.height end def draw_horz_line(y) line_y = y + line_height / 2 - 1 contents.fill_rect(0, line_y, contents_width, 2, line_color) end def line_color color = normal_color color.alpha = 48 color end def draw_title contents.font.size = 64 contents.font.bold = true draw_text((Graphics.width/2) - (320/2), 18, 320, 68, MF_CHAPTER::TITLE) contents.font.size = Font.default_size contents.font.bold = false endendclass Window_ChapterSelect < Window_Command def initialize super(0,0) update_placement self.opacity = 0 create_help_window end def window_width return 180 end def window_height fitting_height(6) end def update_placement self.x = (Graphics.width - width) / 2 self.y = ((Graphics.height - height) / 2) - 12 end def create_help_window @help_window = Window_Help.new @help_window.y = Graphics.height - @help_window.height + 4 @help_window.opacity = 0 end def make_command_list add_command(MF_CHAPTER::NAME[0], :ch1) add_command(MF_CHAPTER::NAME[1], :ch2, File.exist?(MF_CHAPTER::SAVE_FILE[0]))if MF_CHAPTER::MAXCHAPTER >= 2 add_command(MF_CHAPTER::NAME[2], :ch3, File.exist?(MF_CHAPTER::SAVE_FILE[1])) if MF_CHAPTER::MAXCHAPTER >= 3 add_command(MF_CHAPTER::NAME[3], :ch4, File.exist?(MF_CHAPTER::SAVE_FILE[2])) if MF_CHAPTER::MAXCHAPTER >= 4 add_command(MF_CHAPTER::NAME[4], :ch5, File.exist?(MF_CHAPTER::SAVE_FILE[3])) if MF_CHAPTER::MAXCHAPTER >= 5 add_command(MF_CHAPTER::NAME[5], :ch6, File.exist?(MF_CHAPTER::SAVE_FILE[4])) if MF_CHAPTER::MAXCHAPTER >= 6 add_command(MF_CHAPTER::NAME[6], :ch7, File.exist?(MF_CHAPTER::SAVE_FILE[5])) if MF_CHAPTER::MAXCHAPTER >= 7 add_command(MF_CHAPTER::NAME[7], :ch8, File.exist?(MF_CHAPTER::SAVE_FILE[6])) if MF_CHAPTER::MAXCHAPTER >= 8 add_command(MF_CHAPTER::NAME[8], :ch9, File.exist?(MF_CHAPTER::SAVE_FILE[7])) if MF_CHAPTER::MAXCHAPTER >= 9 add_command(MF_CHAPTER::NAME[9], :ch10, File.exist?(MF_CHAPTER::SAVE_FILE[8])) if MF_CHAPTER::MAXCHAPTER >= 10 end def process_cursor_move super if @index <= 1 @help_window.set_text(MF_CHAPTER::DESC[@index]) else if File.exist?(MF_CHAPTER::SAVE_FILE[@index-1]) text = MF_CHAPTER::DESC[@index] else text = "???" end @help_window.set_text(text) end endendclass Scene_Title < Scene_Base def command_new_game SceneManager.call(Scene_Chapter) endendclass Scene_Chapter < Scene_Base def start super create_background2 create_back_window create_command_window end def create_background2 @spritech = Sprite.new @spritech.bitmap = Cache.title1(MF_CHAPTER::BACKGROUND) @spritech.tone.set(0, 0, 0, 180) end def terminate super @spritech.bitmap.dispose if @spritech @spritech.dispose if @spritech end def create_back_window @back_window = Window_Chapter.new end def create_command_window @command_window = Window_ChapterSelect.new @command_window.set_handler(:ch1, method(:chapter)) @command_window.set_handler(:ch2, method(:chapter)) @command_window.set_handler(:ch3, method(:chapter)) @command_window.set_handler(:ch4, method(:chapter)) @command_window.set_handler(:ch5, method(:chapter)) @command_window.set_handler(:ch6, method(:chapter)) @command_window.set_handler(:ch7, method(:chapter)) @command_window.set_handler(:ch8, method(:chapter)) @command_window.set_handler(:ch9, method(:chapter)) @command_window.set_handler(:ch10, method(:chapter)) @command_window.set_handler(:cancel, method(:return_scene)) end def chapter DataManager.create_game_objects case @command_window.current_symbol when :ch1; $game_chapter.set(0) when :ch2; $game_chapter.set(1) when :ch3; $game_chapter.set(2) when :ch4; $game_chapter.set(3) when :ch5; $game_chapter.set(4) when :ch6; $game_chapter.set(5) when :ch7; $game_chapter.set(6) when :ch8; $game_chapter.set(7) when :ch9; $game_chapter.set(8) when :ch10; $game_chapter.set(9) end DataManager.setup_chapter fadeout_all $game_map.autoplay SceneManager.goto(Scene_Map) endend
Final Update:
All cleaned up and aliased
The only overwrite method is the Title Scene's New Game Command.
You can now safely put this script below all other scripts without having to worry much about conflicts.