################################################################ # RETCON Library # Journal Version 1.0 # Author: Matt (McDohl) # Script is free for usage, but please give credit where credit # is due. :) ################################################################ # PURPOSE # This script adds a journal-type feature to your game. Passages # are defined in the matrix, and full customization allows for # modification of the journal at any time. # # Lot of feature creep happened in this script. Need significant # assistance in making sure all the bugs are out. ################################################################ # METHODOLOGY # Four new classes are created: # # Page_Selector: Base Class for title and main journal functions # Window_Journal: Subset of Window_Selectable, outlines the journal window # and the page displays. # Window_JournalTitle: Subset of Window_Selectable, displays the correct title # in the window. # Scene_Journal: Displays the journal appropriately. # # In addition, three classes are modified # # Game_Party: The global function is modified and allows for reference/saving # the journal. # Scene_Menu: Displays the journal function to the menu. # Window_MenuCommand: Calls the journal function from the menu. ################################################################ # USAGE # In the customization section, modify the matrix to display all the journal # entries. Each array entry contains an array with the following: # Entry[#} = ["Text for that journal entry", "Title for that entry"] # If you are not using titles, you do not have to add them to the entry. # Said entry will look like this # Entry[#] = ["Text for that journal entry"] # # To modify entry availability in game, reference the following function: # RETCON::Journal::journal_activate(#) # Wherein # is replaced with the number of the entry in the matrix. To remove # from displaying a page, use this function in a similar manner. # RETCON::Journal::journal_deactivate(#) # # To gray out the Journal in the menu, reference the following in a script call # in your game: # RETCON::Journal::journal_access(true) (makes the journal accessible) # RETCON::Journal::journal_access(false) (makes the journal inaccessible) # # To modify journal entries after the game is started, use the following syntax # when using a script call function: # RETCON::Journal::modify_entry(#, "Text for the new entry.") # RETCON::Journal::modify_title(#, "Title for the new entry.") # Where the # is the number of the journal entry and/or title you wish to be # modified. ################################################################ # CUSTOMIZATION module RETCON module Journal #Name for the journal in the menu Name = "Journal" Entry = Array.new #yo dawg, I heard you like matrices, so I put an array inside your array #so you can arrange while you arrange. #in other words, edit here. #Use n to delineate line breaks if not using the RETCON Word Wrap script. Entry[0] = ["This is entry #1 of the journal. As you can see, it functions as a generic horizontal scrolling window for you to display whatever you'd like here.", "TITLE: #1"] Entry[1] = ["This is entry #2 of the journal.", "TITLE: #2"] Entry[2] = ["This is entry #3 of the journal.", "TITLE: #3"] Entry[3] = ["This is entry #4 of the journal.", "TITLE: #4"] Entry[4] = ["This is entry #5 of the journal.", "TITLE: #5"] #width of the journal display window. set to maximum width, 544 JWidth = 544 #Number of lines to display for the journal. Keep to even numbers if using #the default font. Fool around with this value if using a different one. LineDisplay = 10 #X and Y positions of the journal window JournalXPos = 0 JournalYPos = 48 #Display the current journal entry / Display total number of journal entries. PageNumbers = true #Position for the page numbers. PageNumXPos = 435 PageNumYPos = 375 #Create titles for journal entries. UseTitles = true #Color of text in the title. Corresponds to your window skin set colors. #0 for default. TitleColor = 6 #Position and stats for the title window length. TitleXPos = 0 TitleYPos = 0 TitleWidth = JWidth TitleHeight = 48 ################################################################ #Customization ends here! #You shouldn't really edit below here, but if you know what #you're doing, it won't be a big deal. Edit at your own risk and #all that jazz. ################################################################ def self.journal_activate(journalpage) $game_party.journal_hash[journalpage] = true end def self.journal_deactivate(journalpage) $game_party.journal_hash[journalpage] = false end def self.journal_access(journalbool) $game_party.journal_active = journalbool end def self.modify_entry(entrynum, entrytext) $game_party.journal[entrynum][0] = entrytext end def self.modify_title(entrynum, titletext) $game_party.journal[entrynum][1] = titletext end end end ################# #CLASS ORIGINALS# ################# #class to reference which page the journal is on, used by both title #and journal window classes. class Page_Selector attr_accessor :currentpage #the currently displayed journal page attr_accessor :maxpage #the maximum number of pages to show attr_accessor :changeit #boolean reference for update method attr_accessor :currentindex #index used for total number of true pages def initialize @currentpage = 0 @currentindex = 0 @maxpage = 0 @changeit = false @errorcheck = false @justopened = true generate_pages if @errorcheck == true @currentpage = 0 @currentindex = 0 else page_right end end #detects keyinput, left or right def change_page if @errorcheck == false page_right(Input.trigger?(:RIGHT)) if Input.repeat?(:RIGHT) page_left (Input.trigger?(:LEFT)) if Input.repeat?(:LEFT) end end #increments the index when going right def page_right(wrap = false) check_page_right if @justopened == true @currentpage = 0 @justopened = false end while $game_party.journal_hash[@currentpage] == false check_page_right end finish_change @currentindex += 1 if @currentindex > @maxpage @currentindex = 1 end end def check_page_right @currentpage += 1 if @currentpage > $game_party.journal.length - 1 @currentpage = 0 end end #decrements the index when going left def page_left(wrap = false) check_page_left while $game_party.journal_hash[@currentpage] == false check_page_left end finish_change @currentindex -= 1 if @currentindex <= 0 @currentindex = @maxpage end end def check_page_left @currentpage -= 1 if @currentpage < 0 @currentpage = $game_party.journal.length - 1 end end #plays sound when browsing journal pages. def finish_change @changeit = true if @maxpage >= 2 Sound::play_cursor end end #implements what to display versus what's in the hash. def generate_pages $game_party.journal_hash.each do |key, value| if value == true @maxpage += 1 end end if @maxpage == 0 @errorcheck = true end end end class Window_Journal < Window_Selectable def initialize @page = Page_Selector.new super(RETCON::Journal::JournalXPos, RETCON::Journal::JournalYPos, RETCON::Journal::JWidth, window_height) determine_ox init_counter_display refresh end #window height, as defined in module def window_height wh = line_height * RETCON::Journal::LineDisplay return wh end #adds left window arrow def determine_ox if @page.maxpage < 2 self.ox = 0 else self.ox = 1 end end #adds right window arrow. def contents_width if @page.maxpage < 2 return width - 24 else return width + 2 end end #used for drawing the out-of-window counter display #first function is inits def init_counter_display @journalpages = Sprite.new @journalpages.bitmap = Bitmap.new(Graphics.width, Graphics.height) @journalpages.z = 100 end #function used to create out-of-window counter def create_counter_display init_counter_display rect = Rect.new(RETCON::Journal::PageNumXPos, RETCON::Journal::PageNumYPos, 75, 24) @journalpages.bitmap.draw_text(rect, @page.currentindex.to_s + " / " + @page.maxpage.to_s, 2) end #update used to detect functions. def update super @page.change_page if (@page.changeit == true) refresh @page.changeit = false end end #draws the journal window. def create_journal_display entry = "" if @page.maxpage == 0 entry = "There are currently no entries." else entry = $game_party.journal[@page.currentpage][0].to_str end if !$imported.nil? && $imported["RETCON-wordwrap"] == true draw_text(0, 0, Graphics.width, Graphics.height, entry) else draw_text_ex(0, 0, entry) end end def refresh super contents.clear @journalpages.dispose create_counter_display create_journal_display end end class Window_JournalTitle < Window_Base def initialize super(RETCON::Journal::TitleXPos, RETCON::Journal::TitleYPos, RETCON::Journal::TitleWidth, RETCON::Journal::TitleHeight) @pagetitle = Page_Selector.new refresh end #the titlefixins def update super @pagetitle.change_page if (@pagetitle.changeit == true) refresh @pagetitle.changeit = false end end def create_title title = "" if @pagetitle.maxpage == 0 title = "Not Applicable" else title = $game_party.journal[@pagetitle.currentpage][1].to_str end change_color(text_color(RETCON::Journal::TitleColor)) draw_text(0, 0, Graphics.width, line_height, title , 1) change_color(normal_color) end def refresh contents.clear create_title end end class Scene_Journal < Scene_MenuBase def initialize super journal_window end #short and simple scene, creates the window classes appropriately. def journal_window @journalwindow = Window_Journal.new if RETCON::Journal::UseTitles == true @journalwindowtitle = Window_JournalTitle.new end @journalwindow.set_handler(:cancel, method(:backout)) @journalwindow.active = true end def backout SceneManager.return end end ############### #CLASS ADDENDA# ############### #adds journal to the menu function class Window_MenuCommand < Window_Command alias journal_command add_original_commands def add_original_commands journal_command add_command(RETCON::Journal::Name, :journal, $game_party.journal_active) end end #displays journal to the menu class Scene_Menu < Scene_MenuBase alias journal_command_window create_command_window def create_command_window journal_command_window #the addition @command_window.set_handler(:journal, method(:command_journal)) end def command_journal SceneManager.call(Scene_Journal) end end class Game_Party < Game_Unit attr_accessor :journal attr_accessor :journal_hash attr_accessor :journal_active #creates the journal alias journal_retain_previous initialize def initialize journal_retain_previous @journal = Array.new @journal_hash = Hash.new @journal_active = true make_the_journal end #initializes the journal hash. def make_the_journal @journal = RETCON::Journal::Entry i = 0 while i < @journal.length @journal_hash.merge! i => false i += 1 end end end