snengame/internal/game/board.go

201 lines
3.7 KiB
Go
Raw Normal View History

2021-07-22 15:37:25 -04:00
package game
2021-07-15 19:26:57 -04:00
import (
"encoding/json"
"fmt"
)
2021-07-16 14:53:45 -04:00
2021-07-15 19:26:57 -04:00
type Board struct {
Sentinal [4]Card `json:"sentinal"`
Scourge [4]Card `json:"scourge"`
2021-07-15 19:26:57 -04:00
}
func NewBoard() *Board {
return &Board{
Sentinal: [4]Card{CreateCard(-1), CreateCard(-1), CreateCard(-1), CreateCard(-1)},
Scourge: [4]Card{CreateCard(-1), CreateCard(-1), CreateCard(-1), CreateCard(-1)},
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-15 19:26:57 -04:00
func (b *Board) GetRow(id int) []Card {
if id == 1 {
return b.Sentinal[:]
} else {
return b.Scourge[:]
}
}
2021-07-22 13:43:28 -04:00
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
}
2021-07-15 19:26:57 -04:00
func (b *Board) Move(id, src, dest int) bool {
var brd [4]Card
if id == 1 {
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
}
if brd[src].Acted() {
return false
}
brd[dest].Act()
2021-07-15 19:26:57 -04:00
brd[dest] = brd[src]
brd[src] = CreateCard(-1)
2021-07-15 19:26:57 -04:00
if id == 1 {
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-15 19:26:57 -04:00
var brd [4]Card
if id == 1 {
brd = b.Sentinal
} else {
brd = b.Scourge
}
2021-07-16 14:53:45 -04:00
if !brd[dest].Empty() {
2021-07-15 19:26:57 -04:00
return false
}
2021-07-15 21:44:45 -04:00
return true
}
func (b *Board) Play(id int, c *Card, dest int) bool {
var brd [4]Card
if id == 1 {
brd = b.Sentinal
} else {
brd = b.Scourge
}
2021-07-16 14:53:45 -04:00
if !brd[dest].Empty() {
2021-07-15 21:44:45 -04:00
return false
}
brd[dest] = *c
2021-07-15 19:26:57 -04:00
if id == 1 {
b.Sentinal = brd
} else {
b.Scourge = brd
}
return true
}
func (b *Board) Attack(id int, atk, def int) int {
var aBrd [4]Card
var dBrd [4]Card
if id == 1 {
aBrd = b.Sentinal
dBrd = b.Scourge
} else {
aBrd = b.Scourge
dBrd = b.Sentinal
}
2021-07-16 14:53:45 -04:00
if aBrd[atk].Empty() || !aBrd[atk].CanAttack(atk, def) {
2021-07-15 19:26:57 -04:00
return -1
}
aBrd[atk].Act()
2021-07-16 14:53:45 -04:00
if dBrd[def].Empty() {
2021-07-15 19:26:57 -04:00
//health damage
if id == 1 {
b.Sentinal = aBrd
b.Scourge = dBrd
} else {
b.Scourge = aBrd
b.Sentinal = dBrd
}
return 1
}
//Do actual battle math
2021-07-15 20:58:21 -04:00
attacker := aBrd[atk].Value()
defender := dBrd[def].Value()
dBrd[def].Acted()
2021-07-15 19:26:57 -04:00
//check atk buffs
for i, v := range aBrd {
2021-07-15 20:58:21 -04:00
if v.Value() == Two {
2021-07-15 19:26:57 -04:00
attacker = attacker + 1
}
2021-07-15 20:58:21 -04:00
if v.Value() == Three && (i == atk-1 || i == atk+1) {
2021-07-15 19:26:57 -04:00
attacker = attacker + 1
}
}
for i, v := range dBrd {
2021-07-15 20:58:21 -04:00
if v.Value() == Two {
2021-07-15 19:26:57 -04:00
defender = defender + 1
}
2021-07-15 20:58:21 -04:00
if v.Value() == Three && (i == def-1 || i == def+1) {
2021-07-15 19:26:57 -04:00
defender = defender + 1
}
}
if attacker > defender {
dBrd[def] = CreateCard(-1)
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
}
if attacker == defender {
aBrd[atk] = CreateCard(-1)
dBrd[def] = CreateCard(-1)
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
}
func (b *Board) MarshalJSON() ([]byte, error) {
res := [][]*PortableCard{{b.Sentinal[0].Port(), b.Sentinal[1].Port(), b.Sentinal[2].Port(), b.Sentinal[3].Port()}, {b.Scourge[0].Port(), b.Scourge[1].Port(), b.Scourge[2].Port(), b.Scourge[3].Port()}}
return json.Marshal(res)
}
func (b *Board) UnmarshalJSON(data []byte) (err error) {
var ported [][]PortableCard
err = json.Unmarshal(data, &ported)
if err != nil {
return err
}
for i := 0; i < 4; i++ {
b.Sentinal[i] = NewCard(ported[0][i].Type, ported[0][i].ID)
}
for i := 0; i < 4; i++ {
b.Scourge[i] = NewCard(ported[1][i].Type, ported[0][i].ID)
}
return
}