Implemented toggling functionality for Level Acceleration Mode
This commit is contained in:
parent
b0c7f6c557
commit
f074add7a3
7 changed files with 222 additions and 75 deletions
12
app/Main.hs
12
app/Main.hs
|
@ -9,7 +9,7 @@ import qualified System.Directory as D
|
||||||
import System.FilePath ((</>))
|
import System.FilePath ((</>))
|
||||||
|
|
||||||
import Tetris (Game(..))
|
import Tetris (Game(..))
|
||||||
import UI.PickLevel (pickLevel)
|
import UI.PickLevel (pickLevel, LevelConfig(..))
|
||||||
import UI.Game (playGame)
|
import UI.Game (playGame)
|
||||||
|
|
||||||
data Opts = Opts
|
data Opts = Opts
|
||||||
|
@ -70,11 +70,11 @@ hdOptStr (CustomChars s) = Just s
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
(Opts hd ml hs) <- execParser fullopts -- get CLI opts/args
|
(Opts hd ml hs) <- execParser fullopts
|
||||||
when hs (getHighScore >>= printM >> exitSuccess) -- show high score and exit
|
when hs (getHighScore >>= printM >> exitSuccess)
|
||||||
l <- maybe pickLevel return ml -- pick level prompt if necessary
|
levelConfig <- maybe pickLevel (\l -> return $ LevelConfig l False) ml
|
||||||
g <- playGame l (hdOptStr hd) -- play game
|
g <- playGame (levelNumber levelConfig) (hdOptStr hd) (progression levelConfig)
|
||||||
handleEndGame (_score g) -- save & print score
|
handleEndGame (_score g)
|
||||||
|
|
||||||
handleEndGame :: Int -> IO ()
|
handleEndGame :: Int -> IO ()
|
||||||
handleEndGame s = do
|
handleEndGame s = do
|
||||||
|
|
|
@ -25,7 +25,7 @@ module Tetris
|
||||||
, Tetrimino(..)
|
, Tetrimino(..)
|
||||||
, Tetris
|
, Tetris
|
||||||
-- Lenses
|
-- Lenses
|
||||||
, block, board, level, nextShape, score, shape, linesCleared
|
, block, board, level, nextShape, score, shape, linesCleared, progression
|
||||||
-- Constants
|
-- Constants
|
||||||
, boardHeight, boardWidth, relCells
|
, boardHeight, boardWidth, relCells
|
||||||
) where
|
) where
|
||||||
|
@ -82,6 +82,7 @@ data Game = Game
|
||||||
, _linesCleared :: Int
|
, _linesCleared :: Int
|
||||||
, _score :: Int
|
, _score :: Int
|
||||||
, _board :: Board
|
, _board :: Board
|
||||||
|
, _progression :: Bool
|
||||||
} deriving (Eq)
|
} deriving (Eq)
|
||||||
makeLenses ''Game
|
makeLenses ''Game
|
||||||
|
|
||||||
|
@ -161,8 +162,8 @@ bagFourTetriminoEach Empty =
|
||||||
bagFourTetriminoEach <=< shuffle . Seq.fromList . take 28 $ cycle [I ..]
|
bagFourTetriminoEach <=< shuffle . Seq.fromList . take 28 $ cycle [I ..]
|
||||||
|
|
||||||
-- | Initialize a game with a given level
|
-- | Initialize a game with a given level
|
||||||
initGame :: Int -> IO Game
|
initGame :: Int -> Bool -> IO Game -- Updated signature
|
||||||
initGame lvl = do
|
initGame lvl prog = do
|
||||||
(s1, bag1) <- bagFourTetriminoEach mempty
|
(s1, bag1) <- bagFourTetriminoEach mempty
|
||||||
(s2, bag2) <- bagFourTetriminoEach bag1
|
(s2, bag2) <- bagFourTetriminoEach bag1
|
||||||
pure $ Game
|
pure $ Game
|
||||||
|
@ -173,6 +174,7 @@ initGame lvl = do
|
||||||
, _score = 0
|
, _score = 0
|
||||||
, _linesCleared = 0
|
, _linesCleared = 0
|
||||||
, _board = mempty
|
, _board = mempty
|
||||||
|
, _progression = prog -- Added prog parameter
|
||||||
}
|
}
|
||||||
|
|
||||||
-- | Increment level
|
-- | Increment level
|
||||||
|
@ -191,9 +193,12 @@ timeStep = do
|
||||||
True -> do
|
True -> do
|
||||||
freezeBlock
|
freezeBlock
|
||||||
clearFullRows >>= updateScore
|
clearFullRows >>= updateScore
|
||||||
levelFinished >>= \case
|
prog <- use progression
|
||||||
True -> nextLevel
|
when prog $ do
|
||||||
False -> nextBlock
|
levelFinished >>= \case
|
||||||
|
True -> nextLevel
|
||||||
|
False -> pure ()
|
||||||
|
nextBlock
|
||||||
|
|
||||||
-- | Gravitate current block, i.e. shift down
|
-- | Gravitate current block, i.e. shift down
|
||||||
gravitate :: MonadState Game m => m ()
|
gravitate :: MonadState Game m => m ()
|
||||||
|
@ -235,9 +240,13 @@ updateScore lines = do
|
||||||
-- | Using the fixed-goal system described here: https://tetris.wiki/Marathon
|
-- | Using the fixed-goal system described here: https://tetris.wiki/Marathon
|
||||||
levelFinished :: (MonadState Game m, MonadIO m) => m Bool
|
levelFinished :: (MonadState Game m, MonadIO m) => m Bool
|
||||||
levelFinished = do
|
levelFinished = do
|
||||||
lvl <- use level
|
prog <- use progression
|
||||||
lc <- use linesCleared
|
if not prog
|
||||||
pure $ lvl < 15 && lc >= 10 * (lvl + 1)
|
then pure False
|
||||||
|
else do
|
||||||
|
lvl <- use level
|
||||||
|
lc <- use linesCleared
|
||||||
|
pure $ lvl < 15 && lc >= 10 * (lvl + 1)
|
||||||
|
|
||||||
-- | Handle counterclockwise block rotation (if possible)
|
-- | Handle counterclockwise block rotation (if possible)
|
||||||
-- Allows wallkicks: http://tetris.wikia.com/wiki/TGM_rotation
|
-- Allows wallkicks: http://tetris.wikia.com/wiki/TGM_rotation
|
||||||
|
|
|
@ -30,12 +30,12 @@ import Linear.V2 (V2(..))
|
||||||
import Tetris
|
import Tetris
|
||||||
|
|
||||||
data UI = UI
|
data UI = UI
|
||||||
{ _game :: Game -- ^ tetris game
|
{ _game :: Game
|
||||||
, _initLevel :: Int -- ^ initial level chosen
|
, _initLevel :: Int
|
||||||
, _currLevel :: TVar Int -- ^ current level
|
, _currLevel :: TVar Int
|
||||||
, _preview :: Maybe String -- ^ hard drop preview cell
|
, _preview :: Maybe String
|
||||||
, _locked :: Bool -- ^ lock after hard drop before time step
|
, _locked :: Bool
|
||||||
, _paused :: Bool -- ^ game paused
|
, _paused :: Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
makeLenses ''UI
|
makeLenses ''UI
|
||||||
|
@ -61,28 +61,24 @@ app = App
|
||||||
, appAttrMap = const theMap
|
, appAttrMap = const theMap
|
||||||
}
|
}
|
||||||
|
|
||||||
playGame
|
playGame :: Int -> Maybe String -> Bool -> IO Game
|
||||||
:: Int -- ^ Starting level
|
playGame lvl mp prog = do
|
||||||
-> Maybe String -- ^ Preview cell (Nothing == no preview)
|
|
||||||
-> IO Game
|
|
||||||
playGame lvl mp = do
|
|
||||||
chan <- newBChan 10
|
chan <- newBChan 10
|
||||||
-- share the current level with the thread so it can adjust speed
|
|
||||||
tv <- newTVarIO lvl
|
tv <- newTVarIO lvl
|
||||||
void . forkIO $ forever $ do
|
void . forkIO $ forever $ do
|
||||||
writeBChan chan Tick
|
writeBChan chan Tick
|
||||||
lvl <- readTVarIO tv
|
lvl <- readTVarIO tv
|
||||||
threadDelay $ levelToDelay lvl
|
threadDelay $ levelToDelay lvl
|
||||||
initialGame <- initGame lvl
|
initialGame <- initGame lvl prog -- Pass the progression parameter
|
||||||
let buildVty = Graphics.Vty.CrossPlatform.mkVty Graphics.Vty.Config.defaultConfig
|
let buildVty = Graphics.Vty.CrossPlatform.mkVty Graphics.Vty.Config.defaultConfig
|
||||||
initialVty <- buildVty
|
initialVty <- buildVty
|
||||||
ui <- customMain initialVty buildVty (Just chan) app $ UI
|
ui <- customMain initialVty buildVty (Just chan) app $ UI
|
||||||
{ _game = initialGame
|
{ _game = initialGame
|
||||||
, _initLevel = lvl
|
, _initLevel = lvl
|
||||||
, _currLevel = tv
|
, _currLevel = tv
|
||||||
, _preview = mp
|
, _preview = mp
|
||||||
, _locked = False
|
, _locked = False
|
||||||
, _paused = False
|
, _paused = False
|
||||||
}
|
}
|
||||||
return $ ui ^. game
|
return $ ui ^. game
|
||||||
|
|
||||||
|
@ -129,8 +125,9 @@ exec = unlessM (orM [use paused, use locked, use (game . to isGameOver)]) . zoom
|
||||||
-- | Restart game at the initially chosen level
|
-- | Restart game at the initially chosen level
|
||||||
restart :: EventM Name UI ()
|
restart :: EventM Name UI ()
|
||||||
restart = do
|
restart = do
|
||||||
lvl <- use $ initLevel
|
lvl <- use initLevel
|
||||||
g <- liftIO $ initGame lvl
|
prog <- use (game . progression) -- Get current progression setting
|
||||||
|
g <- liftIO $ initGame lvl prog -- Use it when restarting
|
||||||
assign game g
|
assign game g
|
||||||
assign locked False
|
assign locked False
|
||||||
|
|
||||||
|
@ -214,9 +211,18 @@ drawStats g =
|
||||||
[ drawStat "Score" $ g ^. score
|
[ drawStat "Score" $ g ^. score
|
||||||
, padTop (Pad 1) $ drawStat "Lines" $ g ^. linesCleared
|
, padTop (Pad 1) $ drawStat "Lines" $ g ^. linesCleared
|
||||||
, padTop (Pad 1) $ drawStat "Level" $ g ^. level
|
, padTop (Pad 1) $ drawStat "Level" $ g ^. level
|
||||||
|
, padTop (Pad 1) $ drawProgression (g ^. progression)
|
||||||
, drawLeaderBoard g
|
, drawLeaderBoard g
|
||||||
]
|
]
|
||||||
|
|
||||||
|
drawProgression :: Bool -> Widget Name
|
||||||
|
drawProgression True =
|
||||||
|
padLeftRight 1 $ str "Level Mode: " <+>
|
||||||
|
withAttr progressionAttr (str "ON")
|
||||||
|
drawProgression False =
|
||||||
|
padLeftRight 1 $ str "Level Mode: " <+>
|
||||||
|
withAttr fixedAttr (str "OFF")
|
||||||
|
|
||||||
drawStat :: String -> Int -> Widget Name
|
drawStat :: String -> Int -> Widget Name
|
||||||
drawStat s n = padLeftRight 1 $ str s <+> padLeft Max (str $ show n)
|
drawStat s n = padLeftRight 1 $ str s <+> padLeft Max (str $ show n)
|
||||||
|
|
||||||
|
@ -278,21 +284,23 @@ drawGameOver g =
|
||||||
theMap :: AttrMap
|
theMap :: AttrMap
|
||||||
theMap = attrMap
|
theMap = attrMap
|
||||||
V.defAttr
|
V.defAttr
|
||||||
[ (iAttr , tToColor I `on` tToColor I)
|
[ (iAttr , tToColor I `on` tToColor I)
|
||||||
, (oAttr , tToColor O `on` tToColor O)
|
, (oAttr , tToColor O `on` tToColor O)
|
||||||
, (tAttr , tToColor T `on` tToColor T)
|
, (tAttr , tToColor T `on` tToColor T)
|
||||||
, (sAttr , tToColor S `on` tToColor S)
|
, (sAttr , tToColor S `on` tToColor S)
|
||||||
, (zAttr , tToColor Z `on` tToColor Z)
|
, (zAttr , tToColor Z `on` tToColor Z)
|
||||||
, (jAttr , tToColor J `on` tToColor J)
|
, (jAttr , tToColor J `on` tToColor J)
|
||||||
, (lAttr , tToColor L `on` tToColor L)
|
, (lAttr , tToColor L `on` tToColor L)
|
||||||
, (ihAttr , fg $ tToColor I)
|
, (ihAttr , fg $ tToColor I)
|
||||||
, (ohAttr , fg $ tToColor O)
|
, (ohAttr , fg $ tToColor O)
|
||||||
, (thAttr , fg $ tToColor T)
|
, (thAttr , fg $ tToColor T)
|
||||||
, (shAttr , fg $ tToColor S)
|
, (shAttr , fg $ tToColor S)
|
||||||
, (zhAttr , fg $ tToColor Z)
|
, (zhAttr , fg $ tToColor Z)
|
||||||
, (jhAttr , fg $ tToColor J)
|
, (jhAttr , fg $ tToColor J)
|
||||||
, (lhAttr , fg $ tToColor L)
|
, (lhAttr , fg $ tToColor L)
|
||||||
, (gameOverAttr, fg V.red `V.withStyle` V.bold)
|
, (gameOverAttr , fg V.red `V.withStyle` V.bold)
|
||||||
|
, (progressionAttr, fg V.green `V.withStyle` V.bold)
|
||||||
|
, (fixedAttr , fg V.blue `V.withStyle` V.bold)
|
||||||
]
|
]
|
||||||
|
|
||||||
tToColor :: Tetrimino -> V.Color
|
tToColor :: Tetrimino -> V.Color
|
||||||
|
@ -327,3 +335,7 @@ emptyAttr = attrName "empty"
|
||||||
|
|
||||||
gameOverAttr :: AttrName
|
gameOverAttr :: AttrName
|
||||||
gameOverAttr = attrName "gameOver"
|
gameOverAttr = attrName "gameOver"
|
||||||
|
|
||||||
|
progressionAttr, fixedAttr :: AttrName
|
||||||
|
progressionAttr = attrName "progression"
|
||||||
|
fixedAttr = attrName "fixed"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
module UI.PickLevel
|
module UI.PickLevel
|
||||||
( pickLevel
|
( pickLevel
|
||||||
|
, LevelConfig(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import System.Exit (exitSuccess)
|
import System.Exit (exitSuccess)
|
||||||
|
@ -11,17 +12,39 @@ import qualified Brick.Widgets.Border.Style as BS
|
||||||
import qualified Brick.Widgets.Center as C
|
import qualified Brick.Widgets.Center as C
|
||||||
import qualified Graphics.Vty as V
|
import qualified Graphics.Vty as V
|
||||||
|
|
||||||
app :: App (Maybe Int) e ()
|
data LevelConfig = LevelConfig
|
||||||
|
{ levelNumber :: Int
|
||||||
|
, progression :: Bool
|
||||||
|
} deriving (Show, Eq)
|
||||||
|
|
||||||
|
data MenuOption = YesOption | NoOption deriving (Eq)
|
||||||
|
|
||||||
|
data PickState = PickState
|
||||||
|
{ currentLevel :: Maybe Int
|
||||||
|
, showProgression :: Bool
|
||||||
|
, pickingLevel :: Bool
|
||||||
|
, selectedOption :: MenuOption
|
||||||
|
}
|
||||||
|
|
||||||
|
app :: App PickState e ()
|
||||||
app = App
|
app = App
|
||||||
{ appDraw = const [ui]
|
{ appDraw = drawUI
|
||||||
, appHandleEvent = handleEvent
|
, appHandleEvent = handleEvent
|
||||||
, appStartEvent = pure ()
|
, appStartEvent = pure ()
|
||||||
, appAttrMap = const $ attrMap V.defAttr []
|
, appAttrMap = const $ attrMap V.defAttr
|
||||||
|
[ (selectedAttr, V.black `on` V.white)
|
||||||
|
]
|
||||||
, appChooseCursor = neverShowCursor
|
, appChooseCursor = neverShowCursor
|
||||||
}
|
}
|
||||||
|
|
||||||
ui :: Widget ()
|
selectedAttr :: AttrName
|
||||||
ui =
|
selectedAttr = attrName "selected"
|
||||||
|
|
||||||
|
drawUI :: PickState -> [Widget ()]
|
||||||
|
drawUI ps = [ui ps]
|
||||||
|
|
||||||
|
ui :: PickState -> Widget ()
|
||||||
|
ui ps =
|
||||||
padLeft (Pad 19)
|
padLeft (Pad 19)
|
||||||
$ padRight (Pad 21)
|
$ padRight (Pad 21)
|
||||||
$ C.center
|
$ C.center
|
||||||
|
@ -30,17 +53,62 @@ ui =
|
||||||
$ withBorderStyle BS.unicodeBold
|
$ withBorderStyle BS.unicodeBold
|
||||||
$ B.borderWithLabel (str "Tetris")
|
$ B.borderWithLabel (str "Tetris")
|
||||||
$ C.center
|
$ C.center
|
||||||
$ str " Choose Level (0-9)"
|
$ vBox
|
||||||
|
[ if pickingLevel ps
|
||||||
|
then str "Choose Level (0-9)"
|
||||||
|
else vBox
|
||||||
|
[ str "Level Progression?"
|
||||||
|
, str ""
|
||||||
|
, drawOption "YES" YesOption (selectedOption ps)
|
||||||
|
, drawOption "NO" NoOption (selectedOption ps)
|
||||||
|
, str ""
|
||||||
|
, str "Use ↑↓ to select"
|
||||||
|
, str "Press Enter to continue"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
handleEvent :: BrickEvent () e -> EventM () (Maybe Int) ()
|
drawOption :: String -> MenuOption -> MenuOption -> Widget ()
|
||||||
|
drawOption label opt current =
|
||||||
|
withAttr (if opt == current then selectedAttr else attrName "")
|
||||||
|
$ str $ " " ++ label ++ " "
|
||||||
|
|
||||||
|
handleEvent :: BrickEvent () e -> EventM () PickState ()
|
||||||
handleEvent (VtyEvent (V.EvKey V.KEsc _)) = halt
|
handleEvent (VtyEvent (V.EvKey V.KEsc _)) = halt
|
||||||
handleEvent (VtyEvent (V.EvKey (V.KChar 'q') _)) = halt
|
handleEvent (VtyEvent (V.EvKey (V.KChar 'q') _)) = halt
|
||||||
handleEvent (VtyEvent (V.EvKey (V.KChar 'Q') _)) = halt
|
handleEvent (VtyEvent (V.EvKey (V.KChar 'Q') _)) = halt
|
||||||
handleEvent (VtyEvent (V.EvKey (V.KChar d) [])) =
|
handleEvent (VtyEvent (V.EvKey (V.KChar d) [])) =
|
||||||
when (d `elem` ['0' .. '9']) $ do
|
whenPickingLevel $ when (d `elem` ['0' .. '9']) $ do
|
||||||
put $ Just $ read [d]
|
modify $ \s -> s { currentLevel = Just $ read [d], pickingLevel = False }
|
||||||
halt
|
handleEvent (VtyEvent (V.EvKey V.KEnter [])) = do
|
||||||
|
s <- get
|
||||||
|
when (not $ pickingLevel s) $ do
|
||||||
|
case currentLevel s of
|
||||||
|
Just l -> do
|
||||||
|
put $ PickState (Just l) (selectedOption s == YesOption) True YesOption
|
||||||
|
halt
|
||||||
|
Nothing -> pure ()
|
||||||
|
handleEvent (VtyEvent (V.EvKey V.KUp [])) =
|
||||||
|
whenNotPickingLevel $ modify $ \s -> s { selectedOption = YesOption }
|
||||||
|
handleEvent (VtyEvent (V.EvKey V.KDown [])) =
|
||||||
|
whenNotPickingLevel $ modify $ \s -> s { selectedOption = NoOption }
|
||||||
handleEvent _ = pure ()
|
handleEvent _ = pure ()
|
||||||
|
|
||||||
pickLevel :: IO Int
|
whenPickingLevel :: EventM () PickState () -> EventM () PickState ()
|
||||||
pickLevel = defaultMain app Nothing >>= maybe exitSuccess return
|
whenPickingLevel action = do
|
||||||
|
picking <- gets pickingLevel
|
||||||
|
when picking action
|
||||||
|
|
||||||
|
whenNotPickingLevel :: EventM () PickState () -> EventM () PickState ()
|
||||||
|
whenNotPickingLevel action = do
|
||||||
|
picking <- gets pickingLevel
|
||||||
|
when (not picking) action
|
||||||
|
|
||||||
|
initialState :: PickState
|
||||||
|
initialState = PickState Nothing True True YesOption
|
||||||
|
|
||||||
|
pickLevel :: IO LevelConfig
|
||||||
|
pickLevel = do
|
||||||
|
result <- defaultMain app initialState
|
||||||
|
case currentLevel result of
|
||||||
|
Nothing -> exitSuccess
|
||||||
|
Just l -> return $ LevelConfig l (showProgression result)
|
||||||
|
|
75
stack.yaml
75
stack.yaml
|
@ -1,10 +1,67 @@
|
||||||
flags: {}
|
# This file was automatically generated by 'stack init'
|
||||||
extra-package-dbs: []
|
#
|
||||||
|
# Some commonly used options have been documented as comments in this file.
|
||||||
|
# For advanced use and comprehensive documentation of the format, please see:
|
||||||
|
# https://docs.haskellstack.org/en/stable/yaml_configuration/
|
||||||
|
|
||||||
|
# A 'specific' Stackage snapshot or a compiler version.
|
||||||
|
# A snapshot resolver dictates the compiler version and the set of packages
|
||||||
|
# to be used for project dependencies. For example:
|
||||||
|
#
|
||||||
|
# snapshot: lts-22.28
|
||||||
|
# snapshot: nightly-2024-07-05
|
||||||
|
# snapshot: ghc-9.6.6
|
||||||
|
#
|
||||||
|
# The location of a snapshot can be provided as a file or url. Stack assumes
|
||||||
|
# a snapshot provided as a file might change, whereas a url resource does not.
|
||||||
|
#
|
||||||
|
# snapshot: ./custom-snapshot.yaml
|
||||||
|
# snapshot: https://example.com/snapshots/2024-01-01.yaml
|
||||||
|
snapshot:
|
||||||
|
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/43.yaml
|
||||||
|
|
||||||
|
# User packages to be built.
|
||||||
|
# Various formats can be used as shown in the example below.
|
||||||
|
#
|
||||||
|
# packages:
|
||||||
|
# - some-directory
|
||||||
|
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
|
||||||
|
# subdirs:
|
||||||
|
# - auto-update
|
||||||
|
# - wai
|
||||||
packages:
|
packages:
|
||||||
- '.'
|
- .
|
||||||
extra-deps: []
|
# Dependency packages to be pulled from upstream that are not in the snapshot.
|
||||||
resolver: lts-22.19
|
# These entries can reference officially published versions as well as
|
||||||
nix:
|
# forks / in-progress versions pinned to a git hash. For example:
|
||||||
packages:
|
#
|
||||||
- gcc
|
# extra-deps:
|
||||||
- ncurses
|
# - acme-missiles-0.3
|
||||||
|
# - git: https://github.com/commercialhaskell/stack.git
|
||||||
|
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||||
|
#
|
||||||
|
# extra-deps: []
|
||||||
|
|
||||||
|
# Override default flag values for project packages and extra-deps
|
||||||
|
# flags: {}
|
||||||
|
|
||||||
|
# Extra package databases containing global packages
|
||||||
|
# extra-package-dbs: []
|
||||||
|
|
||||||
|
# Control whether we use the GHC we find on the path
|
||||||
|
# system-ghc: true
|
||||||
|
#
|
||||||
|
# Require a specific version of Stack, using version ranges
|
||||||
|
# require-stack-version: -any # Default
|
||||||
|
# require-stack-version: ">=3.1"
|
||||||
|
#
|
||||||
|
# Override the architecture used by Stack, especially useful on Windows
|
||||||
|
# arch: i386
|
||||||
|
# arch: x86_64
|
||||||
|
#
|
||||||
|
# Extra directories used by Stack for building
|
||||||
|
# extra-include-dirs: [/path/to/dir]
|
||||||
|
# extra-lib-dirs: [/path/to/dir]
|
||||||
|
#
|
||||||
|
# Allow a newer minor version of GHC than the snapshot specifies
|
||||||
|
# compiler-check: newer-minor
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
packages: []
|
packages: []
|
||||||
snapshots:
|
snapshots:
|
||||||
- completed:
|
- completed:
|
||||||
sha256: e5cac927cf7ccbd52aa41476baa68b88c564ee6ddc3bc573dbf4210069287fe7
|
sha256: 08bd13ce621b41a8f5e51456b38d5b46d7783ce114a50ab604d6bbab0d002146
|
||||||
size: 713340
|
size: 720271
|
||||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/19.yaml
|
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/43.yaml
|
||||||
original: lts-22.19
|
original:
|
||||||
|
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/43.yaml
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: tetris
|
name: tetris
|
||||||
version: 0.1.5
|
version: 0.1.6
|
||||||
homepage: https://github.com/samtay/tetris#readme
|
homepage: https://github.com/samtay/tetris#readme
|
||||||
license: BSD3
|
license: BSD3
|
||||||
license-file: LICENSE
|
license-file: LICENSE
|
||||||
|
|
Loading…
Add table
Reference in a new issue