initial migration
This commit is contained in:
commit
611c3e25ca
10
board.go
Normal file
10
board.go
Normal file
@ -0,0 +1,10 @@
|
||||
package tome_game
|
||||
|
||||
import . "git.saintnet.tech/tomecraft/tome_lib"
|
||||
|
||||
func NewBoard() *Board {
|
||||
return &Board{
|
||||
Sentinal: [4]*Card{NewEmpty(0), NewEmpty(1), NewEmpty(2), NewEmpty(3)},
|
||||
Scourge: [4]*Card{NewEmpty(0), NewEmpty(1), NewEmpty(2), NewEmpty(3)},
|
||||
}
|
||||
}
|
24
card.go
Normal file
24
card.go
Normal file
@ -0,0 +1,24 @@
|
||||
package tome_game
|
||||
|
||||
import (
|
||||
. "git.saintnet.tech/tomecraft/tome_lib"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func NewCard(v, o, p int, id uuid.UUID) *Card {
|
||||
if id == uuid.Nil {
|
||||
id = uuid.New()
|
||||
}
|
||||
return &Card{
|
||||
Type: CardType(v),
|
||||
BasePower: OraclePower(CardType(v), nil),
|
||||
Power: OraclePower(CardType(v), nil),
|
||||
Id: id,
|
||||
Sick: false,
|
||||
Counters: 0,
|
||||
Owner: o,
|
||||
Position: p,
|
||||
Spell: OracleSpell(CardType(v), nil),
|
||||
Effects: []*Effect{},
|
||||
}
|
||||
}
|
19
deck.go
Normal file
19
deck.go
Normal file
@ -0,0 +1,19 @@
|
||||
package tome_game
|
||||
|
||||
import (
|
||||
. "git.saintnet.tech/tomecraft/tome_lib"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func NewDeck(owner int) *Deck {
|
||||
cards := []*Card{}
|
||||
for i := 0; i < 3; i++ {
|
||||
for j := 1; j < 9; j++ {
|
||||
cards = append(cards, NewCard(j, owner, -1, uuid.Nil))
|
||||
}
|
||||
}
|
||||
cards = append(cards, NewCard(0, owner, -1, uuid.Nil))
|
||||
return &Deck{
|
||||
Cards: cards,
|
||||
}
|
||||
}
|
398
game.go
Normal file
398
game.go
Normal file
@ -0,0 +1,398 @@
|
||||
package tome_game
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
. "git.saintnet.tech/tomecraft/tome_lib"
|
||||
)
|
||||
|
||||
type Game struct {
|
||||
GameBoard *Board
|
||||
SentinalPlayer *Player
|
||||
ScourgePlayer *Player
|
||||
SentinalDeck *Deck
|
||||
ScourgeDeck *Deck
|
||||
CurrentTurn int
|
||||
CardBuffer *Deck
|
||||
CanDraw bool
|
||||
HasDrawn bool
|
||||
Status GameStatus
|
||||
}
|
||||
|
||||
func NewGame() *Game {
|
||||
deckA := NewDeck(SentinalID)
|
||||
deckB := NewDeck(ScourgeID)
|
||||
deckA.Shuffle()
|
||||
deckB.Shuffle()
|
||||
return &Game{
|
||||
GameBoard: NewBoard(),
|
||||
SentinalPlayer: NewPlayer("Sentinal", SentinalID),
|
||||
ScourgePlayer: NewPlayer("Scourge", ScourgeID),
|
||||
SentinalDeck: deckA,
|
||||
ScourgeDeck: deckB,
|
||||
CurrentTurn: 0, //start with no turn
|
||||
CardBuffer: DeckFromCards([]*Card{}),
|
||||
CanDraw: false,
|
||||
HasDrawn: false,
|
||||
Status: StatusLobby,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Game) String() string {
|
||||
return fmt.Sprintf("Sen(%v): %v\n\n%v\n\nSco(%v): %v\nStatus:%v Draw:%v Turn:%v\n%v\n", g.SentinalPlayer.Life, g.SentinalPlayer.Hand, g.GameBoard, g.ScourgePlayer.Life, g.ScourgePlayer.Hand, g.Status, g.CanDraw, g.CurrentTurn, g.CardBuffer)
|
||||
}
|
||||
|
||||
func (g *Game) Parse(cmd *Command) *CommandResult {
|
||||
|
||||
if g.Status == StatusDraw || g.Status == StatusScourgeWin || g.Status == StatusSentinalWin || g.Status == StatusStop {
|
||||
return &CommandResult{
|
||||
PlayerID: cmd.PlayerID,
|
||||
ResultType: cmd.Type,
|
||||
StateResult: NewView(cmd.PlayerID, g),
|
||||
ActionResult: nil,
|
||||
DebugResult: g,
|
||||
}
|
||||
}
|
||||
|
||||
var state_res *GameView
|
||||
var action_res *Deck
|
||||
var debug_res *Game
|
||||
var res_type CmdType
|
||||
|
||||
if cmd.Type == ActCmd && g.Status == StatusPlaying {
|
||||
action_res = g.PlayerAct(cmd.PlayerID, cmd.Cmd)
|
||||
state_res = nil
|
||||
debug_res = nil
|
||||
res_type = ActCmd
|
||||
} else if cmd.Type == StateCmd {
|
||||
state_res = g.PlayerStateAct(cmd.PlayerID, cmd.Cmd)
|
||||
action_res = nil
|
||||
debug_res = nil
|
||||
res_type = StateCmd
|
||||
} else if cmd.Type == DebugCmd {
|
||||
state_res = nil
|
||||
action_res = nil
|
||||
debug_res = g
|
||||
res_type = DebugCmd
|
||||
} else {
|
||||
state_res = nil
|
||||
action_res = nil
|
||||
debug_res = nil
|
||||
res_type = InvalidCmd
|
||||
}
|
||||
g.StateChanges()
|
||||
return &CommandResult{
|
||||
PlayerID: cmd.PlayerID,
|
||||
ResultType: res_type,
|
||||
StateResult: state_res,
|
||||
ActionResult: action_res,
|
||||
DebugResult: debug_res,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Game) StateChanges() {
|
||||
//check for no actions first
|
||||
if len(g.SentinalPlayer.Hand) == 0 && g.SentinalDeck.Size() == 0 {
|
||||
if g.GameBoard.Empty(SentinalID) {
|
||||
g.Status = StatusScourgeWin
|
||||
}
|
||||
}
|
||||
|
||||
if len(g.ScourgePlayer.Hand) == 0 && g.ScourgeDeck.Size() == 0 {
|
||||
if g.GameBoard.Empty(ScourgeID) {
|
||||
g.Status = StatusSentinalWin
|
||||
}
|
||||
}
|
||||
//reapply card effects
|
||||
g.GameBoard.ResetCards()
|
||||
for i := 0; i < len(g.GameBoard.Sentinal); i++ {
|
||||
OracleTick(g.GameBoard.Sentinal[i], g) //apply effect stacks first
|
||||
OracleTick(g.GameBoard.Scourge[i], g)
|
||||
}
|
||||
for i := 0; i < len(g.GameBoard.Sentinal); i++ {
|
||||
OracleEffect(g.GameBoard.Sentinal[i], g) //activate effects
|
||||
OracleEffect(g.GameBoard.Scourge[i], g)
|
||||
}
|
||||
//check life
|
||||
//this is second on purpose so that it shadows deck out win conditions
|
||||
//if you use your last action to win the game, you should actually win
|
||||
if g.SentinalPlayer.Life < 0 {
|
||||
g.Status = StatusScourgeWin
|
||||
}
|
||||
if g.ScourgePlayer.Life < 0 {
|
||||
g.Status = StatusSentinalWin
|
||||
}
|
||||
if g.ScourgePlayer.Life < 0 && g.SentinalPlayer.Life < 0 {
|
||||
g.Status = StatusDraw
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Game) PlayerStateAct(id int, cmd string) *GameView {
|
||||
switch cmd {
|
||||
case "d":
|
||||
Debug(g)
|
||||
case "g":
|
||||
//game state
|
||||
return NewView(id, g)
|
||||
case "b":
|
||||
//begin game
|
||||
if id == SentinalID {
|
||||
g.SentinalPlayer.Ready = true
|
||||
} else if id == ScourgeID {
|
||||
g.ScourgePlayer.Ready = true
|
||||
}
|
||||
if g.SentinalPlayer.Ready && g.ScourgePlayer.Ready && g.Status == StatusLobby {
|
||||
g.Status = StatusReady
|
||||
if id == SentinalID {
|
||||
g.SentinalPlayer.Hand = g.SentinalDeck.Cards[len(g.SentinalDeck.Cards)-5 : len(g.SentinalDeck.Cards)]
|
||||
g.SentinalDeck.Cards = g.SentinalDeck.Cards[0 : len(g.SentinalDeck.Cards)-5]
|
||||
|
||||
g.ScourgePlayer.Hand = g.ScourgeDeck.Cards[len(g.ScourgeDeck.Cards)-6 : len(g.ScourgeDeck.Cards)]
|
||||
g.ScourgeDeck.Cards = g.ScourgeDeck.Cards[0 : len(g.ScourgeDeck.Cards)-6]
|
||||
g.CurrentTurn = SentinalID
|
||||
} else {
|
||||
g.SentinalPlayer.Hand = g.SentinalDeck.Cards[len(g.SentinalDeck.Cards)-6 : len(g.SentinalDeck.Cards)]
|
||||
g.SentinalDeck.Cards = g.SentinalDeck.Cards[0 : len(g.SentinalDeck.Cards)-6]
|
||||
|
||||
g.ScourgePlayer.Hand = g.ScourgeDeck.Cards[len(g.ScourgeDeck.Cards)-5 : len(g.ScourgeDeck.Cards)]
|
||||
g.ScourgeDeck.Cards = g.ScourgeDeck.Cards[0 : len(g.ScourgeDeck.Cards)-5]
|
||||
g.CurrentTurn = ScourgeID
|
||||
}
|
||||
}
|
||||
case "s":
|
||||
//start turn
|
||||
if g.Status == StatusReady { //first turn
|
||||
g.Status = StatusPlaying
|
||||
}
|
||||
//skip draw step when 0 life
|
||||
if id == SentinalID && g.SentinalPlayer.Life <= 0 {
|
||||
g.CanDraw = false
|
||||
g.HasDrawn = true
|
||||
} else if id == ScourgeID && g.ScourgePlayer.Life <= 0 {
|
||||
g.CanDraw = false
|
||||
g.HasDrawn = true
|
||||
} else {
|
||||
g.CanDraw = true
|
||||
g.HasDrawn = false
|
||||
}
|
||||
if id != g.CurrentTurn {
|
||||
return nil
|
||||
}
|
||||
if id == SentinalID {
|
||||
for _, v := range g.GameBoard.Sentinal {
|
||||
OracleUpkeep(v, g)
|
||||
}
|
||||
} else {
|
||||
for _, v := range g.GameBoard.Scourge {
|
||||
OracleUpkeep(v, g)
|
||||
}
|
||||
}
|
||||
case "e":
|
||||
//end turn and clean up
|
||||
if id != g.CurrentTurn {
|
||||
return nil
|
||||
}
|
||||
g.CardBuffer = DeckFromCards([]*Card{})
|
||||
if id == SentinalID {
|
||||
for _, v := range g.GameBoard.Sentinal {
|
||||
OracleEndstep(v, g)
|
||||
}
|
||||
} else {
|
||||
for _, v := range g.GameBoard.Scourge {
|
||||
OracleEndstep(v, g)
|
||||
}
|
||||
}
|
||||
if g.CurrentTurn == SentinalID {
|
||||
g.CurrentTurn = ScourgeID
|
||||
} else {
|
||||
g.CurrentTurn = SentinalID
|
||||
}
|
||||
}
|
||||
return NewView(id, g)
|
||||
}
|
||||
|
||||
func (g *Game) PlayerAct(id int, cmd string) *Deck {
|
||||
if id != g.CurrentTurn {
|
||||
return nil
|
||||
}
|
||||
var curr *Player
|
||||
var opp *Player
|
||||
var currD *Deck
|
||||
if id == g.SentinalPlayer.Id {
|
||||
curr = g.SentinalPlayer
|
||||
opp = g.ScourgePlayer
|
||||
currD = g.SentinalDeck
|
||||
} else {
|
||||
curr = g.ScourgePlayer
|
||||
opp = g.SentinalPlayer
|
||||
currD = g.ScourgeDeck
|
||||
}
|
||||
cmd_s := strings.Split(cmd, " ")
|
||||
if len(cmd_s) < 1 {
|
||||
return nil
|
||||
}
|
||||
switch cmd_s[0] {
|
||||
case "s":
|
||||
//scry: return scry options off top of deck
|
||||
if !g.CanDraw {
|
||||
return nil
|
||||
}
|
||||
if g.CardBuffer.Size() <= 0 {
|
||||
g.CardBuffer = DeckFromCards(currD.Scry(curr.Life))
|
||||
}
|
||||
return g.CardBuffer
|
||||
case "d":
|
||||
//draw: return player hand
|
||||
if !g.CanDraw {
|
||||
return nil
|
||||
}
|
||||
if len(cmd_s) != 2 || !g.CanDraw {
|
||||
return nil
|
||||
}
|
||||
if curr.Life == 0 {
|
||||
return DeckFromCards(curr.Hand)
|
||||
}
|
||||
x_i, err := strconv.Atoi(cmd_s[1])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if x_i > 2 || x_i < 0 {
|
||||
return nil
|
||||
}
|
||||
x := g.CardBuffer.Cards[x_i]
|
||||
if x.Owner != g.CurrentTurn {
|
||||
log.Println("drew a card from our deck that isn't our own")
|
||||
}
|
||||
g.CardBuffer.Cards = append(g.CardBuffer.Cards[:x_i], g.CardBuffer.Cards[x_i+1:]...)
|
||||
currD.Bottom(g.CardBuffer.Cards)
|
||||
curr.Hand = append(curr.Hand, x)
|
||||
g.CanDraw = false
|
||||
g.HasDrawn = true
|
||||
return DeckFromCards(curr.Hand)
|
||||
|
||||
case "m":
|
||||
//move: return player board or [] if invalid
|
||||
if len(cmd_s) != 3 {
|
||||
return nil
|
||||
}
|
||||
if !g.HasDrawn {
|
||||
return nil
|
||||
}
|
||||
x_i, err := strconv.Atoi(cmd_s[1])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
y_i, err := strconv.Atoi(cmd_s[2])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
if g.GameBoard.CanMove(g.CurrentTurn, x_i, y_i) {
|
||||
OracleMove(g.GameBoard.GetCard(g.CurrentTurn, x_i), x_i, y_i, g)
|
||||
g.GameBoard.Move(g.CurrentTurn, x_i, y_i)
|
||||
return DeckFromCards(g.GameBoard.GetRow(g.CurrentTurn))
|
||||
} else {
|
||||
return DeckFromCards([]*Card{})
|
||||
}
|
||||
case "a":
|
||||
//attack
|
||||
if len(cmd_s) != 3 {
|
||||
return nil
|
||||
}
|
||||
if !g.HasDrawn {
|
||||
return nil
|
||||
}
|
||||
x_i, err := strconv.Atoi(cmd_s[1])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
y_i, err := strconv.Atoi(cmd_s[2])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
if g.GameBoard.CanAttack(g.CurrentTurn, x_i, y_i) {
|
||||
OracleAttack(g.GameBoard.GetCard(g.CurrentTurn, x_i), g)
|
||||
res := g.GameBoard.Attack(g.CurrentTurn, x_i, y_i)
|
||||
var aid, did int
|
||||
if id == SentinalID {
|
||||
aid = SentinalID
|
||||
did = ScourgeID
|
||||
} else {
|
||||
aid = ScourgeID
|
||||
did = SentinalID
|
||||
}
|
||||
attacker := g.GameBoard.GetRow(aid)[x_i]
|
||||
defender := g.GameBoard.GetRow(did)[y_i]
|
||||
switch res {
|
||||
case 1:
|
||||
opp.Life = opp.Life - 1
|
||||
case 2:
|
||||
OracleLeaves(defender, g)
|
||||
g.GameBoard.Remove(defender)
|
||||
case 3:
|
||||
OracleLeaves(attacker, g)
|
||||
g.GameBoard.Remove(attacker)
|
||||
case 4:
|
||||
OracleLeaves(attacker, g)
|
||||
OracleLeaves(defender, g)
|
||||
g.GameBoard.Remove(attacker)
|
||||
g.GameBoard.Remove(defender)
|
||||
|
||||
}
|
||||
return DeckFromCards(g.GameBoard.GetRow(g.CurrentTurn))
|
||||
|
||||
} else {
|
||||
log.Println("can't attack")
|
||||
return DeckFromCards([]*Card{})
|
||||
}
|
||||
case "p":
|
||||
//play: return player boad or [] if invalid
|
||||
if len(cmd_s) != 3 {
|
||||
fmt.Println("not enough arguments")
|
||||
return nil
|
||||
}
|
||||
if !g.HasDrawn {
|
||||
return nil
|
||||
}
|
||||
x_i, err := strconv.Atoi(cmd_s[1])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
y_i, err := strconv.Atoi(cmd_s[2])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
if x_i < 0 || x_i > len(curr.Hand) {
|
||||
return nil
|
||||
}
|
||||
card := curr.Hand[x_i]
|
||||
shouldPlace := true
|
||||
if g.GameBoard.CanPlay(g.CurrentTurn, card, y_i) {
|
||||
shouldPlace = OracleCast(card, g)
|
||||
placed := g.GameBoard.Play(g.CurrentTurn, card, y_i, shouldPlace)
|
||||
if placed {
|
||||
OracleEnters(card, g)
|
||||
}
|
||||
curr.Hand = append(curr.Hand[:x_i], curr.Hand[x_i+1:]...)
|
||||
return DeckFromCards(g.GameBoard.GetRow(g.CurrentTurn))
|
||||
} else {
|
||||
fmt.Println("couldn't play")
|
||||
return DeckFromCards([]*Card{})
|
||||
}
|
||||
default:
|
||||
fmt.Println("Invalid act command")
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Debug(g *Game) {
|
||||
return
|
||||
}
|
36
game_view.go
Normal file
36
game_view.go
Normal file
@ -0,0 +1,36 @@
|
||||
package tome_game
|
||||
|
||||
import (
|
||||
. "git.saintnet.tech/tomecraft/tome_lib"
|
||||
)
|
||||
|
||||
func NewView(id int, g *Game) *GameView {
|
||||
if id == SentinalID {
|
||||
return &GameView{
|
||||
Board: g.GameBoard,
|
||||
Player: g.SentinalPlayer,
|
||||
DeckSize: g.SentinalDeck.Size(),
|
||||
EnemyLife: g.ScourgePlayer.Life,
|
||||
EnemyDeckSize: g.ScourgeDeck.Size(),
|
||||
EnemyHandSize: len(g.ScourgePlayer.Hand),
|
||||
CurrentTurn: g.CurrentTurn,
|
||||
CanDraw: g.CanDraw,
|
||||
HasDrawn: g.HasDrawn,
|
||||
Status: g.Status,
|
||||
}
|
||||
} else {
|
||||
return &GameView{
|
||||
Board: g.GameBoard,
|
||||
Player: g.ScourgePlayer,
|
||||
DeckSize: g.ScourgeDeck.Size(),
|
||||
EnemyLife: g.SentinalPlayer.Life,
|
||||
EnemyDeckSize: g.SentinalDeck.Size(),
|
||||
EnemyHandSize: len(g.SentinalPlayer.Hand),
|
||||
CurrentTurn: g.CurrentTurn,
|
||||
CanDraw: g.CanDraw,
|
||||
HasDrawn: g.HasDrawn,
|
||||
Status: g.Status,
|
||||
}
|
||||
|
||||
}
|
||||
}
|
10
go.mod
Normal file
10
go.mod
Normal file
@ -0,0 +1,10 @@
|
||||
module tome_game
|
||||
|
||||
go 1.16
|
||||
replace git.saintnet.tech/tomecraft/tome_lib => ../tome_lib
|
||||
|
||||
require (
|
||||
git.saintnet.tech/tomecraft/tome_lib v0.1.0 // indirect
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
)
|
||||
|
4
go.sum
Normal file
4
go.sum
Normal file
@ -0,0 +1,4 @@
|
||||
git.saintnet.tech/tomecraft/tome_lib v0.1.0 h1:c+AMtXgLKUFErrYFx7g8M2zVcrHUwLRY18v/+N8nn2I=
|
||||
git.saintnet.tech/tomecraft/tome_lib v0.1.0/go.mod h1:Jekqa9ojNDOrcO1aL0IWKuhCQSE5+MNHVcYtTWA6uko=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
158
oracle.go
Normal file
158
oracle.go
Normal file
@ -0,0 +1,158 @@
|
||||
package tome_game
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
. "git.saintnet.tech/tomecraft/tome_lib"
|
||||
)
|
||||
|
||||
func OracleUpkeep(c *Card, g *Game) {
|
||||
switch c.Type {
|
||||
case Eight:
|
||||
c.Sick = true
|
||||
if c.Counters >= 3 {
|
||||
g.GameBoard.Remove(c)
|
||||
}
|
||||
default:
|
||||
c.Sick = false
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func OracleSpell(c CardType, g *Game) bool {
|
||||
switch c {
|
||||
case Valk:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func OracleCast(c *Card, g *Game) bool {
|
||||
switch c.Type {
|
||||
case Valk:
|
||||
g.GameBoard = NewBoard()
|
||||
return false
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func OracleEnters(c *Card, g *Game) {
|
||||
c.Sick = true
|
||||
switch c.Type {
|
||||
case Ace:
|
||||
c.Sick = false
|
||||
return
|
||||
case Four:
|
||||
AddEffect(c, &Effect{c.Id, c.Id, 2})
|
||||
case Eight:
|
||||
c.Counters = 0
|
||||
}
|
||||
}
|
||||
|
||||
func OracleTick(c *Card, g *Game) {
|
||||
if c.Type == EmptyValue {
|
||||
return
|
||||
}
|
||||
row := g.GameBoard.GetRow(c.Owner)
|
||||
|
||||
switch c.Type {
|
||||
case Two:
|
||||
//+1 to all
|
||||
for _, v := range row {
|
||||
if v.Id != c.Id {
|
||||
AddEffect(v, &Effect{c.Id, v.Id, 1})
|
||||
}
|
||||
}
|
||||
case Three:
|
||||
//+1 around it
|
||||
if c.Position-1 >= 0 {
|
||||
AddEffect(row[c.Position-1], &Effect{c.Id, row[c.Position-1].Id, 1})
|
||||
}
|
||||
if c.Position+1 <= 3 {
|
||||
AddEffect(row[c.Position+1], &Effect{c.Id, row[c.Position+1].Id, 1})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func OracleLeaves(c *Card, g *Game) {
|
||||
if c.Empty() {
|
||||
return
|
||||
}
|
||||
row := g.GameBoard.GetRow(c.Owner)
|
||||
switch c.Type {
|
||||
case Two:
|
||||
//remove +1 to all
|
||||
for _, v := range row {
|
||||
RemoveEffect(c.Id, v)
|
||||
}
|
||||
case Three:
|
||||
//+1 around it
|
||||
if c.Position-1 >= 0 {
|
||||
RemoveEffect(c.Id, row[c.Position-1])
|
||||
}
|
||||
if c.Position+1 <= 3 {
|
||||
RemoveEffect(c.Id, row[c.Position+1])
|
||||
}
|
||||
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func OracleEndstep(c *Card, g *Game) {
|
||||
switch c.Type {
|
||||
case Eight:
|
||||
c.Counters = c.Counters + 1
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func OraclePower(c CardType, g *Game) int {
|
||||
return int(c)
|
||||
}
|
||||
|
||||
func OracleMove(c *Card, src, dest int, g *Game) {
|
||||
c.Sick = true
|
||||
switch c.Type {
|
||||
case Three:
|
||||
row := g.GameBoard.GetRow(c.Owner)
|
||||
if src-1 >= 0 {
|
||||
RemoveEffect(c.Id, row[src-1])
|
||||
}
|
||||
if src+1 <= 3 {
|
||||
RemoveEffect(c.Id, row[src-1])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func OracleAttack(c *Card, g *Game) {
|
||||
c.Sick = true
|
||||
}
|
||||
|
||||
func OracleEffect(c *Card, g *Game) {
|
||||
if c.Empty() {
|
||||
return
|
||||
}
|
||||
for _, e := range c.Effects {
|
||||
switch e.ID {
|
||||
case 0:
|
||||
log.Println("dummy effect applied. probably a bug")
|
||||
case 1:
|
||||
c.Power = c.Power + 1
|
||||
case 2:
|
||||
if c.Owner == SentinalID {
|
||||
g.CardBuffer = DeckFromCards(g.SentinalDeck.Scry(1))
|
||||
} else if c.Owner == ScourgeID {
|
||||
g.CardBuffer = DeckFromCards(g.SentinalDeck.Scry(1))
|
||||
} else {
|
||||
log.Println("card draw effect was played but with no owner?")
|
||||
}
|
||||
g.CanDraw = true
|
||||
g.HasDrawn = false
|
||||
RemoveEffect(e.Owner, c)
|
||||
default:
|
||||
log.Println("wrong effect type")
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user