packages feed

edge-0.8.10: Resources.hs

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"
                                 , "music.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

stars =
  [ 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
     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))