2021-07-22 15:37:25 -04:00
|
|
|
package game
|
2021-07-15 19:26:57 -04:00
|
|
|
|
2021-07-23 16:43:39 -04:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
)
|
2021-07-16 14:53:45 -04:00
|
|
|
|
2021-07-15 19:26:57 -04:00
|
|
|
type Board struct {
|
2021-07-23 18:33:17 -04:00
|
|
|
Sentinal [4]*Card `json:"sentinal"`
|
|
|
|
Scourge [4]*Card `json:"scourge"`
|
2021-07-15 19:26:57 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewBoard() *Board {
|
|
|
|
return &Board{
|
2021-07-25 13:27:12 -04:00
|
|
|
Sentinal: [4]*Card{NewEmpty(0), NewEmpty(1), NewEmpty(2), NewEmpty(3)},
|
|
|
|
Scourge: [4]*Card{NewEmpty(0), NewEmpty(1), NewEmpty(2), NewEmpty(3)},
|
2021-07-15 19:26:57 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-16 14:53:45 -04:00
|
|
|
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])
|
|
|
|
}
|
|
|
|
|
2021-07-23 18:33:17 -04:00
|
|
|
func (b *Board) GetRow(id int) []*Card {
|
2021-07-25 13:27:12 -04:00
|
|
|
if id == SentinalID {
|
2021-07-15 19:26:57 -04:00
|
|
|
return b.Sentinal[:]
|
|
|
|
} else {
|
|
|
|
return b.Scourge[:]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-23 18:33:17 -04:00
|
|
|
func (b *Board) GetCard(id int, pos int) *Card {
|
2021-07-25 13:27:12 -04:00
|
|
|
return b.GetRow(id)[pos]
|
2021-07-23 18:33:17 -04:00
|
|
|
}
|
|
|
|
|
2021-07-23 18:57:39 -04:00
|
|
|
func (b *Board) Remove(c *Card) {
|
|
|
|
for k, v := range b.Sentinal {
|
|
|
|
if v.Id == c.Id {
|
2021-07-25 13:27:12 -04:00
|
|
|
b.Sentinal[k] = NewEmpty(k)
|
2021-07-23 18:57:39 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
for k, v := range b.Scourge {
|
|
|
|
if v.Id == c.Id {
|
2021-07-25 13:27:12 -04:00
|
|
|
b.Scourge[k] = NewEmpty(k)
|
2021-07-23 18:57:39 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-22 13:43:28 -04:00
|
|
|
func (b *Board) Empty(id int) bool {
|
|
|
|
res := true
|
2021-07-25 13:27:12 -04:00
|
|
|
row := b.GetRow(id)
|
|
|
|
for _, v := range row {
|
|
|
|
if !v.Empty() {
|
|
|
|
res = false
|
2021-07-22 13:43:28 -04:00
|
|
|
}
|
|
|
|
}
|
2021-07-25 13:27:12 -04:00
|
|
|
|
2021-07-22 13:43:28 -04:00
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
2021-07-23 18:33:17 -04:00
|
|
|
func (b *Board) CanMove(id, src, dest int) bool {
|
2021-07-25 13:27:12 -04:00
|
|
|
brd := b.GetRow(id)
|
2021-07-23 18:33:17 -04:00
|
|
|
if brd[src].Empty() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if !brd[dest].Empty() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if brd[src].Sick {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2021-07-15 19:26:57 -04:00
|
|
|
func (b *Board) Move(id, src, dest int) bool {
|
2021-07-23 18:33:17 -04:00
|
|
|
var brd [4]*Card
|
|
|
|
if id == SentinalID {
|
2021-07-15 19:26:57 -04:00
|
|
|
brd = b.Sentinal
|
|
|
|
} else {
|
|
|
|
brd = b.Scourge
|
|
|
|
}
|
2021-07-16 14:53:45 -04:00
|
|
|
if brd[src].Empty() {
|
2021-07-15 19:26:57 -04:00
|
|
|
return false
|
|
|
|
}
|
2021-07-16 14:53:45 -04:00
|
|
|
if !brd[dest].Empty() {
|
2021-07-15 19:26:57 -04:00
|
|
|
return false
|
|
|
|
}
|
2021-07-23 18:33:17 -04:00
|
|
|
if brd[src].Sick {
|
2021-07-16 15:35:29 -04:00
|
|
|
return false
|
|
|
|
}
|
2021-07-15 19:26:57 -04:00
|
|
|
brd[dest] = brd[src]
|
2021-07-25 13:27:12 -04:00
|
|
|
brd[src] = NewEmpty(src)
|
2021-07-23 18:33:17 -04:00
|
|
|
if id == SentinalID {
|
2021-07-15 19:26:57 -04:00
|
|
|
b.Sentinal = brd
|
|
|
|
} else {
|
|
|
|
b.Scourge = brd
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2021-07-15 21:44:45 -04:00
|
|
|
func (b *Board) CanPlay(id int, c *Card, dest int) bool {
|
2021-07-25 13:27:12 -04:00
|
|
|
brd := b.GetRow(id)
|
2021-07-25 13:35:49 -04:00
|
|
|
if !brd[dest].Empty() || !c.Spell {
|
2021-07-15 19:26:57 -04:00
|
|
|
return false
|
|
|
|
}
|
2021-07-15 21:44:45 -04:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2021-07-23 18:33:17 -04:00
|
|
|
func (b *Board) Play(id int, c *Card, dest int, should bool) bool {
|
2021-07-25 13:27:12 -04:00
|
|
|
brd := b.GetRow(id)
|
2021-07-23 18:33:17 -04:00
|
|
|
if should {
|
|
|
|
brd[dest] = c
|
2021-07-25 13:27:12 -04:00
|
|
|
c.Position = dest
|
2021-07-15 19:26:57 -04:00
|
|
|
} else {
|
2021-07-25 13:27:12 -04:00
|
|
|
return false
|
2021-07-15 19:26:57 -04:00
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2021-07-23 18:33:17 -04:00
|
|
|
func (b *Board) CanAttack(id, atk, def int) bool {
|
2021-07-25 13:27:12 -04:00
|
|
|
aBrd := b.GetRow(id)
|
2021-07-23 18:33:17 -04:00
|
|
|
if aBrd[atk].Empty() || aBrd[atk].Sick || atk != def {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2021-07-15 19:26:57 -04:00
|
|
|
func (b *Board) Attack(id int, atk, def int) int {
|
2021-07-23 18:33:17 -04:00
|
|
|
var aBrd [4]*Card
|
|
|
|
var dBrd [4]*Card
|
|
|
|
if id == SentinalID {
|
2021-07-15 19:26:57 -04:00
|
|
|
aBrd = b.Sentinal
|
|
|
|
dBrd = b.Scourge
|
|
|
|
} else {
|
|
|
|
aBrd = b.Scourge
|
|
|
|
dBrd = b.Sentinal
|
|
|
|
}
|
2021-07-16 14:53:45 -04:00
|
|
|
if dBrd[def].Empty() {
|
2021-07-15 19:26:57 -04:00
|
|
|
//health damage
|
2021-07-23 18:33:17 -04:00
|
|
|
if id == SentinalID {
|
2021-07-15 19:26:57 -04:00
|
|
|
b.Sentinal = aBrd
|
|
|
|
b.Scourge = dBrd
|
|
|
|
} else {
|
|
|
|
b.Scourge = aBrd
|
|
|
|
b.Sentinal = dBrd
|
|
|
|
}
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
//Do actual battle math
|
2021-07-23 18:33:17 -04:00
|
|
|
attacker := aBrd[atk].Power
|
|
|
|
defender := dBrd[def].Power
|
2021-07-15 19:26:57 -04:00
|
|
|
if attacker > defender {
|
2021-07-25 13:27:12 -04:00
|
|
|
dBrd[def] = NewEmpty(def)
|
2021-07-23 18:33:17 -04:00
|
|
|
if id == SentinalID {
|
2021-07-15 19:26:57 -04:00
|
|
|
b.Sentinal = aBrd
|
|
|
|
b.Scourge = dBrd
|
|
|
|
} else {
|
|
|
|
b.Scourge = aBrd
|
|
|
|
b.Sentinal = dBrd
|
|
|
|
}
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
if attacker == defender {
|
2021-07-25 13:27:12 -04:00
|
|
|
aBrd[atk] = NewEmpty(atk)
|
|
|
|
dBrd[def] = NewEmpty(def)
|
2021-07-15 19:26:57 -04:00
|
|
|
if id == 1 {
|
|
|
|
b.Sentinal = aBrd
|
|
|
|
b.Scourge = dBrd
|
|
|
|
} else {
|
|
|
|
b.Scourge = aBrd
|
|
|
|
b.Sentinal = dBrd
|
|
|
|
}
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return -1
|
|
|
|
|
|
|
|
}
|