/traderous

To get this branch, use:
bzr branch http://9ix.org/bzr/traderous

« back to all changes in this revision

Viewing changes to main.lua

  • Committer: Josh C
  • Date: 2013-06-19 01:44:47 UTC
  • Revision ID: josh@9ix.org-20130619014447-mtpps0g4w7aeckpg
enemy "patrol path" (pick random destination)

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
DEBUG = true
3
3
 
4
4
require 'zoetrope'
5
 
--__ = require 'underscore'
6
5
vector = require 'vector'
 
6
--inspect = require 'inspect'
7
7
 
8
8
require 'group'
9
9
 
10
10
require 'version'
11
11
require 'wrap_tile'
 
12
require 'mirror'
12
13
require 'player'
13
14
require 'enemy'
14
15
require 'cursor'
15
16
require 'bullet'
16
17
require 'rock'
 
18
require 'boom'
 
19
require 'planet'
 
20
require 'trade_view'
 
21
require 'shield'
17
22
 
18
23
util = {
19
24
   signOf = function(value)
22
27
               else
23
28
                  return -1
24
29
               end
25
 
            end
 
30
            end,
 
31
   shortestVector = function(from, to)
 
32
                       if STRICT then
 
33
                          if from.x < the.app.width / 2 or
 
34
                             from.x > the.bg.width - the.app.width / 2 or
 
35
                             from.y < the.app.height / 2 or
 
36
                             from.y > the.bg.height - the.app.height / 2 then
 
37
                             error('"from" coordinate out of bounds: X='..from.x..' Y='..from.y)
 
38
                          end
 
39
 
 
40
                          if to.x < the.app.width / 2 or
 
41
                             to.x > the.bg.width - the.app.width / 2 or
 
42
                             to.y < the.app.height / 2 or
 
43
                             to.y > the.bg.height - the.app.height / 2 then
 
44
                             error('"to" coordinate out of bounds: X='..to.x..' Y='..to.y)
 
45
                          end
 
46
                       end
 
47
 
 
48
                       -- normalize grid to account for mirror zones
 
49
                       local fx = from.x - the.app.width / 2
 
50
                       local fy = from.y - the.app.height / 2
 
51
                       local tx = to.x - the.app.width / 2
 
52
                       local ty = to.y - the.app.height / 2
 
53
 
 
54
                       local short = {}
 
55
 
 
56
                       -- pick shorter x
 
57
                       if math.abs(tx - fx) < math.abs(tx - fx - (the.bg.width - the.app.width)) then
 
58
                          -- straight path is shorter
 
59
                          short.x = tx - fx
 
60
                       else
 
61
                          short.x = tx - fx - (the.bg.width - the.app.width)
 
62
                       end
 
63
 
 
64
                       -- pick shorter y
 
65
                       if math.abs(ty - fy) < math.abs(ty - fy - (the.bg.height - the.app.height)) then
 
66
                          -- straight path is shorter
 
67
                          short.y = ty - fy
 
68
                       else
 
69
                          short.y = ty - fy - (the.bg.height - the.app.height)
 
70
                       end
 
71
 
 
72
                       return vector.new(short.x, short.y)
 
73
                    end
26
74
}
27
75
 
28
76
GameView = View:extend {
29
 
   lastRock = 0,
30
 
   rockInterval = 1,
31
 
   gameStart = 0,
32
77
   onNew = function (self)
33
 
              -- for x = 1,30 do
34
 
              --    for y = 1,30 do
35
 
              --       self:add(Fill:new{x=x*400, y=y*400,
36
 
              --                         width = 32, height = 32,
37
 
              --                         fill = {0,0,255}
38
 
              --                      })
39
 
              --    end
40
 
              -- end
 
78
              the.storage = Storage:new{filename = 'scores.lua'}
 
79
              the.storage:load()
 
80
              --if not the.storage.data.highScore then
 
81
              --   print('initializing storage')
 
82
              --   the.storage.data = {highScore = 0}
 
83
              --end
 
84
 
 
85
              the.bullets = Group:new()
 
86
              the.interface = Group:new()
 
87
              the.planets = Group:new()
 
88
              the.indicators = Group:new()
 
89
              the.enemies = Group:new()
41
90
 
42
91
              the.bg = Tile:new{
43
92
                 image = 'data/stars3.png',
44
 
                 -- 1366x768 * 3
45
 
                 width = 4098,
46
 
                 height = 2304
 
93
                 width = 13660,
 
94
                 height = 7680
47
95
              }
48
96
              self:add(the.bg)
49
97
 
 
98
              self:add(the.planets)
 
99
 
50
100
              --the.player = CrystalPlayer:new{x=400,y=300}
51
 
              the.player = SpacePlayer:new{x=1366,y=768}
 
101
              the.player = SpacePlayer:new{x=the.bg.width / 2, y=the.bg.height / 2}
52
102
              self:add(the.player)
53
 
 
54
 
              self:add(Enemy:new{x=400, y=300})
 
103
              self:add(the.player.thrust)
 
104
              self:add(the.player.shield)
 
105
 
 
106
              self:add(the.enemies)
 
107
 
 
108
              --local e = Enemy:new{x=400, y=300}
 
109
              local e = Enemy:new{x=the.bg.width / 2, y=the.bg.height / 2}
 
110
              the.enemies:add(e)
 
111
              self:add(e.thrust) -- why doesn't this work in Enemy.new?
 
112
              self:add(e.shield)
 
113
 
 
114
              self:add(the.bullets)
 
115
              self:add(the.indicators)
 
116
              self:add(the.interface)
 
117
 
 
118
              for _ = 1, math.random(6) do
 
119
                 local planet = Planet:new{
 
120
                    x = math.random(the.app.width / 2,
 
121
                                    the.bg.width - the.app.width / 2),
 
122
                    y = math.random(the.app.height / 2,
 
123
                                    the.bg.height - the.app.height / 2),
 
124
                    rotation = math.random() * math.pi
 
125
                 }
 
126
                 the.planets:add(planet)
 
127
              end
55
128
 
56
129
              the.cursor = Cursor:new()
57
130
              self:add(the.cursor)
58
131
 
 
132
              the.over = Text:new{
 
133
                 y = the.app.height / 2,
 
134
                 width = the.app.width,
 
135
                 align = 'center',
 
136
                 font = 25,
 
137
                 text = "Game Over",
 
138
                 visible = false
 
139
              }
 
140
              the.interface:add(the.over)
 
141
 
 
142
 
 
143
              the.instructions = Text:new{
 
144
                 y = the.app.height / 2 + 32,
 
145
                 width = the.app.width,
 
146
                 align = 'center',
 
147
                 font = 12,
 
148
                 text = "Press Enter to start a new game\nPress Q to quit",
 
149
                 visible = false
 
150
              }
 
151
              the.interface:add(the.instructions)
 
152
 
59
153
              love.mouse.setGrab(true)
60
154
              love.mouse.setVisible(false)
 
155
              love.mouse.setPosition(the.app.width / 2, the.app.height / 2)
61
156
 
62
 
              --self:loadLayers('data/map.lua')
63
157
              self.focus = the.player
64
 
              --self:clampTo(self.map)
65
 
 
66
 
              self.gameStart = love.timer.getTime()
67
158
           end,
68
159
   onUpdate = function(self, dt)
69
 
                 if love.timer.getTime() > self.lastRock + self.rockInterval then
70
 
                    local rock = Rock:new{
71
 
                       x = math.random(the.bg.width),
72
 
                       y = math.random(the.bg.height),
73
 
                       velocity = {
74
 
                          x = math.random(-300, 300),
75
 
                          y = math.random(-300, 300),
76
 
                          rotation = math.random(-7, 7)
77
 
                       },
78
 
                       scale = math.random() + 0.5
79
 
                    }
80
 
                    self:add(rock)
81
 
 
82
 
                    self.lastRock = love.timer.getTime()
83
 
                 end
 
160
                 the.bullets:collide(the.planets)
 
161
                 the.bullets:collide(the.player)
 
162
                 the.bullets:collide(the.enemies)
84
163
              end,
 
164
   onEndFrame = function(self)
 
165
                   the.interface.translate.x = the.player.x - the.app.width / 2 + the.player.width / 2
 
166
                   the.interface.translate.y = the.player.y - the.app.height / 2 + the.player.height / 2
 
167
                end,
85
168
   draw = function (self, x, y)
86
169
             View.draw(self, x, y)
87
 
             love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
88
 
          end
 
170
             --love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
 
171
          end,
89
172
}
90
173
 
91
174
MenuScreen = View:extend {
109
192
              math.randomseed(os.time())
110
193
 
111
194
              self.view = GameView:new()
 
195
 
112
196
              if DEBUG then
113
197
                 self.console:watch('VERSION', 'VERSION')
114
198
                 self.console:watch('updateTook', 'the.updateTook')
116
200
                 self.console:watch('the.player.y', 'the.player.y')
117
201
                 self.console:watch('the.app.width', 'the.app.width')
118
202
                 self.console:watch('the.app.height', 'the.app.height')
 
203
                 self.console:watch('num mirrors', '#the.mirrors.sprites')
 
204
                 self.console:watch('num rocks', '#the.rocks.sprites')
 
205
                 self.console:watch('num planets', '#the.planets.sprites')
119
206
                 --self.console:watch('drawTook', 'the.drawTook')
120
207
 
121
208
                 -- back off that dark overlay a bit
123
210
              end
124
211
           end,
125
212
   onUpdate = function (self, dt)
126
 
                 if the.keys:justPressed('escape') then
127
 
                    self.quit()
 
213
                 if not (DEBUG and the.console.visible) then
 
214
                    if the.keys:justPressed('q') then
 
215
                       self.quit()
 
216
                    elseif the.keys:justPressed('return') then
 
217
                       if the.keys:pressed('alt') then
 
218
                          love.graphics.toggleFullscreen()
 
219
                       else
 
220
                          self.view = GameView:new()
 
221
                       end
 
222
                    elseif the.keys:justPressed('f1') then
 
223
                       local ss = love.graphics.newScreenshot()
 
224
                       ss:encode('screenshot-' ..love.timer.getTime()..'.png')
 
225
                    elseif the.keys:justPressed('f11') then
 
226
                       love.graphics.toggleFullscreen()
 
227
                    end
128
228
                 end
129
229
              end,
130
230
   update = function (self, dt)
135
235
               end
136
236
            end
137
237
}
 
238
 
 
239
realRun = love.run
 
240
function love.run()
 
241
   -- should fail silently if it can't go to fullscreen...
 
242
   love.graphics.toggleFullscreen()
 
243
 
 
244
   realRun()
 
245
end
 
 
b'\\ No newline at end of file'