/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-23 02:05:10 UTC
  • Revision ID: josh@9ix.org-20130623020510-i4t86yocvbjab19o
higher planet floor, recharge shields when you land, stop moving when you land

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
              for _ = 1, 5 do
 
109
                 local e = Enemy:new{x = math.random(the.bg.width),
 
110
                                     y = math.random(the.bg.height)}
 
111
                 --local e = Enemy:new{x=the.bg.width / 2, y=the.bg.height / 2}
 
112
                 the.enemies:add(e)
 
113
                 self:add(e.thrust) -- why doesn't this work in Enemy.new?
 
114
                 self:add(e.shield)
 
115
              end
 
116
 
 
117
              self:add(the.bullets)
 
118
              self:add(the.indicators)
 
119
              self:add(the.interface)
 
120
 
 
121
              for _ = 1, math.random(3, 6) do
 
122
                 local planet = Planet:new{
 
123
                    x = math.random(the.app.width / 2,
 
124
                                    the.bg.width - the.app.width / 2),
 
125
                    y = math.random(the.app.height / 2,
 
126
                                    the.bg.height - the.app.height / 2),
 
127
                    rotation = math.random() * math.pi
 
128
                 }
 
129
                 the.planets:add(planet)
 
130
              end
55
131
 
56
132
              the.cursor = Cursor:new()
57
133
              self:add(the.cursor)
58
134
 
 
135
              the.over = Text:new{
 
136
                 y = the.app.height / 2,
 
137
                 width = the.app.width,
 
138
                 align = 'center',
 
139
                 font = 25,
 
140
                 text = "Game Over",
 
141
                 visible = false
 
142
              }
 
143
              the.interface:add(the.over)
 
144
 
 
145
 
 
146
              the.instructions = Text:new{
 
147
                 y = the.app.height / 2 + 32,
 
148
                 width = the.app.width,
 
149
                 align = 'center',
 
150
                 font = 12,
 
151
                 text = "Press Enter to start a new game\nPress Q to quit",
 
152
                 visible = false
 
153
              }
 
154
              the.interface:add(the.instructions)
 
155
 
59
156
              love.mouse.setGrab(true)
60
157
              love.mouse.setVisible(false)
 
158
              love.mouse.setPosition(the.app.width / 2, the.app.height / 2)
61
159
 
62
 
              --self:loadLayers('data/map.lua')
63
160
              self.focus = the.player
64
 
              --self:clampTo(self.map)
65
 
 
66
 
              self.gameStart = love.timer.getTime()
67
161
           end,
68
162
   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
 
163
                 the.bullets:collide(the.planets)
 
164
                 the.bullets:collide(the.player)
 
165
                 the.bullets:collide(the.enemies)
84
166
              end,
 
167
   onEndFrame = function(self)
 
168
                   the.interface.translate.x = the.player.x - the.app.width / 2 + the.player.width / 2
 
169
                   the.interface.translate.y = the.player.y - the.app.height / 2 + the.player.height / 2
 
170
                end,
85
171
   draw = function (self, x, y)
86
172
             View.draw(self, x, y)
87
 
             love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
88
 
          end
 
173
             --love.graphics.print('FPS:' .. love.timer.getFPS(), 20, 20)
 
174
          end,
89
175
}
90
176
 
91
177
MenuScreen = View:extend {
109
195
              math.randomseed(os.time())
110
196
 
111
197
              self.view = GameView:new()
 
198
 
112
199
              if DEBUG then
113
200
                 self.console:watch('VERSION', 'VERSION')
114
201
                 self.console:watch('updateTook', 'the.updateTook')
116
203
                 self.console:watch('the.player.y', 'the.player.y')
117
204
                 self.console:watch('the.app.width', 'the.app.width')
118
205
                 self.console:watch('the.app.height', 'the.app.height')
 
206
                 self.console:watch('num mirrors', '#the.mirrors.sprites')
 
207
                 self.console:watch('num rocks', '#the.rocks.sprites')
 
208
                 self.console:watch('num planets', '#the.planets.sprites')
119
209
                 --self.console:watch('drawTook', 'the.drawTook')
120
210
 
121
211
                 -- back off that dark overlay a bit
123
213
              end
124
214
           end,
125
215
   onUpdate = function (self, dt)
126
 
                 if the.keys:justPressed('escape') then
127
 
                    self.quit()
 
216
                 if not (DEBUG and the.console.visible) then
 
217
                    if the.keys:justPressed('q') then
 
218
                       self.quit()
 
219
                    elseif the.keys:justPressed('return') then
 
220
                       if the.keys:pressed('alt') then
 
221
                          love.graphics.toggleFullscreen()
 
222
                       else
 
223
                          self.view = GameView:new()
 
224
                       end
 
225
                    elseif the.keys:justPressed('f1') then
 
226
                       local ss = love.graphics.newScreenshot()
 
227
                       ss:encode('screenshot-' ..love.timer.getTime()..'.png')
 
228
                    elseif the.keys:justPressed('f11') then
 
229
                       love.graphics.toggleFullscreen()
 
230
                    end
128
231
                 end
129
232
              end,
130
233
   update = function (self, dt)
135
238
               end
136
239
            end
137
240
}
 
241
 
 
242
realRun = love.run
 
243
function love.run()
 
244
   -- should fail silently if it can't go to fullscreen...
 
245
   love.graphics.toggleFullscreen()
 
246
 
 
247
   realRun()
 
248
end
 
 
b'\\ No newline at end of file'