haskanoid 0.1.5.3 → 0.1.5.4
raw patch · 2 files changed
+307/−45 lines, 2 files
Files
- haskanoid.cabal +1/−1
- src/Levels.hs +306/−44
haskanoid.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 0.1.5.3+version: 0.1.5.4 -- A short (one-line) description of the package. synopsis: A breakout game written in Yampa using SDL
src/Levels.hs view
@@ -12,6 +12,7 @@ module Levels where import Control.Arrow((***))+import Data.List (nub) import Physics.TwoDimensions.Dimensions import Constants@@ -25,6 +26,11 @@ , levelMusic :: MusicResource -- ^ Background music } +-- | Number of levels. Change this in the code to finish+-- in a different level.+numLevels :: Int+numLevels = length levels+ -- * Concrete levels levels :: [LevelSpec] levels = [ -- Level 0@@ -44,7 +50,66 @@ , levelBg = Resource "data/level2.png" , levelMusic = Resource "data/level2.mp3" }- ]+ ,+ -- Level 3+ LevelSpec { blockPoss = blockPosS 3+ , levelBg = Resource "data/level1.png"+ , levelMusic = Resource "data/level0.mp3"+ }+ ,+ -- Level 4+ LevelSpec { blockPoss = blockPosS 4+ , levelBg = Resource "data/level1.png"+ , levelMusic = Resource "data/level1.mp3"+ }+ ,+ -- Level 5+ LevelSpec { blockPoss = blockPosS 5+ , levelBg = Resource "data/level2.png"+ , levelMusic = Resource "data/level2.mp3"+ }+ ,+ -- Level 6+ LevelSpec { blockPoss = blockPosS 6+ , levelBg = Resource "data/level1.png"+ , levelMusic = Resource "data/level0.mp3"+ }+ ,+ -- Level 7+ LevelSpec { blockPoss = blockPosS 7+ , levelBg = Resource "data/level1.png"+ , levelMusic = Resource "data/level1.mp3"+ }+ ,+ -- Level 8+ LevelSpec { blockPoss = blockPosS 8+ , levelBg = Resource "data/level2.png"+ , levelMusic = Resource "data/level2.mp3"+ }+ ,+ -- Level 9+ LevelSpec { blockPoss = blockPosS 9+ , levelBg = Resource "data/level0.png"+ , levelMusic = Resource "data/level1.mp3"+ }+ ,+ -- Level 10+ LevelSpec { blockPoss = blockPosS 10+ , levelBg = Resource "data/level1.png"+ , levelMusic = Resource "data/level1.mp3"+ }+ ,+ -- Level 11+ LevelSpec { blockPoss = blockPosS 11+ , levelBg = Resource "data/level2.png"+ , levelMusic = Resource "data/level2.mp3"+ }+ ,+ -- Level 12+ LevelSpec { blockPoss = blockPosS 12+ , levelBg = Resource "data/level0.png"+ , levelMusic = Resource "data/level1.mp3"+ } ] -- | Level block specification (positions) @@ -55,33 +120,16 @@ -- % XXXXXXXX -- % XXXXXXXX blockPosS :: Int -> [Pos2D]-blockPosS 0 = map (adjustHPos *** adjustVPos) allBlocks+blockPosS 0 = map adjustPos allBlocks where allBlocks :: (Enum a, Num a) => [(a,a)] allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0..blockRows-1]] - adjustHPos :: Double -> Double- adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)-- adjustVPos :: Double -> Double- adjustVPos = (topMargin +) . ((blockHeight + blockSeparation) *)- blockRows :: Num a => a blockRows = 4 - -- Fit as many as possible- blockColumns :: Num a => a- blockColumns =- 1 + round' ((gameWidth - blockWidth - 2 * leftMargin) / (blockWidth + blockSeparation))- where round' = fromIntegral . floor - leftMargin :: Num a => a- leftMargin = 25 - topMargin :: Num a => a- topMargin = 10- - -- Level 1 -- %%%%%%%% -- % XXXX@@ -91,40 +139,246 @@ -- % XXXXX -- % XXXX ---blockPosS 1 = map (adjustHPos *** adjustVPos) allBlocks+blockPosS 1 = map adjustPos allBlocks where allBlocks :: (Enum a, Num a, Eq a, Ord a) => [(a,a)]- allBlocks = [ (x,y) | x <- [0..7], y <- [0..5]+ allBlocks = [ (x,y) | x <- [0..blockColumns-1], y <- [0..blockRows-1] , (x + y > 2) && (x + y < 10) ]-- adjustHPos :: Double -> Double- adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)-- adjustVPos :: Double -> Double- adjustVPos = ((blockHeight + blockSeparation) *)-- leftMargin :: Num a => a- leftMargin = 20+ + blockRows :: Num a => a+ blockRows = 6 -- Level 2--- %%%%%%--- % XXXXX--- % X XXXX--- % XX XXX-blockPosS 2 = map (adjustHPos *** adjustVPos) allBlocks+blockPosS 2 = map adjustPos allBlocks where allBlocks :: (Enum a, Num a, Eq a) => [(a,a)]- allBlocks = [(x,y) | x <- [0..5], y <- [0..2], x /= y]+ allBlocks = [(x,y) | x <- [0..blockColumns - 1], y <- [0..blockRows-1]+ , x /= y && (blockColumns - 1 - x) /= y] - adjustHPos :: Double -> Double- adjustHPos = (blockWidth *)+ blockRows :: Num a => a+ blockRows = 4+ - adjustVPos :: Double -> Double- adjustVPos = (100 +) . (blockHeight *)+-- Level 3+-- %%%%%%%%+-- % X X X X+-- % X X X X+-- % X X X X+-- % X X X X+blockPosS 3 = map adjustPos allBlocks + where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0..blockRows-1],+ ((even x) && (odd y) || (odd x) && (even y))]++ blockRows :: Num a => a+ blockRows = 4+++-- Level 4+-- %%%%%%%%+-- % XXXXXXXX+-- %+-- % X X X X+-- %+-- % X X X X+-- %+-- % XXXXXXXX+blockPosS 4 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0,blockRows-1]] +++ [(x,y) | x <- [0..blockColumns-1], y <- [2], odd x] +++ [(x,y) | x <- [0..blockColumns-1], y <- [4], even x]++ blockRows :: Num a => a+ blockRows = 7++-- Level 5+-- %%%%%%%%+-- % X+-- % X X+-- % X X+-- % XXXXXXX+blockPosS 5 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = nub $+ [(3,0),(blockColumns-4,1)] +++ [(2,1),(blockColumns-3,1)] +++ [(1,2),(blockColumns-2,2)] +++ [(x,y) | x <- [0..blockColumns-1], y <- [3]]++-- Level 6+-- %%%%%%%%+-- % XXXXXX+-- % X X+-- % X X+-- % X X+-- % XXXXXX+blockPosS 6 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [1..blockColumns-2], y <- [0,blockRows-1]] +++ [(x,y) | x <- [0,blockColumns-1], y <- [1..blockRows-2]]++ blockRows :: Num a => a+ blockRows = 5+++-- Level 7+-- %%%%%%%%+-- % XXXXXX+-- % X X+-- % XX +-- % XX +-- % X X+-- % XXXXXX+blockPosS 7 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [1..blockColumns-2], y <- [0,blockRows-1]] +++ [(x,y) | x <- [0,blockColumns-1], y <- [1,blockRows-2]] +++ [(x,y) | x <- [3,4], y <- [2..4]]++ blockRows :: Num a => a+ blockRows = 7++-- Level 8+-- %%%%%%%%+-- % XX XXXXX+-- % XX XXXXX+-- % +-- % XX XXXXX+-- % XX XXXXX+-- % XX XXXXX+-- % XX XXXXX+-- % XX XXXXX+-- % XX XXXXX+-- % XX XXXXX+blockPosS 8 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [0..blockColumns-1]+ , y <- [0..blockRows-1]+ , x /= 2, y /= 2 ]++ blockRows :: Num a => a+ blockRows = 9++-- Level 9+-- %%%%%%%%+-- % X+-- % XXX+-- % X X X+-- % XXXXXXX+-- % X X X+-- % XXX+-- % X+blockPosS 9 = map ((adjustHPos *** adjustVPos) . fI2) allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [3], y <- [0..6]] +++ [(x,y) | x <- [0..6], y <- [3]] +++ [(x,y) | x <- [2,4], y <- [1,5]] +++ [(x,y) | x <- [1,5], y <- [2,4]]+ + adjustHPos :: Double -> Double+ adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)++ leftMargin :: Num a => a+ leftMargin = round' ((gameWidth - (blockWidth + blockSeparation) * 7)/2)+ where round' = fromIntegral . floor+++-- Level 10+-- %%%%%%%%+-- % X X X+-- % X X X +-- % X X X +-- % X X X +-- % XXXXXXX+-- % X X X +-- % X X X +-- % X X X+-- % X X X +blockPosS 10 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [0..blockColumns-1]+ , y <- [0..blockRows-1], odd x] +++ [(x,y) | x <- [0..blockColumns-1], y <- [midRow], even x]++ blockRows :: Num a => a+ blockRows = 9++ midRow :: Integral a => a+ midRow = blockRows `div` 2++++-- Level 11+-- %%%%%%%%+-- % XX +-- % XXXX +-- % XXXXXX +-- % XXXXXXXX+-- % XXXXXX +-- % XXXX +-- % XX +blockPosS 11 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | y <- [0..blockRows-1]+ , x <- [0..(blockColumns-1) - 2 * abs (y - midRow)]]++ blockRows :: Num a => a+ blockRows = 7++ midRow :: Integral a => a+ midRow = blockRows `div` 2++-- Level 12+-- %%%%%%%%+-- % XXXXXXX+-- % X X+-- % X X+-- %+-- % X X+-- % X X++blockPosS 12 = map adjustPos allBlocks++ where allBlocks :: (Enum a, Num a, Eq a, Integral a) => [(a,a)]+ allBlocks = [(x,y) | x <- [0..blockColumns-1], y <- [0]] +++ [(x,y) | x <- [2, blockColumns-3], y <- [1,2]] +++ [(1,4), (blockColumns-2,4), (0,5), (blockColumns-1,5)]++ blockRows :: Num a => a+ blockRows = 9+ blockPosS _ = error "No more levels" +-- Dynamic positioning/level size++adjustPos :: Integral a => (a,a) -> (Double, Double)+adjustPos = ((adjustHPos *** adjustVPos) . fI2)++adjustVPos :: Double -> Double+adjustVPos = (topMargin +) . ((blockHeight + blockSeparation) *)++adjustHPos :: Double -> Double+adjustHPos = (leftMargin +) . ((blockWidth + blockSeparation) *)++-- Fit as many as possible+blockColumns :: Num a => a+blockColumns =+ 1 + round' ( (gameWidth - blockWidth - 2 * leftMargin)+ / (blockWidth + blockSeparation)+ )+ where round' = fromIntegral . floor+ -- * Testing constants -- -- These constans are used by the game, and can be mofidied on order to test@@ -137,7 +391,15 @@ initialLevel :: Int initialLevel = 0 --- | Number of levels. Change this in the code to finish--- in a different level.-numLevels :: Int-numLevels = length levels+-- * Constants++topMargin :: Num a => a+topMargin = 10++leftMargin :: Num a => a+leftMargin = 25++-- * Auxiliary functions++fI2 :: Integral a => (a,a) -> (Double, Double)+fI2 (x,y) = (fromIntegral x, fromIntegral y)