mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-19 21:39:57 +00:00
209 lines
4.7 KiB
Ruby
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 = @mapinfos.keys[@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
|