mkxp-sunshine/scripts/Window_TPtL.rb
2026-06-22 20:12:52 +03:00

209 lines
4.7 KiB
Ruby

# The main menu window
class Window_TPtL < Window_Selectable
def initialize
super(16, 16, Graphics.width - 32, Graphics.height - 32)
@mapinfos = load_data("Data/MapInfos.rxdata")
@tree = []
sort
@item_max = @mapinfos.length;
# Make invisible by default
self.visible = false
self.active = false
self.back_opacity = 230
@fade_in = false
@fade_out = false
# Render menu
self.contents = Bitmap.new(width - 32, @item_max * 32)
Language.register_text_sprite(self.class.name + "_contents", self.contents)
ix = 0
@mapinfos.each do |map_id, map_info|
draw_item(map_id, ix, normal_color)
ix += 1
end
self.z = 9998
RPG::Mod.exec_hooks("hooks/Window_TPtL/init", binding)
end
def sort
orphans = []
@mapinfos.each do |map_id, map_info|
if map_info.parent_id == 0
@tree << [map_id, []]
elsif @mapinfos.has_key?(map_info.parent_id)
add_item(map_id)
else
orphans << map_id
end
end
result = {}
add_items(@tree, result)
@mapinfos = result
end
def add_item(map_id)
if get_item(@tree, map_id) != nil
return
end
if (@mapinfos[map_id].parent_id == 0)
@tree << [map_id, []]
return
end
info = @mapinfos[map_id]
parent = @tree
item = get_item(@tree, info.parent_id)
if item != nil
parent = item
else
add_item(info.parent_id)
item = get_item(@tree, info.parent_id)
if item != nil
parent = item
end
end
parent << [map_id, []]
end
def get_item(parent, map_id)
parent.each do |item|
if (item[0] == map_id)
return item[1]
else
i = get_item(item[1], map_id)
if i != nil
return i
end
end
end
return nil
end
def add_items(tree, hash)
tree.each do |item|
hash[item[0]] = @mapinfos[item[0]]
unless item[1].length == 0
add_items(item[1], hash)
end
end
end
#--------------------------------------------------------------------------
# * Dispose
#--------------------------------------------------------------------------
def dispose
# Dispose of windows
super
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
# color : text color
#--------------------------------------------------------------------------
def draw_item(index, draw_ix, color)
map_info = @mapinfos[index]
indent = 0;
last_map = index
while (last_map != 0)
indent += 1
last_map = @mapinfos[last_map].parent_id
end
# Set color
self.contents.font.color = color
# Update item
self.contents.draw_text(Rect.new(indent * 64, 32 * draw_ix, self.width - indent * 64, 32), tr(map_info&.name || "UNKNOWN_MAP"), 0)
self.contents.draw_text(Rect.new(0, 32 * draw_ix, self.width - 38, 32), index.to_s, 2)
end
# Open/show the menu
def open
# redraw in case language has been updated
ix = 0
@mapinfos.each do |map_id, map_info|
draw_item(map_id, ix, normal_color)
ix += 1
end
self.opacity = 0
self.contents_opacity = 0
self.visible = true
@fade_in = true
self.index = 0
self.active = true
end
# Update
def update
super
# Handle fade-in effect
if @fade_in
if Input.trigger?(Input::ITEMS)
@fade_in = false
@fade_out = true
else
self.opacity += 48
self.contents_opacity += 48
if self.contents_opacity == 255
@fade_in = false
end
return
end
end
# Handle fade-out effect
if @fade_out
self.opacity -= 48
self.contents_opacity -= 48
if self.contents_opacity == 0
@fade_out = false
self.visible = false
self.active = false
end
return
end
# Don't do anything if not active
if !self.active || $game_system.map_interpreter.running?
return
end
# Cancel menu
if Input.trigger?(Input::CANCEL) ||
Input.trigger?(Input::MENU) ||
Input.trigger?(Input::ITEMS)
unless Input.trigger?(Input::ITEMS)
$game_system.se_play($data_system.cancel_se)
end
@fade_out = true
return
end
# Select menu item
if Input.trigger?(Input::ACTION)
self.active = false
self.opacity = 127
$game_temp.player_transferring = true
$game_temp.player_new_map_id = @index
$game_temp.player_new_x = 0
$game_temp.player_new_y = 0
$game_temp.player_new_direction = 0
Graphics.freeze
$game_temp.transition_processing = true
$game_temp.transition_name = ""
@fade_out = true
end
end
end