1
Fork 0

fsharp(ygosim): refactor: refactored some of the tribute summoning code

Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
Matei Adriel 2019-12-18 21:31:55 +02:00 committed by prescientmoon
parent ab4bd21306
commit 377dd0430a
Signed by: prescientmoon
SSH key fingerprint: SHA256:UUF9JT2s8Xfyv76b8ZuVL7XrmimH4o49p4b+iexbVH4

View file

@ -277,17 +277,16 @@ module Summon =
let (_monster, _id) = target
// Find what monsters to tribute
let tributteCount = numberOfTributes _monster
let possibleTributes = board ^. Board.currentPlayerMonsters |>> ((=<<) monster) |> choose id
let tributes = chooseTributes client possibleTributes tributteCount []
let tributes = chooseTributes client possibleTributes <| numberOfTributes _monster <| []
// helpers to remove the tributes from the board
let replaceInstance instance =
let isInstance = List.tryFind (view _2 >> (=) instance.id) tributes |> Option.isSome
if isInstance then None
else Some instance
let replaceInstance instance = List.tryFind (view _2 >> (=) instance.id) tributes |>> toCardInstance
let replaceTributes = map <| Option.bind replaceInstance
let replaceTributes =
replaceInstance
|> Option.bind
|> map
// Tribute monsters
let boardWithoutTributes =
@ -295,10 +294,12 @@ module Summon =
|> over Board.currentPlayerMonsters replaceTributes
|> over Board.currentPlayer (tributes |>> toCardInstance |> toGraveyard)
let free = freeMonsterZones <| boardWithoutTributes ^. Board.currentPlayer
// Choose a zone to summon the monster
let zone = chooseZone client free
let zone =
boardWithoutTributes ^. Board.currentPlayer
|> freeMonsterZones
|> chooseZone client
let turn = boardWithoutTributes ^. Board.turn
// Instance to actually summon
@ -311,7 +312,9 @@ module Summon =
let removeTarget = List.filter (fun card -> card.id <> _id)
// Notify the client a new monster was summoned
client <| MonsterSummoned(target ^. _1, zone) |> ignore
MonsterSummoned(target ^. _1, zone)
|> client
|> ignore
// Update the board
boardWithoutTributes
@ -328,9 +331,6 @@ module Game =
let isCurrentPlayer (board: Board) (player: Player) = (board ^. Board.currentPlayerId) = player.id
let canDrawCard (board: Board) (player: Player) =
isCurrentPlayer board player && board ^. Board.phase = Draw && board ^. Board.turn <> 0
let draw (board: Board) =
match board ^. Board.currentPlayerDeck with
| [] -> board |> Board.currentPlayerState .-> Lost "deckout"
@ -347,9 +347,7 @@ module Game =
let processPhase client board =
match board ^. Board.phase with
| Draw ->
if canDrawCard board <| board ^. Board.currentPlayer then draw board
else board
| Draw -> draw board
| Main1 -> handleMainPhase client board
| Main2 -> handleMainPhase client board
| _ -> board