Files
taiko-web/public/src/js/gamepad.js
LoveEevee adc45cb652 Custom scripting, #song=, translations
- A song can be linked directly by adding "#song=<id>" to the url, replace `<id>` with the id in the database, after loading it jumps immediately jumps to the difficulty selection
- Added tutorial translations
- Fixed song preview not playing
- Use text fallback for the logo when there are no vectors
- Increased combo cache by 1 pixel
- A custom javascript file can be loaded from config.json by defining "custom_js" value
- Added lots of events to help writing custom js files: `version-link, title-screen, language-change, song-select, song-select-move, song-select-difficulty, song-select-back, about, about-link, tutorial, import-songs, import-songs-default, session, session-start, session-end, debug, load-song, load-song-player2, load-song-unfocused, load-song-cancel, load-song-error, game-start, key-events, p2-game-end, p2-disconnected, p2-abandoned, pause, unpause, pause-restart, pause-song-select, game-lag, scoresheet, scoresheet-player2`
- Event syntax example:
```js
addEventListener("game-start", event => {
	console.log("game-start", event.detail)
})
```
2019-02-14 12:32:45 +03:00

142 lines
3.0 KiB
JavaScript

class Gamepad{
constructor(bindings, callback){
this.bindings = bindings
this.b = {
"a": 0,
"b": 1,
"x": 2,
"y": 3,
"lb": 4,
"rb": 5,
"lt": 6,
"rt": 7,
"back": 8,
"start": 9,
"ls": 10,
"rs": 11,
"u": 12,
"d": 13,
"l": 14,
"r": 15,
"guide": 16,
"lsu": "lsu",
"lsr": "lsr",
"lsd": "lsd",
"lsl": "lsl"
}
this.btn = {}
this.gamepadEvents = 0
if(callback){
this.interval = setInterval(() => {
this.play(callback)
}, 1000 / 60)
}
}
play(callback){
if("getGamepads" in navigator){
var gamepads = navigator.getGamepads()
if(gamepads.length === 0){
return
}
}else{
return
}
if(pageEvents.lastKeyEvent + 5000 > Date.now()){
return
}
var bindings = this.bindings
var force = {
lsu: false,
lsr: false,
lsd: false,
lsl: false
}
for(var i = 0; i < gamepads.length; i++){
if(gamepads[i]){
var axes = gamepads[i].axes
if(axes.length >= 2){
force.lsl = force.lsl || axes[0] <= -0.5
force.lsr = force.lsr || axes[0] >= 0.5
force.lsu = force.lsu || axes[1] <= -0.5
force.lsd = force.lsd || axes[1] >= 0.5
}
if(axes.length >= 10){
// TaTaCon left D-Pad
for(var pov = 0; pov < 8; pov++){
if(Math.abs(axes[9] - (pov / 3.5 - 1)) <= 0.01){
force.lsu = force.lsu || pov === 7 || pov === 0 || pov === 1
force.lsr = force.lsr || pov === 1 || pov === 2 || pov === 3
force.lsd = force.lsd || pov === 3 || pov === 4 || pov === 5
force.lsl = force.lsl || pov === 5 || pov === 6 || pov === 7
break
}
}
}
}
}
for(var i = 0; i < gamepads.length; i++){
if(gamepads[i]){
this.toRelease = {}
for(var bind in bindings){
this.toRelease[bind] = bindings[bind].length
}
for(var bind in bindings){
for(var name in bindings[bind]){
var bindName = bindings[bind][name]
this.checkButton(gamepads, this.b[bindName], bind, callback, force[bindName])
}
}
break
}
}
}
checkButton(gamepads, btnName, keyCode, callback, force){
var button = false
if(typeof force === "undefined"){
for(var i = 0; i < gamepads.length; i++){
if(gamepads[i]){
var btn = gamepads[i].buttons[btnName]
if(btn){
var btnPressed = btn.pressed || btn.value >= 0.5
if(btnPressed){
button = btnPressed
}
}
}
}
var pressed = !this.btn[btnName] && button
var released = this.btn[btnName] && !button
}else{
var pressed = !this.btn[btnName] && force
var released = this.btn[btnName] && !force
}
if(pressed){
this.btn[btnName] = true
}else if(released){
this.btn[btnName] = false
}
if(pressed){
callback(true, keyCode)
this.gamepadEvents++
}else if(!button){
if(released){
this.toRelease[keyCode + "released"] = true
}
this.toRelease[keyCode]--
if(this.toRelease[keyCode] === 0 && this.toRelease[keyCode + "released"]){
callback(false, keyCode)
}
}
}
clean(){
clearInterval(this.interval)
}
}