mkxp/scripts/Window_NameInput.rb

147 lines
5.5 KiB
Ruby

#==============================================================================
# ** Window_NameInput
#------------------------------------------------------------------------------
# This window is used to select text characters on the input name screen.
#==============================================================================
class Window_NameInput < Window_Base
GROUP_WIDTH = 5
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 128, 640, 352)
self.contents = Bitmap.new(width - 32, height - 32)
@index = 0
# Create dimension information
@character_table = $language.character_table
@group_height = $language.character_table_height
@group_size = @group_height * GROUP_WIDTH
@num_groups = @character_table.length / @group_size
@start_x = ((width - 32) - @num_groups * 152 + 12) / 2
@ok_text = tr("OK")
@ok_text_size = self.contents.text_size(@ok_text).width
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Text Character Acquisition
#--------------------------------------------------------------------------
def character
return @character_table[@index]
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@character_table.length
x = @start_x + i / GROUP_WIDTH / @group_height * 152 + i % GROUP_WIDTH * 28
y = i / GROUP_WIDTH % @group_height * 32
self.contents.draw_text(x, y, 28, 32, @character_table[i], 1)
end
self.contents.draw_text(@start_x + @num_groups * 152 - 12 - @ok_text_size - 16,
9 * 32, @ok_text_size, 32, @ok_text, 1)
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
# If cursor is positioned on [OK]
if @index >= @character_table.length
self.cursor_rect.set(@start_x + @num_groups * 152 - 12 - @ok_text_size - 32,
9 * 32, @ok_text_size + 32, 32)
# If cursor is positioned on anything other than [OK]
else
x = @start_x + @index / GROUP_WIDTH / @group_height * 152 + @index % GROUP_WIDTH * 28
y = @index / GROUP_WIDTH % @group_height * 32
self.cursor_rect.set(x, y, 28, 32)
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
# If cursor is positioned on [OK]
if @index >= @character_table.length
# Cursor down
if Input.trigger?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
@index -= @character_table.length
end
# Cursor up
if Input.repeat?(Input::UP)
$game_system.se_play($data_system.cursor_se)
@index -= @character_table.length - (@group_size - GROUP_WIDTH)
end
# If cursor is positioned on anything other than [OK]
else
# If right directional button is pushed
if Input.repeat?(Input::RIGHT)
# If directional button pressed down is not a repeat, or
# cursor is not positioned on the right edge
if Input.trigger?(Input::RIGHT) or
@index / @group_size < 3 or @index % GROUP_WIDTH < 4
# Move cursor to right
$game_system.se_play($data_system.cursor_se)
if @index % GROUP_WIDTH < 4
@index += 1
else
@index += @group_size - 4
end
if @index >= @character_table.length
@index -= @character_table.length
end
end
end
# If left directional button is pushed
if Input.repeat?(Input::LEFT)
# If directional button pressed down is not a repeat, or
# cursor is not positioned on the left edge
if Input.trigger?(Input::LEFT) or
@index / @group_size > 0 or @index % GROUP_WIDTH > 0
# Move cursor to left
$game_system.se_play($data_system.cursor_se)
if @index % GROUP_WIDTH > 0
@index -= 1
else
@index -= @group_size - 4
end
if @index < 0
@index += @character_table.length
end
end
end
# If down directional button is pushed
if Input.repeat?(Input::DOWN)
# Move cursor down
$game_system.se_play($data_system.cursor_se)
if @index % @group_size < @group_size - GROUP_WIDTH
@index += GROUP_WIDTH
else
@index += @character_table.length - (@group_size - GROUP_WIDTH)
end
end
# If up directional button is pushed
if Input.repeat?(Input::UP)
# If directional button pressed down is not a repeat, or
# cursor is not positioned on the upper edge
if Input.trigger?(Input::UP) or @index % @group_size >= GROUP_WIDTH
# Move cursor up
$game_system.se_play($data_system.cursor_se)
if @index % @group_size >= GROUP_WIDTH
@index -= GROUP_WIDTH
else
@index += @character_table.length
end
end
end
end
update_cursor_rect
end
end