module GamePad
DPAD_UP = 0x00000001
DPAD_DOWN = 0x00000002
DPAD_LEFT = 0x00000004
DPAD_RIGHT = 0x00000008
START = 0x00000010
BACK = 0x00000020
LEFT_THUMB = 0x00000040
RIGHT_THUMB = 0x00000080
LEFT_SHOULDER = 0x0100
RIGHT_SHOULDER = 0x0200
A = 0x1000
B = 0x2000
X = 0x4000
Y = 0x8000
Keys = {
Input::C => GamePad::A,
Input::B => GamePad::B,
Input::DOWN => GamePad::DPAD_DOWN,
}
@vibrate = Win32API.new("RGSSXbox.dll", "Vibrate", "ILL", "V")
@connected = Win32API.new("RGSSXbox.dll", "Connected", "I", "L")
@pressed = Win32API.new("RGSSXbox.dll", "Pressed", "II", "L")
@duration = [0, 0, 0, 0]
@triggered = {}
def self.vibrate(player, left, right, duration = 0)
player = player.clamp(1, 4)
@vibrate.call(player, left, right)
@duration[player - 1] = duration * 40 if duration > 0
end
def self.stop(player)
player = player.clamp(1, 4)
@vibrate.call(player, 0, 0)
end
def self.update
@duration.each_index{|i|
if @duration[i] >= 0
@duration[i] -= 1
self.stop(i + 1) if @duration[i] <= 0
end}
@triggered.each_key {|button|
if @triggered[button] == true
trigger = @pressed.call(1, button)
@triggered[button] = false if trigger == 0
end}
end
def self.pressed?(player, button)
bool = @pressed.call(player, button)
if bool == 0
return false
else
return true
end
end
def self.trigger?(player, button)
return false if @triggered[button] == true
press = @pressed.call(player, button)
if press > 0
@triggered[button] = true
return true
end
return false
end
end
module Input
class << self
alias gg_upd_input_gamepad_lat update
alias gg_upd_input_dir4_lat dir4
alias gg_upd_input_trigger_lat trigger?
end
def self.trigger?(button)
if GamePad::Keys[button] != nil
return true if GamePad.trigger?(1, GamePad::Keys[button])
end
return gg_upd_input_trigger_lat(button)
end
def self.update
gg_upd_input_gamepad_lat
GamePad.update
end
def self.dir4
if GamePad.pressed?(1, GamePad::DPAD_DOWN)
return 2
elsif GamePad.pressed?(1, GamePad::DPAD_LEFT)
return 4
elsif GamePad.pressed?(1, GamePad::DPAD_RIGHT)
return 6
elsif GamePad.pressed?(1, GamePad::DPAD_UP)
return 8
end
return gg_upd_input_dir4_lat
end
end