netris/cmd/netris/gui_input.go

239 lines
4.3 KiB
Go

package main
import (
"git.sr.ht/~tslocum/netris/pkg/event"
"github.com/gdamore/tcell"
)
func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
k := ev.Key()
r := ev.Rune()
if titleVisible {
// TODO: During keybind change, record key, rune and modifier
if titleScreen > 1 {
switch k {
case tcell.KeyEscape:
titleScreen = 1
titleSelectedButton = 0
app.SetRoot(titleContainerGrid, true)
updateTitle()
return nil
}
return ev
}
switch k {
case tcell.KeyEnter:
if titleScreen == 1 {
switch titleSelectedButton {
case 0:
resetPlayerSettingsForm()
titleScreen = 2
titleSelectedButton = 0
app.SetRoot(playerSettingsContainerGrid, true)
app.SetFocus(playerSettingsForm)
app.Draw()
case 1:
resetGameSettingsForm()
titleScreen = 3
titleSelectedButton = 0
app.SetRoot(gameSettingsContainerGrid, true)
app.SetFocus(gameSettingsForm)
app.Draw()
case 2:
titleScreen = 0
updateTitle()
}
} else {
if joinedGame {
switch titleSelectedButton {
case 0:
setTitleVisible(false)
case 1:
titleScreen = 1
titleSelectedButton = 0
updateTitle()
case 2:
done <- true
}
} else {
switch titleSelectedButton {
case 0:
selectMode <- event.ModePlayOnline
case 1:
selectMode <- event.ModePractice
case 2:
titleScreen = 1
titleSelectedButton = 0
updateTitle()
}
}
}
case tcell.KeyUp, tcell.KeyBacktab:
previousTitleButton()
case tcell.KeyDown, tcell.KeyTab:
nextTitleButton()
case tcell.KeyEscape:
if titleScreen == 1 {
titleScreen = 0
titleSelectedButton = 0
} else if joinedGame {
setTitleVisible(false)
} else {
done <- true
}
default:
switch r {
case 'k', 'K':
previousTitleButton()
case 'j', 'J':
nextTitleButton()
}
}
updateTitle()
return ev
}
if inputActive {
if k == tcell.KeyEnter {
msg := inputView.GetText()
if msg != "" {
if activeGame != nil {
activeGame.Event <- &event.MessageEvent{Message: msg}
} else {
logMessage("Message not sent - not currently connected to any game")
}
}
setInputStatus(false)
} else if k == tcell.KeyEscape {
setInputStatus(false)
}
return ev
}
switch k {
case tcell.KeyUp:
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.HardDropPiece()
activeGame.Unlock()
return nil
case tcell.KeyDown:
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(0, -1)
activeGame.Unlock()
return nil
case tcell.KeyLeft:
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(-1, 0)
activeGame.Unlock()
return nil
case tcell.KeyRight:
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(1, 0)
activeGame.Unlock()
return nil
case tcell.KeyEnter:
setInputStatus(!inputActive)
case tcell.KeyTab:
setShowDetails(!showDetails)
case tcell.KeyEscape:
setTitleVisible(true)
}
switch r {
case 'z', 'Z':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.RotatePiece(1, 1)
activeGame.Unlock()
return nil
case 'x', 'X':
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.RotatePiece(1, 0)
activeGame.Unlock()
return nil
case 'h', 'H':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(-1, 0)
activeGame.Unlock()
return nil
case 'j', 'J':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(0, -1)
activeGame.Unlock()
return nil
case 'k', 'K':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.HardDropPiece()
activeGame.Unlock()
return nil
case 'l', 'L':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(1, 0)
activeGame.Unlock()
return nil
}
return ev
}