Show garbage sent / receive and speed on TAB, limit number of multiplayer matrixes displayed based on window size
This commit is contained in:
parent
31d7971372
commit
4d167068e8
5 changed files with 51 additions and 12 deletions
18
README.md
18
README.md
|
@ -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).
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue