Here you go. Credit to Cyclope.
#==============================================================================
# Modified Scene_Name 1.3b Final
# By Cyclope
# Author's post: http://forum.chaos-project.com/index.php?topic=6731.0
# Edit by Helladen: Converted to VX and fixed alignment and settings.
# I also rewrote the enter button it now works properly.
# - 1.1 release for VX. (7/15/10)
# - 1.2 fixed the guide text at the bottom. (7/15/10)
# - 1.3 added where you can have it draw your face or character sprite.
# Fixed it from not having a sound if you erased letters.
# Changed some of the sounds and other small fixes. (7/19/10)
# - 1.3b fixed where you could space the whole name and space sounds.
#------------------------------------------------------------------------------
# Instructions
# Place above main
#------------------------------------------------------------------------------
# Credit:
# Nattmath (For making Scene_Name Letters Modification)
# Blizzard (For making Custom Controls)
# Cyclope (For modifying Scene_Name Leters Modification and Scene_Name)
# Helladen (Converted to Rpg Maker VX and enhanced it)
#==============================================================================
#==============================================================================
# ** Window_Instructions
#------------------------------------------------------------------------------
# This window displays full status specs on the status screen.
#==============================================================================
# Configuration
#------------------------------------------------------------------------------
DRAW_FACE = false # If this is true then it will draw a face if not then sprite
#==============================================================================
class Window_Instruction < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize
super( 0, 336, 544, 80)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.name = "Arial"
self.contents.font.size = 18
self.contents.font.color = normal_color
#Change this text to whatever instructions you want to have!
self.contents.draw_text(000, 9, 404, 32, "Enter = Confirm,")
self.contents.draw_text(120, 9, 404, 32, "Backspace = Delete,")
self.contents.draw_text(275, 9, 404, 32, "Keyboard = Text,")
self.contents.draw_text(400, 9, 404, 32, "Shift = Capital")
end
end
#==============================================================================
# ** Window_TextName
#------------------------------------------------------------------------------
# super ( 224, 32, 224, 80)
#==============================================================================
class Window_TextName < Window_Base
def initialize
if DRAW_FACE
super (164, 0, 224, 128)
else
super (164, 66, 224, 62)
end
self.contents = Bitmap.new(width - 32, height - 32)
@actor = $game_actors[$game_temp.name_actor_id]
refresh
end
def refresh
self.contents.clear
self.contents.font.name = "Arial"
self.contents.font.size = 32
self.contents.font.color = normal_color
if DRAW_FACE
draw_actor_face(@actor, 2, @actor.index * 96 + 2, 92)
self.contents.draw_text(112, 32, 64, 32, "Name:")
else
draw_actor_graphic(@actor, 32, 32)
self.contents.draw_text(64, 0, 64, 32, "Name:")
end
end
end
#==============================================================================
# ** Window_NameEdit
#------------------------------------------------------------------------------
# This window is used to edit your name on the input name screen.
#==============================================================================
class Window_NameEdit < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
# max_char : maximum number of characters
#--------------------------------------------------------------------------
def initialize(actor, max_char)
super(16, 128, 512, 96)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
@name = actor.name
@max_char = max_char
# Fit name within maximum number of characters
name_array = @name.split(//)[0...@max_char]
@name = ""
for i in 0...name_array.size
@name += name_array[i]
end
@default_name = @name
@index = name_array.size
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Return to Default Name
#--------------------------------------------------------------------------
def restore_default
@name = @default_name
@index = @name.split(//).size
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Add Character
# character : text character to be added
#--------------------------------------------------------------------------
def add(character)
if @index < @max_char and character != ""
@name += character
@index += 1
refresh
update_cursor_rect
end
end
#--------------------------------------------------------------------------
# * Delete Character
#--------------------------------------------------------------------------
def back
if @index > 0
# Delete 1 text character
name_array = @name.split(//)
@name = ""
for i in 0...name_array.size-1
@name += name_array[i]
end
@index -= 1
refresh
update_cursor_rect
end
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draw name
self.contents.font.size = 42
name_array = @name.split(//)
for i in 0...@max_char
c = name_array[i]
if c == nil
c = "_"
end
x = 258 - @max_char * 14 + i * 26
self.contents.draw_text(x, 15, 28, 42, c, 1)
end
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
x = 262 - @max_char * 14 + @index * 26
self.cursor_rect.set(x, 46, 20, 5)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_cursor_rect
end
end
#==============================================================================
# ** Window_NameInput
#------------------------------------------------------------------------------
# This window is used to select text characters on the input name screen.
#==============================================================================
class Window_NameInput < Window_Base
CHARACTER_TABLE =
[
"", ""
]
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 128, 544, 0)
self.contents = Bitmap.new(width - 32, height - 32)
@index = 0
refresh
end
#--------------------------------------------------------------------------
# * Text Character Acquisition
#--------------------------------------------------------------------------
def character
return CHARACTER_TABLE[@index]
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
end
end
#==============================================================================
# ** Scene_Name
#------------------------------------------------------------------------------
# This class performs name input screen processing.
#==============================================================================
class Scene_Name
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Get actor
@actor = $game_actors[$game_temp.name_actor_id]
# Make windows
@edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char)
@edit_window.back_opacity = 160
@input_window = Window_NameInput.new
@inst_window = Window_Instruction.new
@inst_window.back_opacity = 160
@nametext_window = Window_TextName.new
@nametext_window.back_opacity = 160
@spriteset = Spriteset_Map.new
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of windows
@edit_window.dispose
@input_window.dispose
@inst_window.dispose
@nametext_window.dispose
@spriteset.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update windows
@edit_window.update
@input_window.update
@nametext_window.update
@inst_window.update
# If C button was pressed
if Input.trigger?(Input::C)
# If cursor position is at [OK]
if @input_window.character == nil
# If name is empty
if @edit_window.name == ""
# If name is empty
if @edit_window.name == ""
# Play buzzer SE
Sound.play_buzzer
return
end
# Play decision SE
Sound.play_cursor
return
end
# Change actor name
@actor.name = @edit_window.name
# Play decision SE
Sound.play_cursor
# Switch to map screen
$scene = Scene_Map.new
return
end
# If cursor position is at maximum
if @edit_window.index == $game_temp.name_max_char
# Play buzzer SE
Sound.play_buzzer
return
end
# If text character is empty
if @input_window.character == ""
# Play buzzer SE
Sound.play_buzzer
return
end
# Play decision SE
Sound.play_cursor
# Add text character
@edit_window.add(@input_window.character)
return
end
end
end
#==============================================================================
# module Input
#==============================================================================
module Input
#----------------------------------------------------------------------------
# Simple ASCII table
#----------------------------------------------------------------------------
Key = {'A' => 65, 'B' => 66, 'C' => 67, 'D' => 68, 'E' => 69, 'F' => 70,
'G' => 71, 'H' => 72, 'I' => 73, 'J' => 74, 'K' => 75, 'L' => 76,
'M' => 77, 'N' => 78, 'O' => 79, 'P' => 80, 'Q' => 81, 'R' => 82,
'S' => 83, 'T' => 84, 'U' => 85, 'V' => 86, 'W' => 87, 'X' => 88,
'Y' => 89, 'Z' => 90,
'0' => 48, '1' => 49, '2' => 50, '3' => 51, '4' => 52, '5' => 53,
'6' => 54, '7' => 55, '8' => 56, '9' => 57,
'NumberPad 0' => 45, 'NumberPad 1' => 35, 'NumberPad 2' => 40,
'NumberPad 3' => 34, 'NumberPad 4' => 37, 'NumberPad 5' => 12,
'NumberPad 6' => 39, 'NumberPad 7' => 36, 'NumberPad 8' => 38,
'NumberPad 9' => 33,
'F1' => 112, 'F2' => 113, 'F3' => 114, 'F4' => 115, 'F5' => 116,
'F6' => 117, 'F7' => 118, 'F8' => 119, 'F9' => 120, 'F10' => 121,
'F11' => 122, 'F12' => 123,
';' => 186, '=' => 187, ',' => 188, '-' => 189, '.' => 190, '/' => 220,
'\\' => 191, '\'' => 222, '[' => 219, ']' => 221, '`' => 192,
'Backspace' => 8, 'Tab' => 9, 'Enter' => 13, 'Shift' => 16,
'Left Shift' => 160, 'Right Shift' => 161, 'Left Ctrl' => 162,
'Right Ctrl' => 163, 'Left Alt' => 164, 'Right Alt' => 165,
'Ctrl' => 17, 'Alt' => 18, 'Esc' => 27, 'Space' => 32, 'Page Up' => 33,
'Page Down' => 34, 'End' => 35, 'Home' => 36, 'Insert' => 45,
'Delete' => 46, 'Arrow Left' => 37, 'Arrow Up' => 38,
'Arrow Right' => 39, 'Arrow Down' => 40,
'Mouse Left' => 1, 'Mouse Right' => 2, 'Mouse Middle' => 4,
'Mouse 4' => 5, 'Mouse 5' => 6}
# default button configuration
UP = [Key['Arrow Up']]
LEFT = [Key['Arrow Left']]
DOWN = [Key['Arrow Down']]
RIGHT = [Key['Arrow Right']]
A = [Key['Shift']]
B = [Key['Esc'], Key['NumberPad 0'], Key['X']]
C = [Key['Space'], Key['Enter'], Key['C']]
X = [Key['A']]
Y = [Key['S']]
Z = [Key['D']]
L = [Key['Q'], Key['Page Down']]
R = [Key['W'], Key['Page Up']]
F5 = [Key['F5']]
F6 = [Key['F6']]
F7 = [Key['F7']]
F8 = [Key['F8']]
F9 = [Key['F9']]
SHIFT = [Key['Shift']]
CTRL = [Key['Ctrl']]
ALT = [Key['Alt']]
# All keys
ALL_KEYS = (0...256).to_a
# Win32 API calls
GetKeyboardState = Win32API.new('user32','GetKeyboardState', 'P', 'I')
GetKeyboardLayout = Win32API.new('user32', 'GetKeyboardLayout','L', 'L')
MapVirtualKeyEx = Win32API.new('user32', 'MapVirtualKeyEx', 'IIL', 'I')
ToUnicodeEx = Win32API.new('user32', 'ToUnicodeEx', 'LLPPILL', 'L')
# some other constants
DOWN_STATE_MASK = 0x80
DEAD_KEY_MASK = 0x80000000
# data
@state = "\0" * 256
@triggered = Array.new(256, false)
@pressed = Array.new(256, false)
@released = Array.new(256, false)
@repeated = Array.new(256, 0)
#----------------------------------------------------------------------------
# update
# Updates input.
#----------------------------------------------------------------------------
def self.update
# get current language layout
@language_layout = GetKeyboardLayout.call(0)
# get new keyboard state
GetKeyboardState.call(@state)
# for each key
ALL_KEYS.each {|key|
# if pressed state
if @state[key] & DOWN_STATE_MASK == DOWN_STATE_MASK
# not released anymore
@released[key] = false
# if not pressed yet
if !@pressed[key]
# pressed and triggered
@pressed[key] = true
@triggered[key] = true
else
# not triggered anymore
@triggered[key] = false
end
# update of repeat counter
@repeated[key] < 17 ? @repeated[key] += 1 : @repeated[key] = 15
# not released yet
elsif !@released[key]
# if still pressed
if @pressed[key]
# not triggered, pressed or repeated, but released
@triggered[key] = false
@pressed[key] = false
@repeated[key] = 0
@released[key] = true
end
else
# not released anymore
@released[key] = false
end}
end
#----------------------------------------------------------------------------
# dir4
# 4 direction check.
#----------------------------------------------------------------------------
def Input.dir4
return 2 if Input.press?(DOWN)
return 4 if Input.press?(LEFT)
return 6 if Input.press?(RIGHT)
return 8 if Input.press?(UP)
return 0
end
#----------------------------------------------------------------------------
# dir8
# 8 direction check.
#----------------------------------------------------------------------------
def Input.dir8
down = Input.press?(DOWN)
left = Input.press?(LEFT)
return 1 if down && left
right = Input.press?(RIGHT)
return 3 if down && right
up = Input.press?(UP)
return 7 if up && left
return 9 if up && right
return 2 if down
return 4 if left
return 6 if right
return 8 if up
return 0
end
#----------------------------------------------------------------------------
# trigger?
# Test if key was triggered once.
#----------------------------------------------------------------------------
def Input.trigger?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @triggered[key]}
end
#----------------------------------------------------------------------------
# press?
# Test if key is being pressed.
#----------------------------------------------------------------------------
def Input.press?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @pressed[key]}
end
#----------------------------------------------------------------------------
# repeat?
# Test if key is being pressed for repeating.
#----------------------------------------------------------------------------
def Input.repeat?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @repeated[key] == 1 || @repeated[key] == 16}
end
#----------------------------------------------------------------------------
# release?
# Test if key was released.
#----------------------------------------------------------------------------
def Input.release?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @released[key]}
end
#----------------------------------------------------------------------------
# get_character
# vk - virtual key
# Gets the character from keyboard input using the input locale identifier
# (formerly called keyboard layout handles).
#----------------------------------------------------------------------------
def self.get_character(vk)
# get corresponding character from virtual key
c = MapVirtualKeyEx.call(vk, 2, @language_layout)
# stop if character is non-printable and not a dead key
return '' if c < 32 && (c & DEAD_KEY_MASK != DEAD_KEY_MASK)
# get scan code
vsc = MapVirtualKeyEx.call(vk, 0, @language_layout)
# result string is never longer than 2 bytes (Unicode)
result = "\0" * 2
# get input string from Win32 API
length = ToUnicodeEx.call(vk, vsc, @state, result, 2, 0, @language_layout)
return (length == 0 ? '' : result)
end
#----------------------------------------------------------------------------
# get_input_string
# Gets the string that was entered using the keyboard over the input locale
# identifier (formerly called keyboard layout handles).
#----------------------------------------------------------------------------
def self.get_input_string
result = ''
# check every key
ALL_KEYS.each {|key|
# if repeated
if self.repeat?(key)
# get character from keyboard state
c = self.get_character(key)
# add character if there is a character
result += c if c != ''
end}
# empty if result is empty
return '' if result == ''
# convert string from Unicode to UTF-8
return self.unicode_to_utf8(result)
end
#----------------------------------------------------------------------------
# get_input_string
# string - string in Unicode format
# Converts a string from Unicode format to UTF-8 format as RGSS does not
# support Unicode.
#----------------------------------------------------------------------------
def self.unicode_to_utf8(string)
result = ''
string.unpack('S*').each {|c|
# characters under 0x80 are 1 byte characters
if c < 0x0080
result += c.chr
# other characters under 0x800 are 2 byte characters
elsif c < 0x0800
result += (0xC0 | (c >> 6)).chr
result += (0x80 | (c & 0x3F)).chr
# the rest are 3 byte characters
else
result += (0xE0 | (c >> 12)).chr
result += (0x80 | ((c >> 12) & 0x3F)).chr
result += (0x80 | (c & 0x3F)).chr
end}
return result
end
end
#==============================================================================
# ** Scene_Name Leters Modification Made By Nattmath and Improved Cyclope
#------------------------------------------------------------------------------
# Makes you imput stuf with the keyboard
#==============================================================================
class Scene_Name
alias name_input_update update
def update
if @edit_window.index != $game_temp.name_max_char
(65...91).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
let = let.downcase unless Input.press?(Input::Key['Shift'])
@edit_window.add(let)
end}
(48...58).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
@edit_window.add(let)
end}
(186...192).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
@edit_window.add(let)
end}
(219...222).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
@edit_window.add(let)
end}
end
if @edit_window.name != ""
if Input.trigger?(Input::Key['Backspace'])
@edit_window.back
Sound.play_cancel
elsif Input.trigger?(Input::Key['Arrow Left'])
@edit_window.back
Sound.play_cancel
end
end
if Input.trigger?(Input::Key['Enter'])
if @edit_window.name != "" and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " " and @edit_window.name != " "
# Change actor name
@actor.name = @edit_window.name
# Play decision SE
Sound.play_decision
# Switch to map screen
$scene = Scene_Map.new
return
else
# If name is empty return to default name
# Play buzzer SE
@edit_window.restore_default
Sound.play_buzzer
return
end
end
if Input.trigger?(Input::Key['Space'])
if @edit_window.index != $game_temp.name_max_char
@actor.name = @edit_window.name
Sound.play_cursor
@edit_window.add(" ")
end
end
end
end