Preserved forum archive. This topic stores the original first post and locally mirrored RPG Maker Web attachments when available. It is posted by the BMMPlay archive account, not by the original creator.
Original Source
- Original title: KDiurnalis VX
- Original author: kyonides
- Original date: June 16, 2022
- Source thread: https://forums.rpgmakerweb.com/threads/kdiurnalis-vx.148589/
- Source forum path: Game Development Engines > Ruby Game System (RGSS) Scripts > RGSS2 Scripts (RMVX)
Summary
KDiurnalis VX version 1.0.5 by Kyonides Arkanthes Introduction
Archived First Post
KDiurnalis VX
version 1.0.5
by Kyonides Arkanthes
version 1.0.5
by Kyonides Arkanthes
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 two ways to open the Journal Menu.
$scene = KDiurnalis::Scene.new
KDiurnalis.open!
To learn more about how to use my script please read the instructions embedded in it.
Notes:
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.
Now it features stuff like automatic substitutions of tags like \n[1] or \e[1]!
The Script
Ruby:
# * 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
DOWNLOAD DEMO
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.)
Downloads / Referenced Files
Log in to download
Log in, then follow the RPG Maker Developers Group to see these download links.
Log in to downloadLicense / Terms Note
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.)
Creator Claims / Removal
If you are the original creator and want this listing reassigned, edited, or removed, join BMMPlay and contact the moderators with proof that matches the original RPG Maker Web profile, linked GitHub, itch.io page, or another public creator identity.
Replies (0)
No replies yet.
0
replies
1
view
Topic Summary
Loading summary...