/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-05-13 22:25:16 UTC
  • Revision ID: josh@9ix.org-20130513222516-wem0v29pit3ivc6w
rocks!

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'
5
6
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'
13
12
require 'player'
14
13
require 'enemy'
15
14
require 'cursor'
16
15
require 'bullet'
17
16
require 'rock'
18
 
require 'boom'
19
 
require 'planet'
20
 
require 'trade_view'
21
17
 
22
18
util = {
23
19
   signOf = function(value)
26
22
               else
27
23
                  return -1
28
24
               end
29
 
            end,
30
 
   shortestVector = function(from, to)
31
 
                       if STRICT then
32
 
                          if from.x < the.app.width / 2 or
33
 
                             from.x > the.bg.width - the.app.width / 2 or
34
 
                             from.y < the.app.height / 2 or
35
 
                             from.y > the.bg.height - the.app.height / 2 then
36
 
                             error('"from" coordinate out of bounds: X='..from.x..' Y='..from.y)
37
 
                          end
38
 
 
39
 
                          if to.x < the.app.width / 2 or
40
 
                             to.x > the.bg.width - the.app.width / 2 or
41
 
                             to.y < the.app.height / 2 or
42
 
                             to.y > the.bg.height - the.app.height / 2 then
43
 
                             error('"to" coordinate out of bounds: X='..to.x..' Y='..to.y)
44
 
                          end
45
 
                       end
46
 
 
47
 
                       -- normalize grid to account for mirror zones
48
 
                       local fx = from.x - the.app.width / 2
49
 
                       local fy = from.y - the.app.height / 2
50
 
                       local tx = to.x - the.app.width / 2
51
 
                       local ty = to.y - the.app.height / 2
52
 
 
53
 
                       local short = {}
54
 
 
55
 
                       -- pick shorter x
56
 
                       if math.abs(tx - fx) < math.abs(tx - fx - (the.bg.width - the.app.width)) then
57
 
                          -- straight path is shorter
58
 
                          short.x = tx - fx
59
 
                       else
60
 
                          short.x = tx - fx - (the.bg.width - the.app.width)
61
 
                       end
62
 
 
63
 
                       -- pick shorter y
64
 
                       if math.abs(ty - fy) < math.abs(ty - fy - (the.bg.height - the.app.height)) then
65
 
                          -- straight path is shorter
66
 
                          short.y = ty - fy
67
 
                       else
68
 
                          short.y = ty - fy - (the.bg.height - the.app.height)
69
 
                       end
70
 
 
71
 
                       return vector.new(short.x, short.y)
72
 
                    end
 
25
            end
73
26
}
74
27
 
75
28
GameView = View:extend {
86
39
              --    end
87
40
              -- end
88
41
 
89
 
              the.storage = Storage:new{filename = 'scores.lua'}
90
 
              the.storage:load()
91
 
              if not the.storage.data.highScore then
92
 
                 print('initializing storage')
93
 
                 the.storage.data = {highScore = 0}
94
 
              end
95
 
 
96
 
              --the.rockColliders = Group:new()
97
 
              the.bullets = Group:new()
98
 
              the.mirrors = Group:new()
99
 
              --the.rocks = Group:new()
100
 
              the.interface = Group:new()
101
 
              the.planets = Group:new()
102
 
              the.indicators = Group:new()
103
 
 
104
42
              the.bg = Tile:new{
105
43
                 image = 'data/stars3.png',
106
 
                 width = 13660,
107
 
                 height = 7680
 
44
                 -- 1366x768 * 3
 
45
                 width = 4098,
 
46
                 height = 2304
108
47
              }
109
48
              self:add(the.bg)
110
49
 
111
 
              self:add(the.planets)
112
 
 
113
50
              --the.player = CrystalPlayer:new{x=400,y=300}
114
 
              the.player = SpacePlayer:new{x=the.bg.width / 2, y=the.bg.height / 2}
 
51
              the.player = SpacePlayer:new{x=1366,y=768}
115
52
              self:add(the.player)
116
 
              self:add(the.player.thrust)
117
 
 
118
 
              --self:add(Enemy:new{x=400, y=300})
119
 
 
120
 
              self:add(the.bullets)
121
 
              --self:add(the.rockColliders)
122
 
              self:add(the.mirrors)
123
 
              --self:add(the.rocks)
124
 
              self:add(the.indicators)
125
 
              self:add(the.interface)
126
 
 
127
 
              for _ = 1, math.random(6) do
128
 
                 local planet = Planet:new{
129
 
                    x = math.random(the.app.width / 2,
130
 
                                    the.bg.width - the.app.width / 2),
131
 
                    y = math.random(the.app.height / 2,
132
 
                                    the.bg.height - the.app.height / 2),
133
 
                    rotation = math.random() * math.pi
134
 
                 }
135
 
                 the.planets:add(planet)
136
 
              end
 
53
 
 
54
              self:add(Enemy:new{x=400, y=300})
137
55
 
138
56
              the.cursor = Cursor:new()
139
57
              self:add(the.cursor)
140
58
 
141
 
              the.score = Text:new{
142
 
                 x = 8,
143
 
                 y = 8,
144
 
                 width = the.app.width,
145
 
                 --align = 'center',
146
 
                 font = 25}
147
 
              --the.interface:add(the.score)
148
 
 
149
 
              local hs = the.storage.data.highScore
150
 
              local m = hs / 60
151
 
              local s = hs % 60
152
 
 
153
 
              the.highScore = Text:new{
154
 
                 x = -8,
155
 
                 y = 8,
156
 
                 width = the.app.width,
157
 
                 align = 'right',
158
 
                 font = 25,
159
 
                 text = string.format('High Score: %d:%02d', m, s)
160
 
              }
161
 
              --the.interface:add(the.highScore)
162
 
 
163
 
              the.over = Text:new{
164
 
                 y = the.app.height / 2,
165
 
                 width = the.app.width,
166
 
                 align = 'center',
167
 
                 font = 25,
168
 
                 text = "Game Over",
169
 
                 visible = false
170
 
              }
171
 
              the.interface:add(the.over)
172
 
 
173
 
 
174
 
              the.instructions = Text:new{
175
 
                 y = the.app.height / 2 + 32,
176
 
                 width = the.app.width,
177
 
                 align = 'center',
178
 
                 font = 12,
179
 
                 text = "Press Enter to start a new game\nPress Q to quit",
180
 
                 visible = false
181
 
              }
182
 
              the.interface:add(the.instructions)
183
 
 
184
59
              love.mouse.setGrab(true)
185
60
              love.mouse.setVisible(false)
186
 
              love.mouse.setPosition(the.app.width / 2, the.app.height / 2)
187
61
 
188
62
              --self:loadLayers('data/map.lua')
189
63
              self.focus = the.player
192
66
              self.gameStart = love.timer.getTime()
193
67
           end,
194
68
   onUpdate = function(self, dt)
195
 
                 the.bullets:collide(the.planets)
 
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)
196
81
 
197
 
                 -- this should really go somewhere else...
198
 
                 for _, planet in ipairs(the.planets.sprites) do
 
82
                    self.lastRock = love.timer.getTime()
199
83
                 end
200
 
 
201
 
                 -- for _, mirror in ipairs(the.mirrors.sprites) do
202
 
                 --    if not mirror.of then
203
 
                 --       print('mirror:' .. inspect(mirror))
204
 
                 --       error('mirror OF NOTHING')
205
 
                 --    end
206
 
                 -- end
207
84
              end,
208
 
   onEndFrame = function(self)
209
 
                   the.interface.translate.x = the.player.x - the.app.width / 2 + the.player.width / 2
210
 
                   the.interface.translate.y = the.player.y - the.app.height / 2 + the.player.height / 2
211
 
 
212
 
                   if the.player.active then
213
 
                      self:updateScore()
214
 
                   end
215
 
                end,
216
85
   draw = function (self, x, y)
217
86
             View.draw(self, x, y)
218
 
             --love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
219
 
          end,
220
 
   updateScore = function(self)
221
 
                    local t = love.timer.getTime() - self.gameStart
222
 
                    local m = t / 60
223
 
                    local s = t % 60
224
 
 
225
 
                    the.score.text = string.format('Score: %d:%02d', m, s)
226
 
                    --the.score.y = the.player.y - the.app.height / 2 + the.player.height
227
 
                    --the.score.x = the.player.x - the.app.width / 2 + the.player.width
228
 
 
229
 
                    --the.highScore.y = the.player.y - the.app.height / 2 + the.player.height
230
 
                    --the.highScore.x = the.player.x - the.app.width / 2
231
 
                 end
 
87
             love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
 
88
          end
232
89
}
233
90
 
234
91
MenuScreen = View:extend {
252
109
              math.randomseed(os.time())
253
110
 
254
111
              self.view = GameView:new()
255
 
 
256
112
              if DEBUG then
257
113
                 self.console:watch('VERSION', 'VERSION')
258
114
                 self.console:watch('updateTook', 'the.updateTook')
260
116
                 self.console:watch('the.player.y', 'the.player.y')
261
117
                 self.console:watch('the.app.width', 'the.app.width')
262
118
                 self.console:watch('the.app.height', 'the.app.height')
263
 
                 self.console:watch('num mirrors', '#the.mirrors.sprites')
264
 
                 self.console:watch('num rocks', '#the.rocks.sprites')
265
 
                 self.console:watch('num planets', '#the.planets.sprites')
266
119
                 --self.console:watch('drawTook', 'the.drawTook')
267
120
 
268
121
                 -- back off that dark overlay a bit
270
123
              end
271
124
           end,
272
125
   onUpdate = function (self, dt)
273
 
                 if not (DEBUG and the.console.visible) then
274
 
                    if the.keys:justPressed('q') then
275
 
                       self.quit()
276
 
                    elseif the.keys:justPressed('return') then
277
 
                       if the.keys:pressed('alt') then
278
 
                          love.graphics.toggleFullscreen()
279
 
                       else
280
 
                          self.view = GameView:new()
281
 
                       end
282
 
                    elseif the.keys:justPressed('f1') then
283
 
                       local ss = love.graphics.newScreenshot()
284
 
                       ss:encode('screenshot-' ..love.timer.getTime()..'.png')
285
 
                    elseif the.keys:justPressed('f11') then
286
 
                       love.graphics.toggleFullscreen()
287
 
                    end
 
126
                 if the.keys:justPressed('escape') then
 
127
                    self.quit()
288
128
                 end
289
129
              end,
290
130
   update = function (self, dt)
295
135
               end
296
136
            end
297
137
}
298
 
 
299
 
realRun = love.run
300
 
function love.run()
301
 
   -- should fail silently if it can't go to fullscreen...
302
 
   love.graphics.toggleFullscreen()
303
 
 
304
 
   realRun()
305
 
end
 
 
b'\\ No newline at end of file'