累计送礼: 0 个 累计收礼: 1 个 TA的每日心情 开心 前天 04:10
签到天数: 209 天
连续签到: 2 天
[LV.7]常住居民III
管理员
VIP
7
卡币
22949
OK点
16
推广点
0
同能卷
50
积分 28314
KDiurnalis XP
versions 1.0.6 & 1.1.0
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 - version 1.0.6
Ruby:
# * KDiurnalis XP Kiwi # Scripter : Kyonides Arkanthes # v 1.0.6 - 2022-06-17 # * 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. # * Aliased Method * # # Scene_Load#on_decision # * 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 CHANGE_VIEWPORT_COLOR = true SHOW_DATES = nil # Place the Backdrop in the Titles directory. # Options: "Filename" or nil BACKDROP = nil #"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 = [16, 84, 180, 384, 160] DUMMY_WIN_COORD = [224, 84, 388, 84, 160] INFO_WIN_COORD = [224, 84, 388, 352, 160] # * End of Setup * # extend self attr_accessor :use_message_window def open!() $scene = Scene.new end def after_load_scene open! if LOAD_OPENS_JOURNAL 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) self.contents = Bitmap.new(width - 32, height - 32) 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 @item_max = @data.size refresh @index = 0 end def draw_item(index) item = @data[index] contents.draw_text(4, index * 32, width - 32, 32, item.title) end def refresh self.contents = Bitmap.new(width - 32, row_max * 32) @item_max.times{|i| draw_item(i) } end def update_help() @help_window.index = @index end def item() @data[@index] end end class KDDummyWindow < Window_Base def initialize(wx, wy, w, h) super @index = 0 self.contents = Bitmap.new(width - 32, h - 32) 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 self.contents = Bitmap.new(width - 32, height - 32) 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 $game_system.se_play($data_system.buzzer_se) if @total == 1 $game_system.se_play($data_system.cursor_se) @index = (@index - 1) % @total @entry = @entries[@index] refresh return elsif Input.trigger?(Input::RIGHT) return $game_system.se_play($data_system.buzzer_se) if @total == 1 $game_system.se_play($data_system.cursor_se) @index = (@index + 1) % @total @entry = @entries[@index] refresh end end def clear() contents.clear end end class Scene def main start Graphics.transition while @stage Graphics.update Input.update update end Graphics.freeze terminate end def create_backdrop if BACKDROP @backdrop = Sprite.new @backdrop.bitmap = RPG::Cache.title(BACKDROP).dup else @backdrop = Spriteset_Map.new @backdrop.alter_viewport_color if CHANGE_VIEWPORT_COLOR end end 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 create_backdrop @help_window = KDHelpWindow.new text = sprintf(TITLE, $game_party.leader.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 if BACKDROP @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) $game_system.se_play($data_system.cancel_se) $scene = Scene_Map.new return @stage = nil elsif Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) @dummy_window.visible = false open_last_entry end end def update_info @info_window.update if Input.trigger?(Input::B) $game_system.se_play($data_system.cancel_se) unless SHOW_DATES $scene = Scene_Map.new return @stage = nil end @info_window.visible = false @info_window.clear @dummy_window.visible = true @stage = :list end end end end unless $HIDDENCHEST or $MKXP module Graphics def self.width() 640 end def self.height() 480 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 def leader() @actors[0] 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.rxdata")[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 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 command = @list[@index] codes = [101, 401] 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 @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 Spriteset_Map def alter_viewport_color @viewport1.color.set(16, 16, 16, 128) @viewport1.update end end class Scene_Load alias :kyon_diurnalis_scn_load_on_dec on_decision def on_decision(filename) kyon_diurnalis_scn_load_on_dec(filename) 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.)
本贴来自国际rpgmaker官方论坛作者:kyonides处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:
https://forums.rpgmakerweb.com/threads/kdiurnalis-xp.148595/