09-19-2024, 08:09 AM
KDiurnalis VX + ACE
by Kyonides
Introduction
This is a 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.
There are three ways to open the Journal Menu.
KDiurnalis.open!
$scene = KDiurnalis::Scene.new
SceneManager.call(KDiurnalis::Scene)
To learn more about how to use my script please read the instructions embedded in it.
Note:
The demo includes examples of how you can easily add entry lines to an existing date.
It will automatically create a new date entry if the current date is different from the previous one.
The Scripts - Version 1.0.5
VX
Code:
# * 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
ACE
Code:
# * KDiurnalis ACE
# 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_Load#on_load_success
# * 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 Titles1 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!() SceneManager.goto(Scene) end
def after_load_scene
LOAD_OPENS_JOURNAL ? open! : SceneManager.goto(Scene_Map)
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, 52)
end
def set_text(text, align=0)
return if text == @text or align == @align
@text = text
@align = align
refresh
end
def refresh
contents.clear
draw_text(0, 0, contents_width, 26, @text, @align)
end
end
class KDListWindow < Window_Selectable
def initialize(wx, wy, w, h)
@data = []
super
@data = $game_party.journal_entries
refresh
select(0)
activate
end
def draw_item(index)
item = @data[index]
rect = item_rect(index)
rect.x += 4
rect.width -= 8
draw_text(rect, item.title)
end
def refresh
create_contents
item_max.times{|i| draw_item(i) }
end
def item_max() @data.any? ? @data.size : 1 end
def item() @data[@index] end
attr_writer :desc_window
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)
draw_text(0, 0, contents_width, 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 = contents_width
f = contents.font
f.bold = true
draw_text(0, 0, w, 24, @entry.title, 1)
draw_text(4, 32, w, 24, @entry.location)
f.bold = false
ly = 64
@entry.texts.each do |text|
draw_text(4, ly, w, 24, text)
ly += 24
end
ly = height - 52
pages = sprintf(PAGES_LABEL, @index + 1, @entries.size)
draw_text(0, ly, w, 24, pages, PAGES_LABEL_ALIGN)
end
def update
if Input.trigger?(:LEFT)
return Sound.play_buzzer if @total == 1
Sound.play_cursor
@index = (@index - 1) % @total
@entry = @entries[@index]
refresh
return
elsif Input.trigger?(: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
create_main_viewport
@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.title1(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.desc_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
super
@backdrop.bitmap.dispose
@backdrop.dispose
end
def update
Graphics.update
Input.update
case @stage
when :list
update_list
when :info
update_info
end
end
def update_list
@list_window.update
if Input.trigger?(:B)
Sound.play_cancel
SceneManager.call(Scene_Map)
return
elsif Input.trigger?(:C)
Sound.play_ok
@dummy_window.visible = false
open_last_entry
end
end
def update_info
@info_window.update
if Input.trigger?(:B)
Sound.play_cancel
unless SHOW_DATES
SceneManager.call(Scene_Map)
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.display_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_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
@index += 1
date = $game_party.journal_entries.last_date
entry = date.last_entry
codes = [101, 401]
command = @list[@index]
while codes.include?(command.code)
if command.code == 401
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
end
@index += 1
command = @list[@index]
end
@index -= 1
KDiurnalis.end_of_message!
true
end
def command_101
if KDiurnalis.use_message_window
process_journal_entries
else
kyon_diurnalis_gm_int_comm_101
end
end
end
class Scene_Load
def on_load_success
Sound.play_load
fadeout_all
$game_system.on_after_load
KDiurnalis.after_load_scene
end
end
Terms & Conditions
Free as in beer for non commercial games.
Contact me if you want to go commercial. (There will be an inexpensive charge for this script only.)
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9
Maranatha!
The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.
My Original Stories (available in English and Spanish)
List of Compiled Binary Executables I have published...
HiddenChest & Roole
Give me a free copy of your completed game if you include at least 3 of my scripts!
Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Maranatha!
The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.
My Original Stories (available in English and Spanish)
List of Compiled Binary Executables I have published...
HiddenChest & Roole
Give me a free copy of your completed game if you include at least 3 of my scripts!
Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE