Show garbage sent / receive and speed on TAB, limit number of multiplayer matrixes displayed based on window size

This commit is contained in:
Trevor Slocum 2019-10-14 21:27:58 -07:00
parent 31d7971372
commit 4d167068e8
5 changed files with 51 additions and 12 deletions

View file

@ -7,6 +7,8 @@ Multiplayer Tetris clone
This project is not yet stable. Feedback is welcome.
![](https://netris.rocketnine.space/static/screenshot2.png)
## Demo
To play netris without installing:
@ -28,6 +30,22 @@ go get -u git.sr.ht/~tslocum/netris/cmd/netris-server
See [CONFIGURATION.md](https://man.sr.ht/~tslocum/netris/CONFIGURATION.md)
## Play
A single player game may be played by launching without any options.
To play online, connect to the official server:
```netris --nick <name> --connect netris.rocketnine.space```
To host a private game, start a dedicated server:
```netris-server --listen-tcp :1984```
Then, connect with:
```netris --nick <name> --connect ip.or.dns.address:1984```
## Support
Please share suggestions/issues [here](https://todo.sr.ht/~tslocum/netris).

View file

@ -38,6 +38,8 @@ var (
renderLock = new(sync.Mutex)
renderBuffer bytes.Buffer
multiplayerMatrixSize int
screenW, screenH int
newScreenW, newScreenH int
)
@ -72,9 +74,7 @@ var (
func initGUI() (*tview.Application, error) {
app = tview.NewApplication()
if blockSize == 0 {
app.SetBeforeDrawFunc(handleResize)
}
app.SetBeforeDrawFunc(handleResize)
inputView = tview.NewInputField().
SetLabel("").
@ -165,15 +165,15 @@ func handleResize(screen tcell.Screen) bool {
if newScreenW != screenW || newScreenH != screenH {
screenW, screenH = newScreenW, newScreenH
oldBlockSize := blockSize
// TODO Obey initial set blocksize or auto
if screenW >= 80 && screenH >= 44 {
blockSize = 2
} else {
blockSize = 1
}
if blockSize == oldBlockSize {
return false
}
multiplayerMatrixSize = (screenW - ((10 * blockSize) + 16)) / ((10 * blockSize) + 4)
grid.SetRows(2+(20*blockSize), -1).SetColumns(1, 4+(10*blockSize), 10, -1)
@ -359,13 +359,19 @@ func renderMultiplayerMatrix() {
}
sort.Ints(playerIDs)
i = 0
var matrixes []*mino.Matrix
for _, playerID := range playerIDs {
if g.Players[playerID] == nil {
continue
}
i++
matrixes = append(matrixes, g.Players[playerID].Matrix)
if i == multiplayerMatrixSize {
break
}
}
g.Unlock()
@ -438,17 +444,21 @@ func renderMatrix(m *mino.Matrix) []byte {
renderBuffer.Write(renderLRCorner)
renderBuffer.WriteRune('\n')
renderPlayerDetails(renderBuffer, m, bs)
renderPlayerDetails(m, bs)
return renderBuffer.Bytes()
}
func renderPlayerDetails(b bytes.Buffer, m *mino.Matrix, bs int) {
func renderPlayerDetails(m *mino.Matrix, bs int) {
var buf string
if !showDetails {
buf = m.PlayerName
} else {
buf = strconv.Itoa(m.Speed)
if blockSize == 1 {
buf = fmt.Sprintf("%d/%d @ %d", m.GarbageSent, m.GarbageReceived, m.Speed)
} else {
buf = fmt.Sprintf("%d / %d @ %d", m.GarbageSent, m.GarbageReceived, m.Speed)
}
}
if len(buf) > m.W*bs {
buf = buf[:m.W*bs]
@ -531,7 +541,7 @@ func renderMatrixes(mx []*mino.Matrix) []byte {
renderBuffer.WriteString(div)
}
renderPlayerDetails(renderBuffer, m, blockSize)
renderPlayerDetails(m, blockSize)
}
for i := range mx {

View file

@ -7,6 +7,8 @@ import (
)
func TestRenderMatrix(t *testing.T) {
blockSize = 1
m, err := mino.NewTestMatrix()
if err != nil {
t.Error(err)
@ -21,6 +23,8 @@ func TestRenderMatrix(t *testing.T) {
}
func BenchmarkRenderStandardMatrix(b *testing.B) {
blockSize = 1
m, err := mino.NewTestMatrix()
if err != nil {
b.Error(err)

View file

@ -429,6 +429,9 @@ func (g *Game) handleDistributeMatrixes() {
matrixes = make(map[int]*mino.Matrix)
for playerID, player := range g.Players {
player.Matrix.GarbageSent = player.totalGarbageSent
player.Matrix.GarbageReceived = player.totalGarbageReceived
matrixes[playerID] = player.Matrix
}
g.WriteAllL(&GameCommandUpdateMatrix{Matrixes: matrixes})

View file

@ -36,7 +36,11 @@ type Matrix struct {
ComboEnd time.Time `json:"-"`
PendingGarbage int `json:"-"`
PendingGarbageTime time.Time `json:"-"`
Speed int
LinesCleared int
GarbageSent int
GarbageReceived int
Speed int
GameOver bool