1
Fork 0

fsharp(ygosim): feat: added the basic drawing and next-turn stuff

Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
Matei Adriel 2019-12-07 19:31:53 +02:00 committed by prescientmoon
parent 4460715e0f
commit eab212c039
Signed by: prescientmoon
SSH key fingerprint: SHA256:UUF9JT2s8Xfyv76b8ZuVL7XrmimH4o49p4b+iexbVH4
3 changed files with 103 additions and 13 deletions

View file

@ -4,11 +4,11 @@ module Side =
open Card open Card
type Side = type Side =
{ field: Card option { field: CardInstance option
monsters: Card list monsters: CardInstance list
spells: Card list spells: CardInstance list
graveyard: Card list graveyard: CardInstance list
deck: Card list } deck: CardInstance list }
let emptySide = let emptySide =
{ field = None { field = None
@ -20,23 +20,95 @@ module Side =
module Player = module Player =
open Side open Side
open Card
type Player = type Player =
{ lifePoints: int { lifePoints: int
side: Side } side: Side
hand: CardInstance list }
let inflictDamage (player: Player) amount = { player with lifePoints = player.lifePoints - amount } let inflictDamage (player: Player) amount = { player with lifePoints = player.lifePoints - amount }
let initialPlayer lp = let initialPlayer lp =
{ lifePoints = lp { lifePoints = lp
side = emptySide } side = emptySide
hand = [] }
module Turn =
type Phase =
| Draw
| Standby
| Main1
| Battle
| Main2
| End
let nextPhase (previous: Phase) (turn: int) =
match previous with
| Draw -> (Standby, turn)
| Standby -> (Main1, turn)
| Main1 -> (Battle, turn)
| Battle -> (Main2, turn)
| Main2 -> (End, turn)
| End -> (Draw, turn + 1)
module Board = module Board =
open Player open Player
open Turn
type Board = type Board =
{ players: Player * Player } { players: Player * Player
turn: int
phase: Phase }
let emptyBoard = { players = (initialPlayer 8000, initialPlayer 8000) } let emptyBoard =
{ players = (initialPlayer 8000, initialPlayer 8000)
turn = 0
phase = Draw }
module Game =
open Board
open Turn
open Player
open Card
let draw (player: Player) =
match player.side.deck with
| [] -> player // TODO: makes this end the game
| card :: deck ->
{ player with
hand = card :: player.hand
side = { player.side with deck = deck } }
// Player is the last arg to be able to use this with the withCurrentPlayer function
let toDeckBottom (card: CardInstance) (player: Player) =
{ player with side = { player.side with deck = card :: player.side.deck } }
let currentPlayer (board: Board) =
let (first, second) = board.players
if board.turn % 2 = 0 then first
else second
let withCurrentPlayer callback board =
let (first, second) = board.players
let players =
if board.turn % 2 = 0 then (callback first, second)
else (first, callback second)
{ board with players = players }
let processTurn (board: Board) =
match board.phase with
| Draw -> withCurrentPlayer draw board
| _ -> board
let doTurn (board: Board) =
let newBoard = processTurn board
let (phase, turn) = nextPhase newBoard.phase newBoard.turn
{ newBoard with
turn = turn
phase = phase }

View file

@ -55,10 +55,10 @@ type Race =
| Zombie | Zombie
type SpellCardDetails = type SpellCardDetails =
{ _type: SpellCardType } { spellType: SpellCardType }
type TrapCardDetails = type TrapCardDetails =
{ _type: TrapCardType } { trapType: TrapCardType }
type MonsterCardDetails = type MonsterCardDetails =
@ -72,3 +72,6 @@ type Card =
| Monster of BaseCard * MonsterCardDetails | Monster of BaseCard * MonsterCardDetails
| Spell of BaseCard * SpellCardDetails | Spell of BaseCard * SpellCardDetails
| Trap of BaseCard * TrapCardDetails | Trap of BaseCard * TrapCardDetails
// TODO: actually make this do what its supposed to
type CardInstance = Card

View file

@ -1,5 +1,20 @@
module Main = module Main =
open Board
open Card
open Game
[<EntryPoint>] [<EntryPoint>]
let main argv = let main argv =
printfn "Hello World from F#!" let board = Board.emptyBoard
0 // return an integer exit code let sampleCard = Spell ({name= "sampleCard"; text="something"}, {spellType = Card.ContinuosSpell})
let (first, second) = board.players
let secondBoard = withCurrentPlayer <| Game.toDeckBottom sampleCard <| board
printfn "%A" secondBoard
let thirdBoard = doTurn secondBoard
printfn "%A" thirdBoard
0