public

Rpg Maker Developers Group

Simple enough for a child, powerful enough for a developer

2 Followers
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


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 download

License / 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.

#rgss2#script-archive

Replies (0)

No replies yet.

0 replies 1 view

Log in to reply.

User Avatar