summaryrefslogtreecommitdiffhomepage
path: root/not
diff options
context:
space:
mode:
Diffstat (limited to 'not')
-rw-r--r--not/Controller.lua201
1 files changed, 201 insertions, 0 deletions
diff --git a/not/Controller.lua b/not/Controller.lua
new file mode 100644
index 0000000..8a2a863
--- /dev/null
+++ b/not/Controller.lua
@@ -0,0 +1,201 @@
+--- `Controller`
+-- Module to manage player input.
+-- It uses `love.keypressed`, `love.keyreleased`, `love.gamepadreleased`, `love.gamepadpressed`, `love.joystickadded`, so be sure not to use them by yourself.
+-- Rather than that use functions provided by this module: `Controller.controlpressed` and `Controller.controlreleased`.
+Controller = {
+ sets = {},
+ axes = {},
+ deadzone = .3
+}
+
+-- Declared to avoid calling nil. Be sure to define yours after this line is performed.
+function Controller.controlpressed(set, action, key) end
+function Controller.controlreleased(set, action, key) end
+
+-- Create new controls set.
+function Controller.registerSet(left, right, up, down, attack, jump, joystick)
+ if not Controller.isJoystickUnique(joystick) then return end
+ local set = {}
+ set.left = left or "left"
+ set.right = right or "right"
+ set.up = up or "up"
+ set.down = down or "down"
+ set.attack = attack or "return"
+ set.jump = jump or "rshift"
+ set.joystick = joystick
+ table.insert(Controller.sets, set)
+ print(set, left, right, up, down, attack, jump, joystick)
+ return set
+end
+
+-- Reset table of controls sets.
+function Controller.reset()
+ local t = {}
+ Controller.sets = t
+end
+
+-- Get table of controls sets.
+function Controller.getSets()
+ return Controller.sets
+end
+
+-- Checks if given joystick is unique in current set of Controller sets
+function Controller.isJoystickUnique(joystick)
+ if joystick ~= nil then
+ for _,set in pairs(Controller.sets) do
+ if set.joystick == joystick then return false end
+ end
+ end
+ return true
+end
+
+-- Tests all sets if they have control assigned to given key and joystick.
+function Controller.testSets(key, joystick)
+ for i,set in pairs(Controller.sets) do
+ local action = Controller.testControl(set, key, joystick)
+ if action ~= nil then
+ return set, action
+ end
+ end
+ return nil, nil
+end
+
+-- Tests given set if it has controll assigned to given key and joystick.
+function Controller.testControl(set, key, joystick)
+ -- First test if it is joystick and if it is correct one
+ if joystick == set.joystick then
+ if key == set.left then
+ return "left"
+ elseif key == set.right then
+ return "right"
+ elseif key == set.up then
+ return "up"
+ elseif key == set.down then
+ return "down"
+ elseif key == set.attack then
+ return "attack"
+ elseif key == set.jump then
+ return "jump"
+ end
+ end
+end
+
+-- Checks if given action of given set is down
+function Controller.isDown(set, action)
+ if set ~= nil then
+ if set.joystick == nil then
+ return love.keyboard.isDown(set[action])
+ else
+ if not Controller.isAxis(set[action]) then
+ return set.joystick:isGamepadDown(set[action])
+ else
+ return Controller.getAxisState(set.joystick, set[action])
+ end
+ end
+ end
+end
+
+-- Return key name from given axis and value
+function Controller.createAxisName(axis, value)
+ local key = "axis:"..axis
+ if value == 0 then
+ key = key.."0"
+ elseif value > 0 then
+ key = key.."+"
+ else
+ key = key.."-"
+ end
+ return key
+end
+
+-- Checks if given key is an axis
+function Controller.isAxis(key)
+ if string.find(key, "axis:") then
+ return true
+ else
+ return false
+ end
+end
+
+-- Checks state of key assigned to axis of given joystick
+function Controller.getAxisState(joystick, key)
+ if Controller.axes[joystick] then
+ local state = Controller.axes[joystick][key]
+ if state ~= nil then
+ return state
+ else
+ return false
+ end
+ end
+end
+
+-- Sets state of key assigned to axis of given joystick
+function Controller.setAxisState(joystick, key, state)
+ if Controller.axes[joystick] == nil then
+ Controller.axes[joystick] = {}
+ end
+ Controller.axes[joystick][key] = state
+end
+
+-- Simulate pressing key on an axis
+function Controller.axisPress(joystick, axis, value)
+ local key = Controller.createAxisName(axis, value)
+ local set, action = Controller.testSets(key, joystick)
+ local state = Controller.getAxisState(joystick, key)
+ if not state then
+ print(joystick, set, action, key)
+ Controller.setAxisState(joystick, key, true)
+ Controller.controlpressed(set, action, key)
+ end
+end
+
+-- Simulate releasing key on an axis
+function Controller.axisRelease(joystick, axis, value)
+ local key = Controller.createAxisName(axis, value)
+ local set, action = Controller.testSets(key, joystick)
+ local state = Controller.getAxisState(joystick, key)
+ if state then
+ Controller.setAxisState(joystick, key,false)
+ Controller.controlreleased(set, action, key)
+ end
+end
+
+-- Callbacks from LÖVE2D
+-- Load gamepad mappings from db file and init module
+function Controller.load()
+ love.joystick.loadGamepadMappings("gamecontrollerdb.txt")
+end
+
+-- Gamepad input callbacks
+function Controller.gamepadaxis(joystick, axis, value)
+ if value ~= 0 then
+ if math.abs(value) > Controller.deadzone then
+ Controller.axisPress(joystick, axis, value)
+ else
+ Controller.axisRelease(joystick, axis, value)
+ end
+ else
+ Controller.axisRelease(joystick, axis, 1)
+ Controller.axisRelease(joystick, axis, -1)
+ end
+end
+function Controller.gamepadpressed(joystick, key)
+ local set, action = Controller.testSets(key, joystick)
+ print(joystick, set, action, key)
+ Controller.controlpressed(set, action, key)
+end
+function Controller.gamepadreleased(joystick, key)
+ local set, action = Controller.testSets(key, joystick)
+ Controller.controlreleased(set, action, key)
+end
+
+-- Keyboard input callbacks
+function Controller.keypressed(key)
+ local set, action = Controller.testSets(key, nil)
+ print(nil, set, action, key)
+ Controller.controlpressed(set, action, key)
+end
+function Controller.keyreleased(key)
+ local set, action = Controller.testSets(key, nil)
+ Controller.controlreleased(set, action, key)
+end \ No newline at end of file