module Resources where import Paths_edge import Graphics.Gloss.Data.Picture import Graphics.Gloss.Data.Color import ResourceTracker import SpaceJunk import qualified Asteroid as Asteroid import qualified BigAsteroid as BigAsteroid import Data.WrapAround import Star import Sound.ALUT import Universe import Unit import qualified Unit.Simple.Turret as Turret import qualified Unit.Smart.Tank as Tank import qualified Unit.Smart.ATank as ATank import qualified Unit.Smart.STank as STank import qualified Unit.Smart.Death as Death import qualified Unit.Smart.Ninja as Ninja import qualified Unit.Smart.Saucer as Saucer import qualified Unit.Smart.Sniper as Sniper import qualified Unit.Smart.Zeus as Zeus import Combat import qualified Projectile.Mine as Mine import Item import System.Random initResources = let imageFiles = [ "asteroid.bmp" , "asteroidbig.bmp" , "atank.bmp" , "blade.bmp" , "death.bmp" , "interceptor-1.bmp" , "interceptor-2.bmp" , "interceptor-3.bmp" , "item-default.bmp" , "item-health.bmp" , "item-fourway.bmp" , "item-cannon.bmp" , "item-spread.bmp" , "item-rapidfire.bmp" , "item-nuke.bmp" , "lance.bmp" , "lance-thrusting.bmp" , "mine.bmp" , "mine-explosion.bmp" , "mine-lit.bmp" , "ninja.bmp" , "nuke-0.bmp" , "nuke-1.bmp" , "nuke-2.bmp" , "nuke-3.bmp" , "stank.bmp" , "turret.bmp" , "tank.bmp" , "explosion-00.bmp" , "explosion-01.bmp" , "explosion-02.bmp" , "explosion-03.bmp" , "explosion-04.bmp" , "explosion-05.bmp" , "explosion-06.bmp" , "saucer.bmp" , "sniper.bmp" , "zeus-base.bmp" , "zeus-cannon.bmp" ] in let imageFiles' = map ("image/" ++) imageFiles in let soundFiles = [ "test.wav" , "blip.wav" , "energy-shot-02.wav" , "explosion.wav" , "simple-energy-shot.wav" ] in let soundFiles' = map ("sound/" ++) soundFiles in do imagePaths <- mapM getDataFileName imageFiles' pics <- mapM loadBMP imagePaths soundPaths <- mapM getDataFileName soundFiles' sounds <- mapM (createBuffer . File) soundPaths let rt = foldr go emptyResourceTracker (zip imageFiles pics) return $ foldr go' rt (zip soundFiles sounds) where go (file, pic) rt = storeImage rt file pic go' (file, sound) rt = storeSound rt file sound -- loadBuffer path = do buf <- createBuffer (File path) -- [source] <- genObjectNames 1 -- buffer source $= Just buf -- return source startingAsteroids rt wmap = let positionsVelocities = [ ((1900, 500), (200, -120)) , (( 100, 2900), ( 90, 10)) , ((2500, 1100), (-100, 100)) , (( 700, 300), (80, 60)) , ((1300, 1400), (-30, 240)) , ((1000, 2400), (110, 100)) ] in map (\(p, v) -> Asteroid.new rt wmap (wrappoint wmap p) v) positionsVelocities defaultStars = [ Star { Star.location = wrappoint wmap (40.0, 93.0), Star.color = rose } , Star { Star.location = wrappoint wmap (54.0, 74.0), Star.color = white } , Star { Star.location = wrappoint wmap (86.0, 38.0), Star.color = white } , Star { Star.location = wrappoint wmap (30.0, 52.0), Star.color = white } , Star { Star.location = wrappoint wmap ( 2.0, 24.0), Star.color = orange } , Star { Star.location = wrappoint wmap (85.0, 76.0), Star.color = white } , Star { Star.location = wrappoint wmap (27.0, 32.0), Star.color = white } , Star { Star.location = wrappoint wmap (53.0, 94.0), Star.color = white } , Star { Star.location = wrappoint wmap (66.0, 37.0), Star.color = green } , Star { Star.location = wrappoint wmap (39.0, 73.0), Star.color = white } , Star { Star.location = wrappoint wmap (88.0, 67.0), Star.color = chartreuse } , Star { Star.location = wrappoint wmap (50.0, 50.0), Star.color = white } , Star { Star.location = wrappoint wmap (93.0, 33.0), Star.color = white } , Star { Star.location = wrappoint wmap (25.0, 57.0), Star.color = white } , Star { Star.location = wrappoint wmap (36.0, 6.0), Star.color = white } , Star { Star.location = wrappoint wmap (65.0, 61.0), Star.color = white } , Star { Star.location = wrappoint wmap (43.0, 24.0), Star.color = blue } , Star { Star.location = wrappoint wmap (54.0, 52.0), Star.color = white } , Star { Star.location = wrappoint wmap (66.0, 45.0), Star.color = white } , Star { Star.location = wrappoint wmap (41.0, 67.0), Star.color = white } , Star { Star.location = wrappoint wmap (37.0, 25.0), Star.color = white } , Star { Star.location = wrappoint wmap (62.0, 48.0), Star.color = green } , Star { Star.location = wrappoint wmap (88.0, 73.0), Star.color = white } , Star { Star.location = wrappoint wmap ( 4.0, 54.0), Star.color = white } , Star { Star.location = wrappoint wmap (59.0, 77.0), Star.color = white } , Star { Star.location = wrappoint wmap (73.0, 83.0), Star.color = yellow } , Star { Star.location = wrappoint wmap (34.0, 24.0), Star.color = white } , Star { Star.location = wrappoint wmap (58.0, 48.0), Star.color = white } , Star { Star.location = wrappoint wmap (03.0, 99.0), Star.color = white } , Star { Star.location = wrappoint wmap (57.0, 46.0), Star.color = aquamarine } , Star { Star.location = wrappoint wmap (66.0, 67.0), Star.color = white } , Star { Star.location = wrappoint wmap (31.0, 2.0), Star.color = white } , Star { Star.location = wrappoint wmap (85.0, 53.0), Star.color = white } , Star { Star.location = wrappoint wmap (23.0, 77.0), Star.color = white } , Star { Star.location = wrappoint wmap (97.0, 16.0), Star.color = white } , Star { Star.location = wrappoint wmap (16.0, 83.0), Star.color = white } , Star { Star.location = wrappoint wmap (42.0, 45.0), Star.color = magenta } , Star { Star.location = wrappoint wmap ( 9.0, 67.0), Star.color = white } , Star { Star.location = wrappoint wmap (33.0, 33.0), Star.color = azure } , Star { Star.location = wrappoint wmap (27.0, 75.0), Star.color = violet } , Star { Star.location = wrappoint wmap (36.0, 64.0), Star.color = white } , Star { Star.location = wrappoint wmap (74.0, 2.0), Star.color = white } , Star { Star.location = wrappoint wmap (48.0, 46.0), Star.color = cyan } , Star { Star.location = wrappoint wmap (20.0, 98.0), Star.color = rose } , Star { Star.location = wrappoint wmap (52.0, 44.0), Star.color = white } , Star { Star.location = wrappoint wmap (16.0, 38.0), Star.color = white } , Star { Star.location = wrappoint wmap (32.0, 72.0), Star.color = white } , Star { Star.location = wrappoint wmap (21.0, 23.0), Star.color = orange } , Star { Star.location = wrappoint wmap (75.0, 86.0), Star.color = white } , Star { Star.location = wrappoint wmap (67.0, 34.0), Star.color = white } , Star { Star.location = wrappoint wmap (55.0, 64.0), Star.color = white } , Star { Star.location = wrappoint wmap (46.0, 38.0), Star.color = green } , Star { Star.location = wrappoint wmap (37.0, 73.0), Star.color = white } , Star { Star.location = wrappoint wmap (38.0, 69.0), Star.color = chartreuse } , Star { Star.location = wrappoint wmap (52.0, 90.0), Star.color = white } , Star { Star.location = wrappoint wmap (43.0, 31.0), Star.color = white } , Star { Star.location = wrappoint wmap (26.0, 27.0), Star.color = white } , Star { Star.location = wrappoint wmap (86.0, 8.0), Star.color = white } , Star { Star.location = wrappoint wmap (69.0, 91.0), Star.color = white } , Star { Star.location = wrappoint wmap (13.0, 22.0), Star.color = blue } , Star { Star.location = wrappoint wmap (58.0, 72.0), Star.color = white } , Star { Star.location = wrappoint wmap (96.0, 48.0), Star.color = white } , Star { Star.location = wrappoint wmap (42.0, 97.0), Star.color = white } , Star { Star.location = wrappoint wmap (77.0, 28.0), Star.color = white } , Star { Star.location = wrappoint wmap (63.0, 78.0), Star.color = green } , Star { Star.location = wrappoint wmap (68.0, 71.0), Star.color = white } , Star { Star.location = wrappoint wmap ( 2.0, 84.0), Star.color = white } , Star { Star.location = wrappoint wmap (49.0, 73.0), Star.color = white } , Star { Star.location = wrappoint wmap (72.0, 83.0), Star.color = yellow } , Star { Star.location = wrappoint wmap (94.0, 29.0), Star.color = white } , Star { Star.location = wrappoint wmap (52.0, 98.0), Star.color = white } , Star { Star.location = wrappoint wmap (73.0, 92.0), Star.color = white } , Star { Star.location = wrappoint wmap (52.0, 36.0), Star.color = aquamarine } , Star { Star.location = wrappoint wmap (46.0, 64.0), Star.color = white } , Star { Star.location = wrappoint wmap (32.0, 82.0), Star.color = white } , Star { Star.location = wrappoint wmap (35.0, 53.0), Star.color = white } , Star { Star.location = wrappoint wmap (24.0, 87.0), Star.color = white } , Star { Star.location = wrappoint wmap (87.0, 17.0), Star.color = white } , Star { Star.location = wrappoint wmap (16.0, 93.0), Star.color = white } , Star { Star.location = wrappoint wmap (72.0, 42.0), Star.color = magenta } , Star { Star.location = wrappoint wmap ( 4.0, 97.0), Star.color = white } , Star { Star.location = wrappoint wmap (93.0, 33.0), Star.color = azure } , Star { Star.location = wrappoint wmap (22.0, 5.0), Star.color = violet } , Star { Star.location = wrappoint wmap (46.0, 68.0), Star.color = white } , Star { Star.location = wrappoint wmap (76.0, 92.0), Star.color = white } , Star { Star.location = wrappoint wmap (78.0, 41.0), Star.color = cyan } ] where wmap = wrapmap 100.0 100.0 initLevels rt = do let b = blankArena 3000.0 3000.0 let a = b { stars = defaultStars } let wmap = Universe.wrapMap a let pL = [ -- 1 a { asteroids = asteroidGen rt wmap [ ((1900, 500), (200, -120)) , (( 100, 2900), ( 90, 10)) -- , ((2500, 1100), ((-100), 100)) -- , (( 700, 300), (80, 60)) -- , ((1300, 1400), ((-30), 240)) -- , ((1000, 2400), (110, 100)) ] , simpleUnits = turretGen rt wmap [ ((-700.0, 300.0), 0.0, 7 * pi / 4) , ((500.0, 800.0), pi / 3, 7 * pi / 4) ] } , -- 2 a { asteroids = asteroidGen rt wmap [ ((1900, 500), (200, -120)) , (( 100, 2900), ( 90, 10)) , ((2500, 1100), (-100, 100)) ] , simpleUnits = turretGen rt wmap [ ((1000.0, 200.0), 0.0, pi / 3) ] , smartUnits = tankGen rt wmap [ ((-1000.0, 800.0), 0.0) , ((-1200.0, 500.0), pi) ] } , -- 3 a { asteroids = asteroidGen rt wmap [ ((900, 340), (230, -120)) , ((1200, 1400), (110, 30)) , ((200, 500), (-180, 110)) ] , simpleUnits = turretGen rt wmap [ ((-500.0, 200.0), 0.0, 3 * pi / 2 ) ] , smartUnits = tankGen rt wmap [ ((-1000.0, 800.0), 0.0) , ((900.0, 600.0), pi) , ((700.0, -500.0), pi / 2) ] ++ aTankGen rt wmap [ ((-1100.0, -900.0), pi + pi / 3) ] } , -- 4 a { asteroids = asteroidGen rt wmap [ ((800, -340), (130, 120)) , ((700, 200), (10, -130)) , ((-300, 900), (70, 110)) ] , smartUnits = tankGen rt wmap [ ((-700.0, 600.0), 0.0) , ((500.0, -1100.0), pi / 2) ] ++ aTankGen rt wmap [ ((-1000.0, 900.0), pi + pi / 3) ] ++ saucerGen rt wmap [ ((400.0, 1400.0), 0.0) ] } , -- 5 a { asteroids = asteroidGen rt wmap [ ((800, -340), (130, 120)) , ((700, 200), (10, -130)) , ((-300, 900), (70, 110)) ] , smartUnits = tankGen rt wmap [ ((-400.0, 900.0), 0.0) ] ++ aTankGen rt wmap [ ((1400.0, -800.0), pi) ] ++ saucerGen rt wmap [ ((400.0, 1400.0), 0.0) , ((-1200.0, -1000.0), pi) , ((100.0, -500.0), pi) , ((-600.0, 800.0), 0.0) ] } , -- 6 a { asteroids = asteroidGen rt wmap [ ((800, -340), (-130, 120)) , ((700, 200), (-130, 120)) , ((-300, 900), (-130, 120)) , ((1340, -1230), (-130, 120)) , ((-420, 990), (-130, 120)) , ((370, -130), (-130, 120)) , ((-1220, 1090), (-130, 120)) , ((400, 1300), (-130, 120)) , ((-700, -500), (-130, 120)) , ((-1320, 1290), (-130, 120)) , ((100, 400), (-130, 120)) , ((-800, -400), (-130, 120)) , ((1440, -1330), (-130, 120)) , ((-520, 120), (-130, 120)) , ((1100, 40), (-130, 120)) , ((500, 100), (-130, 120)) , ((-1100, -20), (-130, 120)) , ((-520, -70), (-130, 120)) , ((40, 1100), (-130, 120)) , ((100, 500), (-130, 120)) , ((-20,-1100), (-130, 120)) , ((-70, -520), (-130, 120)) , ((-600, 1500), (-130, 120)) , ((-1000, 500), (-130, 120)) , ((-400, -600), (-130, 120)) , ((1200, -600), (-130, 120)) , ((500, -1400), (-130, 120)) ] ++ bigAsteroidGen rt wmap [ ((500, -840), (-130, 120)) , ((900, 300), (-130, 120)) , ((-200, 1100), (-130, 120)) , ((600, -200), (-130, 120)) , ((-600, 700), (-130, 120)) , ((-900, -1100), (-130, 120)) , ((-100, -900), (-130, 120)) , ((-200, -200), (-130, 120)) , ((600, 600), (-130, 120)) , ((900, -900), (-130, 120)) , ((-1400, -1400), (-130, 120)) , ((1100, 1300), (-130, 120)) , ((-1000, -800), (-130, 120)) , ((400, -600), (-130, 120)) , ((-500, -1300), (-130, 120)) ] , simpleUnits = turretGen rt wmap [ ((700.0, 650.0), 0.0, pi ) , ((-550.0, -300.0), 0.0, 0.0 ) ] , smartUnits = tankGen rt wmap [ ((-450.0, 821.0), 0.0) ] ++ aTankGen rt wmap [ ((40.0, -1400.0), pi) ] ++ saucerGen rt wmap [ ((540.0, 1320.0), 0.0) , ((-1000.0, -1200.0), pi) , ((40.0, 1200.0), pi) , ((-200.0, -1000.0), 0) ] } , -- 7 a { asteroids = asteroidGen rt wmap [ ((800, -340), (-30, 20)) , ((-1320, 1290), (200, 100)) , ((-400, -600), (-80, -40)) , ((500, -1400), (30, 80)) ] ++ bigAsteroidGen rt wmap [ ((-100, -900), (40, 120)) , ((-1000, -800), (50, -60)) ] , simpleUnits = turretGen rt wmap [ ((900.0, -650.0), 0.0, pi ) ] , smartUnits = tankGen rt wmap [ ((-450.0, 821.0), 0.0) , ((40.0, -1400.0), pi) ] ++ sniperGen rt wmap [ ((-1200.0, 0.0), 0.0) , ((1200.0, 0.0), 0.0) ] , unitProjectiles = mineGen rt wmap [ (300.0, 400.0) , (-700.0, 200.0) , (1300.0, -500.0) ] } , -- 8 a { asteroids = asteroidGen rt wmap [ ((840, -440), (-30, 20)) , ((-1320, 1290), (120, -100)) , ((600, 1400), (30, 80)) ] ++ bigAsteroidGen rt wmap [ ((-100, -900), (40, 30)) , ((-900, 800), (80, -60)) , ((-1000, 400), (-50, -80)) ] , smartUnits = ninjaGen rt wmap [ ((100.0, 600.0), 0.0) , ((-200.0, -700.0), pi) , ((700.0, 800.0), 0.0) , ((600.0, -900.0), pi) , ((-800.0, 1300.0), 0.0) , ((-1400.0, -1400.0), pi) ] , unitProjectiles = mineGen rt wmap [ (200.0, 800.0) , (-500.0, -200.0) , (-1300.0, 1000.0) ] } , -- 9 a { asteroids = asteroidGen rt wmap [ ((640, -440), (-20, 30)) , ((-1320, 1190), (110, -90)) , ((700, 1200), (40, 70)) ] ++ bigAsteroidGen rt wmap [ ((-100, -900), (30, 40)) , ((-500, 1000), (70, -70)) ] , smartUnits = deathGen rt wmap [ ((0.0, -1000.0), 0.0) ] } , -- 10 a { asteroids = asteroidGen rt wmap [ ((1000, -300), (-50, 100)) , ((-1020, 1290), (120, 20)) , ((540, -1400), (90, 70)) ] ++ bigAsteroidGen rt wmap [ ((-400, -200), (40, 20)) , ((-1300, -850), (50, -160)) ] , simpleUnits = turretGen rt wmap [ ((500.0, 650.0), 0.0, pi ) , ((-1300.0, -650.0), 0.0, pi ) ] , smartUnits = aTankGen rt wmap [ ((-450.0, 821.0), 0.0) , ((40.0, -1400.0), pi) , ((600.0, 90.0), 0.0) , ((900.0, -1200.0), pi) ] ++ sTankGen rt wmap [ ((450.0, -721.0), 0.0) , ((200.0, 1450.0), pi) , ((-600.0, 190.0), 0.0) , ((700.0, -1000.0), pi) ] , unitProjectiles = mineGen rt wmap [ (500.0, 1000.0) , (-900.0, 700.0) , (1300.0, -1400.0) ] } , -- 11 a { smartUnits = zeusGen rt wmap [ ((-1400, 1400.0), 0.0, 0) ] ++ sniperGen rt wmap [ ((-1200.0, 0.0), 0.0) , ((1200.0, 0.0), 0.0) ] ++ saucerGen rt wmap [ ((1400.0, 1400.0), 0.0) ] , unitProjectiles = mineGen rt wmap [ (-1100.0, 1400.0) , (-1700.0, 1400.0) , (-1400.0, 1100.0) , (-1400.0, 1700.0) , (-1100.0, 1100.0) , (-1700.0, 1700.0) , (-1100.0, 1700.0) , (-1700.0, 1100.0) ] } ] let addItems a = do it1 <- randomItemType it2 <- randomItemType x1 <- randomRIO (0, 2999) x2 <- randomRIO (0, 2999) y1 <- randomRIO (0, 2999) y2 <- randomRIO (0, 2999) let wp1 = wrappoint wmap (x1, y1) let wp2 = wrappoint wmap (x2, y2) let i1 = Item it1 rt wp1 let i2 = Item it2 rt wp2 return a { items = [i1, i2] } mapM addItems pL asteroidGen rt wmap p = let positionsVelocities = p in map (\(p, v) -> (SpaceJunk (Asteroid.new rt wmap (wrappoint wmap p) v))) positionsVelocities bigAsteroidGen rt wmap p = let positionsVelocities = p in map (\(p, v) -> (SpaceJunk (BigAsteroid.new rt wmap (wrappoint wmap p) v))) positionsVelocities turretGen rt wmap = map (\(x, y, z) -> SimpleUnit (Turret.new rt wmap (wrappoint wmap x) y z)) tankGen rt wmap = map (\(x, y) -> SmartUnit (Tank.new rt wmap (wrappoint wmap x) y)) aTankGen rt wmap = map (\(x, y) -> SmartUnit (ATank.new rt wmap (wrappoint wmap x) y)) sTankGen rt wmap = map (\(x, y) -> SmartUnit (STank.new rt wmap (wrappoint wmap x) y)) mineGen rt wmap = map (\x -> Projectile (Mine.new rt wmap (wrappoint wmap x))) sniperGen rt wmap = map (\(x, y) -> SmartUnit (Sniper.new rt wmap (wrappoint wmap x) y)) zeusGen rt wmap = map (\(x, y, z) -> SmartUnit (Zeus.new rt wmap (wrappoint wmap x) y z)) deathGen rt wmap = map (\(x, y) -> SmartUnit (Death.new rt wmap (wrappoint wmap x) y)) saucerGen rt wmap = map (\(x, y) -> SmartUnit (Saucer.new rt wmap (wrappoint wmap x) y)) ninjaGen rt wmap = map (\(x, y) -> SmartUnit (Ninja.new rt wmap (wrappoint wmap x) y))