#===============================================================================
#
# Timed User Input
# Authors: Diagostimo, Heretic
# Version 1.0
# Saturday, November 9th, 2012
#
#===============================================================================
#
# This script is the work of Diagostimo and Heretic
#
# Keys can be entered either by saying B or C instead of Input::B or Input::C
# This works for directions also: DOWN or UP instead of Input::DOWN or Input::UP
#
# ALWAYS USE ALL CAPITAL LETTERS FOR YOUR KEYS!
#
# There are two ways to use this script.
#
# 1: Single Keypress
# In an Event, run a Script:
# Input.change_key(Key)
#
# * Most useful when used in Parallel or Autorun processes
#
#
# 2: Automated Keypress
# In an Event, run a Script:
# timed_input(wait, keys)
#
# - Examples -
#
# timed_input(20, C) Effect: Waits 20 frames, then simulates the C Key
# timed_input(14, DOWN, C) Effect: Waits 14 frames, and simulates DOWN and C
# timed_input(40) Effect: This just waits. May sometimes be useful.
#
# NOTE: Build your Input Sequences BEFORE bringing up any Menus
#
# NOTE: Use "Call Menu Screen" on Page 3 of Event Commands instead of trying
# to use "B" to bring up the Menu. It wont work because an Event is
# doing its thing.
#
# NOTE: You cant use this script to simulate Player Movement, the same way
# as you are unable to move (by default) while an Event is processing.
#
#
# This Script is a simlified version of Timed User Input, Scripts, and Windows.
#
# It lacks the expanded functionality of the other version of the script, but
# will be more compatible. It works a bit differently as well, but may be
# easier to use with Custom Battle System Menus due to the differences.
#
# --- TIMING DIFFERENCES in XP and VX / Ace ---
#
# The Timing in XP and VX / VX Ace is a bit different.
#
# In XP, 1 second is 20 Frames, and usually runs at 40 Frames Per Second so
# value is multiplied by two
#
# In VX and VX Ace, 1 second is 60 Frames Per Second and isnt multiplied
#
#
# --- LEGAL STUFF ---
#
# Legal: This script is not my property and is used with permission
# from diagostimo. It has been modified by Heretic to be easier to use.
module Input_Constants
DOWN = Input::DOWN
LEFT = Input::LEFT
RIGHT = Input::RIGHT
UP = Input::UP
A = Input::A
B = Input::B
C = Input::C
X = Input::X
Y = Input::Y
Z = Input::Z
L = Input::L
R = Input::R
end
module RPG
# Timing for XP and VX is different, 20 FPS is 1 second in XP 60 in VX and Ace
Input_Time_Multiplier = defined?(Game_Interpreter) ? 1 : 2
# Create New Class
class TimedInput
# Mixed Variable and Array types are easier as Objects
def initialize(wait, parameters = [])
# Time to wait before simulating keystrokes
@wait = wait * Input_Time_Multiplier
# The Input Keys to be Simulated - Handles Multiple Keys
@parameters = parameters
end
attr_accessor :wait
attr_accessor :parameters
end
end
# Interpreter is named differently in VX and XP
Intepreter_Name = defined?(Game_Interpreter) ? Game_Interpreter : Interpreter
class Intepreter_Name
include Input_Constants
def timed_input(wait, *keys)
Input.change_auto_keys(RPG::TimedInput.new(wait, keys))
end
def clear_auto
Input.init
end
end
class Game_Character
include Input_Constants
def timed_input(wait, *keys)
Input.change_auto_keys(RPG::TimedInput.new(wait, keys))
end
def clear_auto
Input.init
end
end
module Input
# If class is already defined - F12 Reset
if $input_class_defined
# Reset associated variables defined in def init
init
else
# Store Global Variable that modifications to input class have been defined
$input_class_defined = true
class << self
#alias listing
alias update_forced update
alias trigger_forced trigger?
alias press_forced press?
alias repeat_forced repeat?
alias dir4_forced dir4
alias dir8_forced dir8
#initialize
def init
@forced = nil
@auto_forced = []
@auto_index = 0
@auto_timer = 0
@auto_input_time = false
@input_forced = false
@input_disabled = false
end
def change_input_flag
@auto_input_time = true
end
#change forced value
def change_key(key)
@forced = key
end
#change auto forced keys
def change_auto_keys(object)
@auto_forced.push(object)
@auto_timer = @auto_forced[0].wait
@auto_input_time = true
@input_disabled = true
end
#modified Input.update method
def update
if @auto_input_time
if @auto_timer == 0
if @auto_index == @auto_forced.size - 1
@auto_index = 0
@auto_input_time = false
@input_disabled = false
@auto_forced = []
elsif @auto_forced.size > 0
@auto_index += 1
@auto_timer = @auto_forced[@auto_index].wait
return
end
end
@auto_timer -= 1 if @auto_timer > 0
end
@forced = nil
@input_forced = false
# Original Input.update method
update_forced
end
# called by press?, trigger? and repeat?
def auto_forced?(key)
if @auto_input_time && @auto_timer == 0 && @auto_forced.size > 0
# auto_group is an Array of Keys that when checked return true
auto_group = @auto_forced[@auto_index].parameters
(0...auto_group.size).each {|i|
if auto_group[i] == key
@input_forced = true
return true
end
}
end
return false
end
# these return true if input check is forced
def trigger?(key)
return true if auto_forced?(key) or @forced == key
return false if @input_disabled
trigger_forced(key)
end
def press?(key)
return true if auto_forced?(key) or @forced == key
return false if @input_disabled
press_forced(key)
end
def repeat?(key)
return true if auto_forced?(key) or @forced == key
return false if @input_disabled
repeat_forced(key)
end
def dir4
dir = dir4_forced
return dir if auto_forced?(dir) or @forced == dir
return 0 if @input_disabled
return dir
end
def dir8
dir = dir8_forced
return dir if auto_forced?(dir) or @forced == dir
return 0 if @input_disabled
return dir
end
def input_forced?
return true if @input_forced or @forced
end
end
end
end
#calling the initialize method
Input.init