snengame/internal/game/board.go

214 lines
3.7 KiB
Go

package game
import (
"fmt"
"github.com/google/uuid"
)
type Board struct {
Sentinal [4]*Card `json:"sentinal"`
Scourge [4]*Card `json:"scourge"`
}
func NewBoard() *Board {
return &Board{
Sentinal: [4]*Card{NewCard(-1, uuid.Nil), NewCard(-1, uuid.Nil), NewCard(-1, uuid.Nil), NewCard(-1, uuid.Nil)},
Scourge: [4]*Card{NewCard(-1, uuid.Nil), NewCard(-1, uuid.Nil), NewCard(-1, uuid.Nil), NewCard(-1, uuid.Nil)},
}
}
func (b *Board) String() string {
return fmt.Sprintf("---------\n|%v|%v|%v|%v|\n---------\n|%v|%v|%v|%v|\n---------\n", b.Sentinal[0], b.Sentinal[1], b.Sentinal[2], b.Sentinal[3], b.Scourge[0], b.Scourge[1], b.Scourge[2], b.Scourge[3])
}
func (b *Board) GetRow(id int) []*Card {
if id == 1 {
return b.Sentinal[:]
} else {
return b.Scourge[:]
}
}
func (b *Board) GetCard(id int, pos int) *Card {
if id == SentinalID {
return b.Sentinal[pos]
} else {
return b.Scourge[pos]
}
}
func (b *Board) Remove(c *Card) {
for k, v := range b.Sentinal {
if v.Id == c.Id {
b.Sentinal[k] = NewCard(-1, uuid.Nil)
}
}
for k, v := range b.Scourge {
if v.Id == c.Id {
b.Scourge[k] = NewCard(-1, uuid.Nil)
}
}
}
func (b *Board) Empty(id int) bool {
res := true
if id == SentinalID {
for _, v := range b.Sentinal {
if !v.Empty() {
res = false
}
}
} else {
for _, v := range b.Scourge {
if !v.Empty() {
res = false
}
}
}
return res
}
func (b *Board) CanMove(id, src, dest int) bool {
var brd [4]*Card
if id == SentinalID {
brd = b.Sentinal
} else {
brd = b.Scourge
}
if brd[src].Empty() {
return false
}
if !brd[dest].Empty() {
return false
}
if brd[src].Sick {
return false
}
return true
}
func (b *Board) Move(id, src, dest int) bool {
var brd [4]*Card
if id == SentinalID {
brd = b.Sentinal
} else {
brd = b.Scourge
}
if brd[src].Empty() {
return false
}
if !brd[dest].Empty() {
return false
}
if brd[src].Sick {
return false
}
brd[dest] = brd[src]
brd[src] = NewCard(-1, uuid.Nil)
if id == SentinalID {
b.Sentinal = brd
} else {
b.Scourge = brd
}
return true
}
func (b *Board) CanPlay(id int, c *Card, dest int) bool {
var brd [4]*Card
if id == SentinalID {
brd = b.Sentinal
} else {
brd = b.Scourge
}
if !brd[dest].Empty() {
return false
}
return true
}
func (b *Board) Play(id int, c *Card, dest int, should bool) bool {
var brd [4]*Card
if id == SentinalID {
brd = b.Sentinal
} else {
brd = b.Scourge
}
if !brd[dest].Empty() {
return false
}
if should {
brd[dest] = c
}
if id == SentinalID {
b.Sentinal = brd
} else {
b.Scourge = brd
}
return true
}
func (b *Board) CanAttack(id, atk, def int) bool {
var aBrd [4]*Card
if id == SentinalID {
aBrd = b.Sentinal
} else {
aBrd = b.Scourge
}
if aBrd[atk].Empty() || aBrd[atk].Sick || atk != def {
return false
}
return true
}
func (b *Board) Attack(id int, atk, def int) int {
var aBrd [4]*Card
var dBrd [4]*Card
if id == SentinalID {
aBrd = b.Sentinal
dBrd = b.Scourge
} else {
aBrd = b.Scourge
dBrd = b.Sentinal
}
if dBrd[def].Empty() {
//health damage
if id == SentinalID {
b.Sentinal = aBrd
b.Scourge = dBrd
} else {
b.Scourge = aBrd
b.Sentinal = dBrd
}
return 1
}
//Do actual battle math
attacker := aBrd[atk].Power
defender := dBrd[def].Power
if attacker > defender {
dBrd[def] = NewCard(-1, uuid.Nil)
if id == SentinalID {
b.Sentinal = aBrd
b.Scourge = dBrd
} else {
b.Scourge = aBrd
b.Sentinal = dBrd
}
return 0
}
if attacker == defender {
aBrd[atk] = NewCard(-1, uuid.Nil)
dBrd[def] = NewCard(-1, uuid.Nil)
if id == 1 {
b.Sentinal = aBrd
b.Scourge = dBrd
} else {
b.Scourge = aBrd
b.Sentinal = dBrd
}
return 0
}
return -1
}