# * KDiurnalis VX
# Scripter : Kyonides Arkanthes
# v 1.0.5 - 2022-06-16
# * Non Plug & Play Script * #
# The Party's Journal Script!
# Tweak this script's CONSTANTS in order to customize the Journal Menu's GUI.
# You can find them under the KDiurnalis module.
# * Overwritten Method * #
# Scene_File#do_load
# * Script Calls * #
# - Open Journal Scene - 2 Options
# $scene = KDiurnalis::Scene.new
# KDiurnalis.open!
# - Add New Journal Page Steps - #
# -- Step 1
# Location: can be replaced with a "String" or :map for current map name.
# $game_party.add_journal_entry("Title", Location)
# -- Step 2
# Add as many Message Windows and lines of text as you wish!
# -- Step 3
# - Stop Using Message Windows as Journal Entry's Page Contents
# Simply stop adding any more message windows!
module KDiurnalis
LOAD_OPENS_JOURNAL = true
SHOW_DATES = nil
# Place the Backdrop in the Pictures directory.
# Options: "Filename" or nil
BACKDROP = "backdrop circles blue"
TITLE = "%s's Journal"
TITLE_ALIGN = 1
NO_ENTRY = "No Entry Found"
module Start
TITLE = "My New Adventure"
LOCATION = "Home"
TEXT = []
TEXT << "My history begins today."
TEXT << "I am very excited indeed."
end
PAGES_FOUND = "%s Pages Found"
PAGES_LABEL = "Page %s/%s"
PAGES_LABEL_ALIGN = 2
HELP_WIN_OPACITY = 160
# Window's Coordinates = [X, Y, Width, Height, Opacity]
LIST_WIN_COORD = [8, 76, 160, 320, 160]
DUMMY_WIN_COORD = [176, 76, 360, 84, 160]
INFO_WIN_COORD = [176, 76, 360, 320, 160]
# * End of Setup * #
extend self
attr_accessor :use_message_window
def open!() $scene = Scene.new end
def after_load_scene
LOAD_OPENS_JOURNAL ? open! : $scene = Scene_Map.new
end
def end_of_entry!() @use_message_window = nil end
alias :end_of_message! :end_of_entry!
class KDJournal
def initialize
@dates = []
date = KDDate.new
entry = KDEntry.new(Start::TITLE.dup)
entry.location = Start::LOCATION
entry.texts = Start::TEXT.dup
date.add_entry(entry)
add_date(date)
end
def add_date(date)
@dates.unshift(date)
@last_date = date
end
def map(&blk) @dates.map(&blk) end
def last() @dates[-1] end
def [](pos) @dates[pos] end
def empty?() @dates.empty? end
def any?() @dates.any? end
def size() @dates.size end
attr_reader :dates, :last_date
end
class KDDate
def initialize
time = Time.now
@year = time.year
@month = time.month
@month_name = time.strftime("%b")
@day = time.mday
@day_name = time.strftime("%a")
@title = "#{@month_name} #{@day}, #{@year}"
@entries = []
end
def same_date?(nyear, nmonth, nday)
nyear == @year && nmonth == @month && nday == @day
end
def add_entry(entry)
@entries << entry
@last_entry = entry
end
attr_reader :year, :month, :month_name, :day, :day_name, :entries, :last_entry
attr_accessor :title
end
class KDEntry
def initialize(new_title)
@title = new_title
@location = ""
@texts = []
end
attr_reader :title
attr_accessor :texts, :location
end
class KDHelpWindow < Window_Base
def initialize
x, w = 80, Graphics.width
super(x, 12, w - x * 2, 56)
end
def set_text(text, align=0)
return if text == @text or align == @align
@text = text
@align = align
refresh
end
def refresh
contents.clear
contents.draw_text(0, 0, width - 32, 24, @text, @align)
end
end
class KDListWindow < Window_Selectable
def initialize(wx, wy, w, h)
@data = []
super
@data = $game_party.journal_entries
refresh
@index = 0
end
def draw_item(index)
item = @data[index]
rect = item_rect(index)
rect.x += 4
rect.width -= 8
contents.draw_text(rect, item.title)
end
def refresh
create_contents
item_max.times{|i| draw_item(i) }
end
def update_help() @help_window.index = @index end
def item_max() @data.any? ? @data.size : 1 end
def item() @data[@index] end
end
class KDDummyWindow < Window_Base
def initialize(wx, wy, w, h)
super
@index = 0
refresh
end
def refresh
contents.clear
date = $game_party.journal_entries[@index]
pages = sprintf(PAGES_FOUND, date.entries.size)
contents.draw_text(0, 0, width - 32, 24, pages)
end
def index=(pos)
return if @index == pos
@index = pos
refresh
end
end
class KDInfoWindow < Window_Base
def show_entries(entry)
self.visible = true
@entries = entry
@total = @entries.size
@index = @total - 1
@entry = @entries.last
refresh
end
def refresh
contents.clear
w = width - 32
f = contents.font
f.bold = true
contents.draw_text(0, 0, w, 24, @entry.title, 1)
contents.draw_text(4, 32, w, 24, @entry.location)
f.bold = false
ly = 64
@entry.texts.each do |text|
contents.draw_text(4, ly, w, 24, text)
ly += 24
end
ly = height - 56
pages = sprintf(PAGES_LABEL, @index + 1, @entries.size)
contents.draw_text(0, ly, w, 24, pages, PAGES_LABEL_ALIGN)
end
def update
if Input.trigger?(Input::LEFT)
return Sound.play_buzzer if @total == 1
Sound.play_cursor
@index = (@index - 1) % @total
@entry = @entries[@index]
refresh
return
elsif Input.trigger?(Input::RIGHT)
return Sound.play_buzzer if @total == 1
Sound.play_cursor
@index = (@index + 1) % @total
@entry = @entries[@index]
refresh
end
end
def clear() contents.clear end
end
class Scene < Scene_Base
def start
@stage = SHOW_DATES ? :list : :info
lx, ly, lw, lh, lbo = LIST_WIN_COORD
dx, dy, dw, dh, dbo = DUMMY_WIN_COORD
ix, iy, iw, ih, ibo = INFO_WIN_COORD
@backdrop = Sprite.new
if BACKDROP
@backdrop.bitmap = Cache.picture(BACKDROP).dup
else
@backdrop.bitmap = SceneManager.background_bitmap
@backdrop.color.set(16, 16, 16, 128)
end
@help_window = KDHelpWindow.new
text = sprintf(TITLE, $game_party.name)
@help_window.set_text(text, TITLE_ALIGN)
@help_window.back_opacity = HELP_WIN_OPACITY
@list_window = KDListWindow.new(lx, ly, lw, lh)
@list_window.back_opacity = lbo
@list_window.visible = SHOW_DATES
@dummy_window = KDDummyWindow.new(dx, dy, dw, dh)
@dummy_window.back_opacity = dbo
@dummy_window.visible = SHOW_DATES
@list_window.help_window = @dummy_window
@info_window = KDInfoWindow.new(ix, iy, iw, ih)
@info_window.back_opacity = ibo
@info_window.visible = !SHOW_DATES
open_last_entry
end
def open_last_entry
if SHOW_DATES
date = @list_window.item
@info_window.show_entries(date.entries)
else
entries = $game_party.journal_entries.map{|date| date.entries }
entries = entries.flatten
@info_window.show_entries(entries)
end
@stage = :info
end
def terminate
@help_window.dispose
@list_window.dispose
@dummy_window.dispose
@info_window.dispose
@backdrop.bitmap.dispose
@backdrop.dispose
end
def update
case @stage
when :list
update_list
when :info
update_info
end
end
def update_list
@list_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
$scene = Scene_Map.new
return
elsif Input.trigger?(Input::C)
Sound.play_decision
@dummy_window.visible = false
open_last_entry
end
end
def update_info
@info_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
unless SHOW_DATES
$scene = Scene_Map.new
return
end
@info_window.visible = false
@info_window.clear
@dummy_window.visible = true
@stage = :list
end
end
end
end
class Game_Party
alias :kyon_diurnalis_gm_pty_init :initialize
def initialize
kyon_diurnalis_gm_pty_init
@journal_entries = KDiurnalis::KDJournal.new
end
def add_journal_entry(title, place)
place = $game_map.map_name if place == :map
date = @journal_entries.last_date
time = Time.now
KDiurnalis.use_message_window = true
entry = KDiurnalis::KDEntry.new(title)
entry.location = place
if date and date.same_date?(time.year, time.month, time.day)
date.add_entry(entry)
else
date = KDiurnalis::KDDate.new
date.add_entry(entry)
@journal_entries.add_date(date)
end
end
def total_journal_entries?(n)
@journal_entries.size == n
end
def last_journal_entry_pages?(n)
@journal_entries.last.entries.size == n
end
attr_reader :journal_entries
end
class Game_Map
alias :kyon_diurnalis_gm_map_setup :setup
def setup(map_id)
kyon_diurnalis_gm_map_setup(map_id)
@map_name = load_data("Data/MapInfos.rvdata")[map_id].name
end
attr_reader :map_name
end
class Game_Event
def name() @event.name end
def name=(text) @event.name = text end
end
class Game_Interpreter
alias :kyon_diurnalis_gm_int_comm_101 :command_101
def process_journal_entries
date = $game_party.journal_entries.last_date
entry = date.last_entry
codes = [101, 401]
command = @list[@index]
while codes.include?(command.code)
line = command.parameters[0]
line.gsub!(/\\N\[([0-9]+)\]/i) { $game_actors[$1.to_i].name }
line.gsub!(/\\E\[([0-9]+)\]/i) { $game_map.events[$1.to_i].name }
entry.texts << line if command.code == 401
@index += 1
command = @list[@index]
end
KDiurnalis.end_of_message!
false
end
def command_101
if KDiurnalis.use_message_window
process_journal_entries
else
kyon_diurnalis_gm_int_comm_101
end
end
end
class Scene_File
def do_load
file = File.open(@savefile_windows[@index].filename, "rb")
read_save_data(file)
file.close
KDiurnalis.after_load_scene
RPG::BGM.fade(1500)
Graphics.fadeout(60)
Graphics.wait(40)
return if KDiurnalis.show_last_entry
@last_bgm.play
@last_bgs.play
end
end