Resolve resetting practice game on game over
This commit is contained in:
parent
f853512332
commit
7fe65c1183
3 changed files with 75 additions and 44 deletions
|
@ -425,47 +425,63 @@ func (g *Game) handleDistributeMatrixes() {
|
|||
}
|
||||
}
|
||||
|
||||
if !g.gameOver && !g.Local && remainingPlayers <= 1 {
|
||||
requiredPlayers := 2
|
||||
if g.Local {
|
||||
requiredPlayers = 0
|
||||
}
|
||||
|
||||
if !g.gameOver && remainingPlayers <= requiredPlayers {
|
||||
g.setGameOverL(true)
|
||||
|
||||
winner := "Tie!"
|
||||
var otherPlayers string
|
||||
for i := range g.Players {
|
||||
if i == remainingPlayer {
|
||||
winner = g.Players[remainingPlayer].Name
|
||||
continue
|
||||
}
|
||||
if otherPlayers != "" {
|
||||
otherPlayers += ", "
|
||||
}
|
||||
if g.Local {
|
||||
g.WriteMessage("Game over")
|
||||
|
||||
otherPlayers += g.Players[i].Name
|
||||
}
|
||||
go func() {
|
||||
time.Sleep(3 * time.Second)
|
||||
|
||||
g.WriteAllL(&GameCommandGameOver{Winner: winner})
|
||||
|
||||
g.WriteMessage("Game over - winner: " + winner)
|
||||
g.WriteMessage("Garbage sent/received:")
|
||||
for _, p := range g.Players {
|
||||
g.WriteMessage(p.Name + " - " + strconv.Itoa(p.totalGarbageSent) + "/" + strconv.Itoa(p.totalGarbageReceived))
|
||||
}
|
||||
|
||||
if len(g.Players) < 2 {
|
||||
g.WriteMessage("Game will start when there are at least two players")
|
||||
}
|
||||
|
||||
go func() {
|
||||
for {
|
||||
time.Sleep(7 * time.Second)
|
||||
if g.Terminated {
|
||||
return
|
||||
} else if len(g.Players) > 1 {
|
||||
g.Reset()
|
||||
g.Start(0)
|
||||
return
|
||||
g.Reset()
|
||||
g.Start(0)
|
||||
}()
|
||||
} else {
|
||||
winner := "Tie!"
|
||||
var otherPlayers string
|
||||
for i := range g.Players {
|
||||
if i == remainingPlayer {
|
||||
winner = g.Players[remainingPlayer].Name
|
||||
continue
|
||||
}
|
||||
if otherPlayers != "" {
|
||||
otherPlayers += ", "
|
||||
}
|
||||
|
||||
otherPlayers += g.Players[i].Name
|
||||
}
|
||||
}()
|
||||
|
||||
g.WriteAllL(&GameCommandGameOver{Winner: winner})
|
||||
|
||||
g.WriteMessage("Game over - winner: " + winner)
|
||||
g.WriteMessage("Garbage sent/received:")
|
||||
for _, p := range g.Players {
|
||||
g.WriteMessage(p.Name + " - " + strconv.Itoa(p.totalGarbageSent) + "/" + strconv.Itoa(p.totalGarbageReceived))
|
||||
}
|
||||
|
||||
if len(g.Players) < 2 {
|
||||
g.WriteMessage("Game will start when there are at least two players")
|
||||
}
|
||||
|
||||
go func() {
|
||||
for {
|
||||
time.Sleep(7 * time.Second)
|
||||
if g.Terminated {
|
||||
return
|
||||
} else if len(g.Players) > 1 {
|
||||
g.Reset()
|
||||
g.Start(0)
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
matrixes = make(map[int]*mino.Matrix)
|
||||
|
|
|
@ -273,10 +273,10 @@ func (m *Matrix) ClearFilled() int {
|
|||
func (m *Matrix) clearFilled() int {
|
||||
cleared := 0
|
||||
|
||||
for y := 0; y < m.H+m.B; y++ {
|
||||
for y := 0; y < (m.H+m.B)-1; y++ {
|
||||
for {
|
||||
if m.LineFilled(y) {
|
||||
for my := y + 1; my < m.H+m.B; my++ {
|
||||
for my := y + 1; my < (m.H+m.B)-1; my++ {
|
||||
for mx := 0; mx < m.W; mx++ {
|
||||
m.M[I(mx, my-1, m.W)] = m.M[I(mx, my, m.W)]
|
||||
}
|
||||
|
@ -321,10 +321,14 @@ func (m *Matrix) ReceiveGarbage() {
|
|||
}
|
||||
|
||||
func (m *Matrix) addGarbage(lines int) bool {
|
||||
for my := m.H + m.B; my >= 0; my-- {
|
||||
for my := (m.H + m.B) - 1; my >= 0; my-- {
|
||||
for mx := 0; mx < m.W; mx++ {
|
||||
if my >= m.H+m.B-lines && m.M[I(mx, my, m.W)] != BlockNone {
|
||||
return false
|
||||
if my >= (m.H+m.B-1)-lines {
|
||||
if m.M[I(mx, my, m.W)] != BlockNone {
|
||||
return false
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
m.M[I(mx, my+lines, m.W)] = m.M[I(mx, my, m.W)]
|
||||
|
@ -456,11 +460,12 @@ func (m *Matrix) DrawPiecesL() {
|
|||
}
|
||||
|
||||
func (m *Matrix) Block(x int, y int) Block {
|
||||
index := I(x, y, m.W)
|
||||
if index < 0 || index > m.W*(m.H+m.B) {
|
||||
if x < 0 || x >= m.W || y < 0 || y >= m.H+m.B {
|
||||
return BlockGarbage
|
||||
}
|
||||
|
||||
index := I(x, y, m.W)
|
||||
|
||||
// Return overlay block first
|
||||
b := m.O[index]
|
||||
if b != BlockNone {
|
||||
|
@ -576,7 +581,7 @@ func (m *Matrix) SpawnLocation(p *Piece) Point {
|
|||
w, _ := p.Size()
|
||||
x := (m.W / 2) - (w / 2)
|
||||
|
||||
for y := m.H; y < m.H+m.B; y++ {
|
||||
for y := m.H; y < (m.H+m.B)-1; y++ {
|
||||
if m.canAddAt(p, Point{x, y}) {
|
||||
return Point{x, y}
|
||||
}
|
||||
|
@ -633,7 +638,7 @@ func (m *Matrix) finishLandingPiece() {
|
|||
LANDPIECE:
|
||||
for y := m.P.Y; y >= 0; y-- {
|
||||
if y == 0 || !m.canAddAt(m.P, Point{m.P.X, y - 1}) {
|
||||
for dropY := y - 1; dropY < m.H+m.B; dropY++ {
|
||||
for dropY := y - 1; dropY < (m.H+m.B)-1; dropY++ {
|
||||
if !m.canAddAt(m.P, Point{m.P.X, dropY}) {
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -74,4 +74,14 @@ func TestMatrix(t *testing.T) {
|
|||
t.Errorf("failed to Move piece on iteration %d", i)
|
||||
}
|
||||
}
|
||||
|
||||
ok = m.addGarbage(1)
|
||||
if !ok {
|
||||
t.Error("failed to add 1 line of garbage")
|
||||
}
|
||||
|
||||
ok = m.addGarbage(3)
|
||||
if !ok {
|
||||
t.Error("failed to add 3 line of garbage")
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue