88 lines
2.8 KiB
Haskell
88 lines
2.8 KiB
Haskell
module CardRenderer
|
|
( cardHeight
|
|
, cardWidth
|
|
|
|
, renderCard
|
|
, renderStack
|
|
, renderStacks
|
|
) where
|
|
|
|
import CardDeck
|
|
import PNGRenderer
|
|
|
|
----------------------------- Constants ------------------------------
|
|
|
|
-- The asset directory
|
|
assetDir :: [Char]
|
|
assetDir = "./lib/assets/"
|
|
|
|
cardWidth :: Float
|
|
cardWidth = 100
|
|
|
|
cardHeight :: Float
|
|
cardHeight = 134
|
|
|
|
-- Map of all (rendered) cards
|
|
cardRenders :: [Picture]
|
|
cardRenders = back:placeHolder:deck
|
|
where deck = map (renderCard' . showCard) generateDeck
|
|
back = renderPNG $ assetDir ++ "back.png"
|
|
placeHolder = renderPNG $ assetDir ++ "placeholder.png"
|
|
|
|
amountOfValues :: Int
|
|
amountOfValues = length $ init $ enumFrom Ace
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
-- Render a card using renderPNG.
|
|
renderCard' :: Card -> Picture
|
|
renderCard' (_,_,Hidden) = renderPNG $ assetDir ++ "back.png"
|
|
renderCard' (ctype,cvalue,_) = renderPNG $ file_dir ++ file_name
|
|
where typestring = cardTypeToString ctype
|
|
valuestring = cardTypeToChar cvalue
|
|
file_dir = assetDir ++ typestring ++ "s/"
|
|
file_name = typestring ++ "-" ++ valuestring ++ ".png"
|
|
|
|
-- Render a card using the cached cards.
|
|
renderCard :: Card -> Picture
|
|
renderCard (_, _, Hidden) = head cardRenders
|
|
renderCard (cType, cValue, _) = cardRenders !! index
|
|
where index = 2 + t * amountOfValues + v
|
|
t = fromEnum cType
|
|
v = fromEnum cValue
|
|
|
|
-- Spread cards out, by moving each card a distance x over the x-axis
|
|
-- and y over the y-axis.
|
|
spread :: Float -> Float -> [Picture] -> [Picture]
|
|
spread x y = zipWith shift [0 .. ]
|
|
where shift index = translate (x * index) (y * index)
|
|
|
|
-- Render all cards of a stack with a card inset of given value.
|
|
renderStack :: Float -> Stack -> Picture
|
|
renderStack _ [] = cardRenders !! 1
|
|
renderStack cardDist stack = compose spreadOutStack
|
|
where renderedStack = map renderCard $ reverse stack
|
|
spreadOutStack = spread 0 cardDist renderedStack
|
|
|
|
-- Render all cards of multiple stacks, with a given distance between
|
|
-- all stacks and a different distance between cards.
|
|
renderStacks :: Float -> Float -> [Stack] -> Picture
|
|
renderStacks stackDist cardDist = compose . spreadOutStacks
|
|
where renderedStacks = map (renderStack cardDist)
|
|
spreadOutStacks = spread (stackDist + cardWidth) 0 . renderedStacks
|
|
|
|
-- Convert a CardType to a string.
|
|
cardTypeToString :: CardType -> [Char]
|
|
cardTypeToString Clubs = "club"
|
|
cardTypeToString Diamonds = "diamond"
|
|
cardTypeToString Hearts = "heart"
|
|
cardTypeToString Spades = "spade"
|
|
cardTypeToString _ = ""
|
|
|
|
-- Convert a CardType to a character.
|
|
cardTypeToChar :: CardValue -> [Char]
|
|
cardTypeToChar Ace = "A"
|
|
cardTypeToChar Jack = "J"
|
|
cardTypeToChar Queen = "Q"
|
|
cardTypeToChar King = "K"
|
|
cardTypeToChar a = show $ 1 + fromEnum a
|