#------------------------------------------------------------------------------#
# Galv's Keypad Input
#------------------------------------------------------------------------------#
# For: RPGMAKER VX ACE
# Version 1.1
#------------------------------------------------------------------------------#
# 2012-10-15 - Version 1.1 - Allows for a larger max number to show in the box
# 2012-10-05 - Version 1.0 - release
#------------------------------------------------------------------------------#
# The keypad is just a fancy version of the 'Number Input' event command.
# When "OK" is pressed, it outputs the entered number to the chosen variable.
# When "X" is pressed, it outputs -1 to the chosen variable (for eventing).
#
# From then on, it's up to your eventing skills what to do with the number.
# Call the keypad with the script call:
#------------------------------------------------------------------------------#
# keypad_input
#------------------------------------------------------------------------------#
$imported = {} if $imported.nil?
$imported["Keypad"] = true
module Keypad
#------------------------------------------------------------------------------#
# SCRIPT SETUP OPTIONS
#------------------------------------------------------------------------------#
KEYPAD_VAR = 1 # Variable that the keypad stores number in.
MAX_NUM = 6 # Amount of numbers you can enter in the keypad.
OK_SE = ["Heal7", 80, 150] # OK sound effect. ["SE Name", volume, pitch]
#------------------------------------------------------------------------------#
# SCRIPT SETUP OPTIONS
#------------------------------------------------------------------------------#
end
class Scene_Keypad < Scene_MenuBase
def start
super
@number = ""
@edit_window = Window_Numpad.new(@number, @max_char)
@input_window = Window_NumInput.new(@edit_window)
@input_window.set_handler(:confirm, method(:on_input_ok))
@input_window.set_handler(:leave, method(:on_input_x))
@input_window.activate
end
def on_input_ok
$game_variables[Keypad::KEYPAD_VAR] = @edit_window.numeral.to_i
SceneManager.return
end
def on_input_x
$game_variables[Keypad::KEYPAD_VAR] = -1
SceneManager.return
end
end
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# * New Window - Numpad Number Output
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
class Window_Numpad < Window_Base
attr_reader :numeral # number amount
attr_reader :index # cursor position
attr_reader :max_char # maximum number of numbers
def initialize(number, max_char)
x = ((Graphics.width - 185) / 2) - (extend_size * 0.5)
y = (Graphics.height - (fitting_height(4) + fitting_height(9) + 8)) / 2
super(x, y, 185 + extend_size, fitting_height(1))
@max_char = Keypad::MAX_NUM
@numeral = number.to_s[0, @max_char]
@index = @numeral.size
refresh
end
def extend_size
if Keypad::MAX_NUM > 10
20 * (Keypad::MAX_NUM - 10)
else
0
end
end
def add(ch)
return false if @index >= @max_char
@numeral += ch
@index += 1
refresh
return true
end
def back
return on_name_x if @index == 0
@index -= 1
@numeral = @numeral[0, @index]
refresh
return true
end
def on_name_x
$game_variables[Keypad::KEYPAD_VAR] = -1
SceneManager.return
end
def char_width
text_size("0").width + 5
end
def left
numeral_center = (contents_width) / 2
numeral_width = (@max_char) * char_width
return [numeral_center - numeral_width / 2, contents_width - numeral_width].min
end
def item_rect(index)
Rect.new(left + index * char_width, -3, char_width, line_height)
end
def draw_char(index)
contents.font.size = 28
rect = item_rect(index)
rect.x -= 1
rect.width += 4
change_color(normal_color)
draw_text(rect, @numeral[index] || "")
end
def refresh
contents.clear
@numeral.size.times {|i| draw_char(i) }
end
end
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# * New Window - Numpad Input
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
class Window_NumInput < Window_Selectable
NUMPAD = [ '1','2','3','4','5', '6','7','8','9','OK', '0', 'X']
def initialize(edit_window)
super((Graphics.width - 185) / 2, edit_window.y + edit_window.height + 8,
185, fitting_height(9))
@edit_window = edit_window
@index = 0
refresh
update_cursor
end
def character
if @index == 10
NUMPAD[@index]
elsif @index < 9
NUMPAD[@index]
else
""
end
end
def is_x?
@index == 11
end
def is_ok?
@index == 9
end
def item_rect(index)
contents.font.size = 32
rect = Rect.new
rect.x = index % 3 * 32 + index % 3 / 1 * 16
rect.y = index / 3 * line_height * 2
rect.width = 62
rect.height = 62
rect
end
def refresh
contents.clear
change_color(normal_color)
12.times {|i| draw_text(item_rect(i), NUMPAD[i], 1) }
end
def update_cursor
cursor_rect.set(item_rect(@index))
end
def cursor_movable?
active
end
def cursor_down(wrap)
if @index < 9 or wrap
@index = (index + 3) % 12
end
end
def cursor_up(wrap)
if @index > 2 or wrap
@index = (index - 3) % 12
end
end
def cursor_right(wrap)
if @index % 12 < 11
@index += 1
elsif wrap
@index -= 11
end
end
def cursor_left(wrap)
if @index % 12 > 0
@index -= 1
elsif wrap
@index += 11
end
end
def process_cursor_move
super
update_cursor
end
def process_handling
return unless open? && active
process_back if Input.repeat?(:B)
process_ok if Input.trigger?(:C)
end
def process_back
Sound.play_cancel if @edit_window.back
end
def process_ok
if !character.empty?
on_name_add
elsif is_x?
Sound.play_cancel
call_handler(:leave)
elsif is_ok?
RPG::SE.new(Keypad::OK_SE[0], Keypad::OK_SE[1], Keypad::OK_SE[2]).play
call_handler(:confirm)
end
end
def on_name_add
if @edit_window.add(character)
Sound.play_ok
else
Sound.play_buzzer
end
end
end
class Game_Interpreter
def keypad_input
SceneManager.call(Scene_Keypad)
wait(1)
end
end