line-em-up 0.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/line-em-up/game_window.rb +189 -52
  3. data/line-em-up/irb_requirements.rb +24 -2
  4. data/line-em-up/lib/config_setting.rb +126 -16
  5. data/line-em-up/lib/difficulty_setting.rb +64 -64
  6. data/line-em-up/lib/lighting.rb +143 -0
  7. data/line-em-up/lib/resolution_setting.rb +58 -58
  8. data/line-em-up/lib/setting.rb +104 -0
  9. data/line-em-up/lib/ship_loadout_setting.rb +476 -0
  10. data/line-em-up/lib/ship_setting.rb +98 -0
  11. data/line-em-up/lib/z_order.rb +1 -1
  12. data/line-em-up/loadout_window.rb +253 -0
  13. data/line-em-up/media/bullet_launcher_hardpoint.png +0 -0
  14. data/line-em-up/media/hardpoint_empty.png +0 -0
  15. data/line-em-up/media/header@2x.psd +0 -0
  16. data/line-em-up/media/laser-end-background-half.png +0 -0
  17. data/line-em-up/media/laser-end-background.png +0 -0
  18. data/line-em-up/media/laser-end-overlay-half.png +0 -0
  19. data/line-em-up/media/laser-end-overlay.png +0 -0
  20. data/line-em-up/media/laser-middle-background-half.png +0 -0
  21. data/line-em-up/media/laser-middle-background.png +0 -0
  22. data/line-em-up/media/laser-middle-overlay-half.png +0 -0
  23. data/line-em-up/media/laser-middle-overlay-short.png +0 -0
  24. data/line-em-up/media/laser-middle-overlay.png +0 -0
  25. data/line-em-up/media/laser-overlay-half.png +0 -0
  26. data/line-em-up/media/laser-overlay.png +0 -0
  27. data/line-em-up/media/laser-start-background-half.png +0 -0
  28. data/line-em-up/media/laser-start-background.png +0 -0
  29. data/line-em-up/media/laser-start-overlay-half.png +0 -0
  30. data/line-em-up/media/laser-start-overlay.png +0 -0
  31. data/line-em-up/media/laser_beam_hardpoint copy.png +0 -0
  32. data/line-em-up/media/laser_beam_hardpoint.png +0 -0
  33. data/line-em-up/media/line-em-up-resolution.png +0 -0
  34. data/line-em-up/media/menu/loadout.png +0 -0
  35. data/line-em-up/media/{start.png → menu/start.png} +0 -0
  36. data/line-em-up/media/missile_launcher.png +0 -0
  37. data/line-em-up/media/{spaceship.png → pilotable_ships/basic_ship/default.png} +0 -0
  38. data/line-em-up/media/{spaceship_original.png → pilotable_ships/basic_ship/large.png} +0 -0
  39. data/line-em-up/media/{spaceship_left.png → pilotable_ships/basic_ship/left.png} +0 -0
  40. data/line-em-up/media/pilotable_ships/basic_ship/left_broadside.png +0 -0
  41. data/line-em-up/media/pilotable_ships/basic_ship/original.png +0 -0
  42. data/line-em-up/media/{spaceship_right.png → pilotable_ships/basic_ship/right.png} +0 -0
  43. data/line-em-up/media/pilotable_ships/basic_ship/right_broadside.png +0 -0
  44. data/line-em-up/media/pilotable_ships/mite_ship/default.png +0 -0
  45. data/line-em-up/media/pilotable_ships/mite_ship/large.png +0 -0
  46. data/line-em-up/media/pilotable_ships/mite_ship/left.png +0 -0
  47. data/line-em-up/media/pilotable_ships/mite_ship/left_broadside.png +0 -0
  48. data/line-em-up/media/pilotable_ships/mite_ship/original.png +0 -0
  49. data/line-em-up/media/pilotable_ships/mite_ship/right.png +0 -0
  50. data/line-em-up/media/pilotable_ships/mite_ship/right_broadside.png +0 -0
  51. data/line-em-up/media/pilotable_ships/mite_ship.zip +0 -0
  52. data/line-em-up/models/basic_ship.rb +94 -0
  53. data/line-em-up/models/bomb.rb +1 -1
  54. data/line-em-up/models/building.rb +2 -2
  55. data/line-em-up/models/bullet.rb +127 -74
  56. data/line-em-up/models/bullet_launcher.rb +23 -0
  57. data/line-em-up/models/cursor.rb +37 -1
  58. data/line-em-up/models/dumb_missile_launcher.rb +40 -0
  59. data/line-em-up/models/dumb_projectile.rb +9 -2
  60. data/line-em-up/models/enemy_bomb.rb +1 -1
  61. data/line-em-up/models/enemy_bullet.rb +55 -0
  62. data/line-em-up/models/enemy_player.rb +1 -1
  63. data/line-em-up/models/execute_open_gl.rb +80 -0
  64. data/line-em-up/models/general_object.rb +82 -9
  65. data/line-em-up/models/gl_background.rb +103 -30
  66. data/line-em-up/models/grappling_hook.rb +1 -1
  67. data/line-em-up/models/hardpoint.rb +120 -0
  68. data/line-em-up/models/laser_launcher.rb +192 -0
  69. data/line-em-up/models/laser_particle.rb +133 -0
  70. data/line-em-up/models/launcher.rb +149 -0
  71. data/line-em-up/models/main.rb +119 -26
  72. data/line-em-up/models/menu.rb +43 -3
  73. data/line-em-up/models/menu_item.rb +25 -14
  74. data/line-em-up/models/missile_boat.rb +5 -4
  75. data/line-em-up/models/mite.rb +3 -2
  76. data/line-em-up/models/mite_ship.rb +61 -0
  77. data/line-em-up/models/mothership.rb +1 -1
  78. data/line-em-up/models/pickup.rb +2 -2
  79. data/line-em-up/models/pilotable_ship.rb +599 -0
  80. data/line-em-up/models/player.rb +207 -150
  81. data/line-em-up/models/projectile.rb +3 -24
  82. data/line-em-up/models/semi_guided_missile.rb +1 -1
  83. data/line-em-up/models/small_explosion.rb +2 -2
  84. data/line-em-up/models/star.rb +7 -2
  85. data/menu_launcher.rb +10 -6
  86. metadata +113 -10
  87. data/line-em-up/media/spaceship_left-test.png +0 -0
@@ -0,0 +1,599 @@
1
+ require_relative 'general_object.rb'
2
+ require_relative 'rocket_launcher_pickup.rb'
3
+ require 'gosu'
4
+
5
+ require 'opengl'
6
+ require 'glut'
7
+
8
+
9
+ include OpenGL
10
+ include GLUT
11
+
12
+ class PilotableShip < GeneralObject
13
+ SHIP_MEDIA_DIRECTORY = "#{MEDIA_DIRECTORY}/pilotable_ships/basic_ship"
14
+ SPEED = 7
15
+ MAX_ATTACK_SPEED = 3.0
16
+ attr_accessor :cooldown_wait, :secondary_cooldown_wait, :attack_speed, :health, :armor, :x, :y, :rockets, :score, :time_alive
17
+
18
+ attr_accessor :bombs, :secondary_weapon, :grapple_hook_cooldown_wait, :damage_reduction, :boost_increase, :damage_increase, :kill_count
19
+ attr_accessor :special_attack, :main_weapon, :drawable_items_near_self
20
+ attr_accessor :right_broadside_mode, :left_broadside_mode, :right_broadside_hard_points, :left_broadside_hard_points, :front_hard_points
21
+ MAX_HEALTH = 200
22
+
23
+ FRONT_HARDPOINT_LOCATIONS = []
24
+ RIGHT_BROADSIDE_HARDPOINT_LOCATIONS = []
25
+ LEFT_BROADSIDE_HARDPOINT_LOCATIONS = []
26
+
27
+ CURRENT_DIRECTORY = File.expand_path('../', __FILE__)
28
+ CONFIG_FILE = "#{CURRENT_DIRECTORY}/../../config.txt"
29
+ def initialize(scale, x, y, screen_width, screen_height, options = {})
30
+ puts "ShIP THOUGHT THAT THIS WAS CONFIG_FILE: #{self.class::CONFIG_FILE}"
31
+ media_path = self.class::SHIP_MEDIA_DIRECTORY
32
+ path = media_path
33
+ # @right_image = self.class.get_right_image(path)
34
+ # @left_image = self.class.get_left_image(path)
35
+ @right_broadside_image = self.class.get_right_broadside_image(path)
36
+ @left_broadside_image = self.class.get_left_broadside_image(path)
37
+ if options[:use_large_image]
38
+ @use_large_image = true
39
+ @image = self.class.get_large_image(path)
40
+ else
41
+ @image = self.class.get_image(path)
42
+ end
43
+ options[:image] = @image
44
+ super(scale, x, y, screen_width, screen_height, options)
45
+ # Top of screen
46
+ @min_moveable_height = options[:min_moveable_height] || 0
47
+ # Bottom of the screen
48
+ @max_movable_height = options[:max_movable_height] || screen_height
49
+ @score = 0
50
+ @cooldown_wait = 0
51
+ @secondary_cooldown_wait = 0
52
+ @grapple_hook_cooldown_wait = 0
53
+ @attack_speed = 3
54
+ # @attack_speed = 3
55
+ @health = 100.0
56
+ @armor = 0
57
+ @rockets = 50
58
+ # @rockets = 250
59
+ @bombs = 3
60
+ @secondary_weapon = RocketLauncherPickup::NAME
61
+ @turn_right = false
62
+ @turn_left = false
63
+
64
+ @hard_point_items = [RocketLauncherPickup::NAME, 'cannon_launcher', 'cannon_launcher', 'bomb_launcher']
65
+ @rocket_launchers = 0
66
+ @bomb_launchers = 0
67
+ @cannon_launchers = 0
68
+ # trigger_hard_point_load
69
+ @damage_reduction = options[:handicap] ? options[:handicap] : 1
70
+ invert_handicap = 1 - @damage_reduction
71
+ @boost_increase = invert_handicap > 0 ? 1 + (invert_handicap * 1.25) : 1
72
+ @damage_increase = invert_handicap > 0 ? 1 + (invert_handicap) : 1
73
+ @kill_count = 0
74
+ @main_weapon = nil
75
+ @drawable_items_near_self = []
76
+ @right_broadside_mode = false
77
+ @left_broadside_mode = false
78
+ @front_hard_points = []
79
+ @left_broadside_hard_points = []
80
+ @right_broadside_hard_points = []
81
+ @hide_hardpoints = options[:hide_hardpoints] || false
82
+
83
+ # Load hardpoints from CONFIG FILE HERE, plug in launcher class !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
84
+
85
+ # get_config_save_settings = [self.class.name]
86
+
87
+ # # ConfigSetting.set_mapped_setting(self.class::CONFIG_FILE, [BasicShip, 'front_hardpoint_locations', 1], 'launcher')
88
+ # ConfigSetting.set_mapped_setting(PilotableShip::CONFIG_FILE, ['BasicShip', 'front_hardpoint_locations', '1'], 'launcher')
89
+ # ConfigSetting.set_mapped_setting(PilotableShip::CONFIG_FILE, ['BasicShip', 'front_hardpoint_locations', '2'], 'launcher')
90
+ # ConfigSetting.set_mapped_setting(PilotableShip::CONFIG_FILE, ['BasicShip', 'front_hardpoint_locations', '3'], 'launcher')
91
+ # ConfigSetting.get_mapped_setting(PilotableShip::CONFIG_FILE, ['BasicShip', 'front_hardpoint_locations', '1'])
92
+
93
+ self.class::FRONT_HARDPOINT_LOCATIONS.each_with_index do |location, index|
94
+ item_klass = ConfigSetting.get_mapped_setting(self.class::CONFIG_FILE, [self.class.name, 'front_hardpoint_locations', index.to_s])
95
+ item_klass = eval(item_klass) if item_klass
96
+ @front_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), item_klass, location[:slot_type], options)
97
+ # @front_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), nil, options)
98
+ end
99
+ # puts "Front hard points"
100
+ self.class::RIGHT_BROADSIDE_HARDPOINT_LOCATIONS.each_with_index do |location,index|
101
+ # if index < 2
102
+ item_klass = ConfigSetting.get_mapped_setting(self.class::CONFIG_FILE, [self.class.name, 'right_hardpoint_locations', index.to_s])
103
+ item_klass = eval(item_klass) if item_klass
104
+ options[:image_angle] = 90
105
+ # @right_broadside_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), LaserLauncher, options)
106
+ @right_broadside_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), item_klass, location[:slot_type], options)
107
+ # else
108
+ # @right_broadside_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), LaserLauncher, options)
109
+ # end
110
+ end
111
+ self.class::LEFT_BROADSIDE_HARDPOINT_LOCATIONS.each_with_index do |location,index|
112
+ # @broadside_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), LaserLauncher, options)
113
+ item_klass = ConfigSetting.get_mapped_setting(self.class::CONFIG_FILE, [self.class.name, 'left_hardpoint_locations', index.to_s])
114
+ item_klass = eval(item_klass) if item_klass
115
+ options[:image_angle] = 270
116
+ @left_broadside_hard_points << Hardpoint.new(scale, x, y, screen_width, screen_height, 1, location[:x_offset].call(get_image, @scale), location[:y_offset].call(get_image, @scale), item_klass, location[:slot_type], options)
117
+ end
118
+
119
+ end
120
+
121
+ # right broadside
122
+ def rotate_hardpoints_counterclockwise
123
+ puts "RIGHT HERE: rotate_hardpoints_counterclockwise"
124
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
125
+ group.each do |hp|
126
+ hp.image_angle = (hp.image_angle || 0) - 90
127
+ hp_y_offset = hp.y_offset
128
+ hp_x_offset = hp.x_offset
129
+ hp.y_offset = hp_x_offset * -1
130
+ hp.x_offset = hp_y_offset
131
+ end
132
+ end
133
+ end
134
+
135
+ # left broadside
136
+ def rotate_hardpoints_clockwise
137
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
138
+ group.each do |hp|
139
+ hp.image_angle = (hp.image_angle || 0) + 90
140
+ hp_y_offset = hp.y_offset
141
+ hp_x_offset = hp.x_offset
142
+ hp.y_offset = hp_x_offset
143
+ hp.x_offset = hp_y_offset * -1
144
+ end
145
+ end
146
+ end
147
+
148
+ # def toggle_hardpoint_broadside
149
+ # if @right_broadside_mode
150
+ # @broadside_hard_points.each do |hp|
151
+ # hp_y_offset = hp.y_offset
152
+ # hp_x_offset = hp.x_offset
153
+ # hp.y_offset = hp_x_offset * -1
154
+ # hp.x_offset = hp_y_offset
155
+ # end
156
+ # @front_hard_points.each do |hp|
157
+ # hp_y_offset = hp.y_offset
158
+ # hp_x_offset = hp.x_offset
159
+ # hp.y_offset = hp_x_offset * -1
160
+ # hp.x_offset = hp_y_offset
161
+ # end
162
+ # elsif @left_broadside_mode
163
+
164
+ # else
165
+ # @broadside_hard_points.each do |hp|
166
+ # hp_y_offset = hp.y_offset
167
+ # hp_x_offset = hp.x_offset
168
+ # hp.y_offset = hp_x_offset
169
+ # hp.x_offset = hp_y_offset * -1
170
+ # end
171
+ # @front_hard_points.each do |hp|
172
+ # hp_y_offset = hp.y_offset
173
+ # hp_x_offset = hp.x_offset
174
+ # hp.y_offset = hp_x_offset
175
+ # hp.x_offset = hp_y_offset * -1
176
+ # end
177
+ # end
178
+ # end
179
+
180
+
181
+ def add_hard_point hard_point
182
+ # @hard_point_items << hard_point
183
+ # trigger_hard_point_load
184
+ end
185
+
186
+ def self.get_image_assets_path
187
+ SHIP_MEDIA_DIRECTORY
188
+ end
189
+
190
+ def self.get_right_broadside_image path
191
+ Gosu::Image.new("#{path}/right_broadside.png")
192
+ end
193
+ def self.get_left_broadside_image path
194
+ Gosu::Image.new("#{path}/left_broadside.png")
195
+ end
196
+ def self.get_image path
197
+ Gosu::Image.new("#{path}/default.png")
198
+ end
199
+
200
+ def self.get_large_image path
201
+ Gosu::Image.new("#{path}/large.png")
202
+ end
203
+
204
+ # def self.get_right_image path
205
+ # Gosu::Image.new("#{path}/right.png")
206
+ # end
207
+
208
+ # def self.get_left_image path
209
+ # Gosu::Image.new("#{path}/left.png")
210
+ # end
211
+ def self.get_image_path path
212
+ "#{path}/default.png"
213
+ end
214
+
215
+ def get_image
216
+ # puts "GET IMAGE"
217
+ if @right_broadside_mode
218
+ return @right_broadside_image
219
+ elsif @left_broadside_mode
220
+ return @left_broadside_image
221
+ else
222
+ # puts "DEFAULT"
223
+ # puts @image
224
+ return @image
225
+ end
226
+ end
227
+
228
+ def get_image_path path
229
+ "#{path}/default.png"
230
+ end
231
+
232
+
233
+ #slow scrolling speed here
234
+ # Show right broadside
235
+ def rotate_counterclockwise
236
+ # puts "rotate_counterclockwise"
237
+ # puts "PRE-right_broadside_mode: #{@right_broadside_mode}"
238
+ # puts "PRE-left_broadside_mode: #{@left_broadside_mode}"
239
+ trigger_rotation = false
240
+ if @right_broadside_mode
241
+ # Do nothing
242
+ elsif @left_broadside_mode
243
+ trigger_rotation = true
244
+ @left_broadside_mode = false
245
+ else
246
+ trigger_rotation = true
247
+ @right_broadside_mode = true
248
+ end
249
+ # puts "POST-right_broadside_mode: #{@right_broadside_mode}"
250
+ # puts "POST-left_broadside_mode: #{@left_broadside_mode}"
251
+
252
+
253
+ # @right_broadside_mode = !@right_broadside_mode
254
+ if @right_broadside_mode
255
+ @image_width_half = (@right_broadside_image.width * @scale) / 2
256
+ @image_height_half = (@right_broadside_image.height * @scale) / 2
257
+ elsif @left_broadside_mode
258
+ @image_width_half = (@left_broadside_image.width * @scale) / 2
259
+ @image_height_half = (@left_broadside_image.height * @scale) / 2
260
+ else
261
+ @image_width_half = (@image.width * @scale) / 2
262
+ @image_height_half = (@image.height * @scale) / 2
263
+ end
264
+
265
+ rotate_hardpoints_counterclockwise if trigger_rotation
266
+ # puts "IMAGE SHOULD ROTATE: IS DEFAULT #{!(@right_broadside_mode && @left_broadside_mode)}" if trigger_rotation
267
+ # @image = self.get_image if trigger_rotation
268
+
269
+ if @right_broadside_mode
270
+ return 1
271
+ elsif @left_broadside_mode
272
+ # Logically, this would never be true
273
+ return 1
274
+ else
275
+ return 1
276
+ end
277
+ end
278
+ # Show right broadside
279
+ def rotate_clockwise
280
+ trigger_rotation = false
281
+ if @left_broadside_mode
282
+ # Do nothing
283
+ elsif @right_broadside_mode
284
+ trigger_rotation = true
285
+ @right_broadside_mode = false
286
+ else
287
+ trigger_rotation = true
288
+ @left_broadside_mode = true
289
+ end
290
+
291
+ # @right_broadside_mode = !@right_broadside_mode
292
+ if @right_broadside_mode
293
+ # Logically, this would never be true
294
+ @image_width_half = (@right_broadside_image.width * @scale) / 2
295
+ @image_height_half = (@right_broadside_image.height * @scale) / 2
296
+ elsif @left_broadside_mode
297
+ @image_width_half = (@left_broadside_image.width * @scale) / 2
298
+ @image_height_half = (@left_broadside_image.height * @scale) / 2
299
+ else
300
+ @image_width_half = (@image.width * @scale) / 2
301
+ @image_height_half = (@image.height * @scale) / 2
302
+ end
303
+
304
+ rotate_hardpoints_clockwise if trigger_rotation
305
+ # @image = self.get_image if trigger_rotation
306
+
307
+ if @right_broadside_mode
308
+ # Logically, this would never be true
309
+ return 1
310
+ elsif @left_broadside_mode
311
+ return 1
312
+ else
313
+ return 1
314
+ end
315
+ end
316
+
317
+
318
+
319
+ def take_damage damage
320
+ @health -= damage * @damage_reduction
321
+ end
322
+
323
+
324
+ def decrement_secondary_ammo_count count = 1
325
+ return case @secondary_weapon
326
+ when 'bomb'
327
+ self.bombs -= count
328
+ else
329
+ self.rockets -= count
330
+ end
331
+ end
332
+
333
+ def get_secondary_name
334
+ return case @secondary_weapon
335
+ when 'bomb'
336
+ 'Bomb'
337
+ else
338
+ 'Rocket'
339
+ end
340
+ end
341
+
342
+ def get_x
343
+ @x
344
+ end
345
+ def get_y
346
+ @y
347
+ end
348
+
349
+ def is_alive
350
+ health > 0
351
+ end
352
+
353
+ def get_speed
354
+ if @left_broadside_mode || @right_broadside_mode
355
+ speed = self.class::SPEED * 0.3
356
+ else
357
+ speed = self.class::SPEED
358
+ end
359
+ (speed * @scale).round
360
+ end
361
+
362
+ def move_left
363
+ @turn_left = true
364
+ @x = [@x - get_speed, (get_width/3)].max
365
+
366
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
367
+ group.each do |hp|
368
+ hp.x = @x + hp.x_offset
369
+ end
370
+ end
371
+ return @x
372
+ end
373
+
374
+ def move_right
375
+ @turn_right = true
376
+ @x = [@x + get_speed, (@screen_width - (get_width/3))].min
377
+
378
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
379
+ group.each do |hp|
380
+ hp.x = @x + hp.x_offset
381
+ end
382
+ end
383
+ return @x
384
+ end
385
+
386
+ def accelerate
387
+ # # Top of screen
388
+ # @min_moveable_height = options[:min_moveable_height] || 0
389
+ # # Bottom of the screen
390
+ # @max_movable_height = options[:max_movable_height] || screen_height
391
+
392
+ @y = [@y - get_speed, @min_moveable_height + (get_height/2)].max
393
+
394
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
395
+ group.each do |hp|
396
+ hp.y = @y + hp.y_offset
397
+ end
398
+ end
399
+ return @y
400
+ end
401
+
402
+ def brake
403
+ @y = [@y + get_speed, @max_movable_height - (get_height/2)].min
404
+
405
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
406
+ group.each do |hp|
407
+ hp.y = @y + hp.y_offset
408
+ end
409
+ end
410
+ return @y
411
+ end
412
+
413
+ def attack_group pointer, group
414
+ if @left_broadside_mode
415
+ # puts "@broadside_hard_points: #{@broadside_hard_points}"
416
+ results = @left_broadside_hard_points.collect do |hp|
417
+ # puts "HP #{hp}"
418
+ hp.attack(pointer) if hp.group_number == group
419
+ end
420
+ # puts "Results :#{results}"
421
+ elsif @right_broadside_mode
422
+ results = @right_broadside_hard_points.collect do |hp|
423
+ # puts "HP #{hp}"
424
+ hp.attack(pointer) if hp.group_number == group
425
+ end
426
+ else
427
+ # puts "@front_hard_points: #{@front_hard_points}"
428
+ results = @front_hard_points.collect do |hp|
429
+ # puts "HP #{hp}"
430
+ hp.attack(pointer) if hp.group_number == group
431
+ end
432
+ end
433
+ results.reject!{|v| v.nil?}
434
+ # puts "Results: #{results}"
435
+ return results
436
+ end
437
+
438
+ def deactivate_group group_number
439
+ # puts "deactivate_group: #{group_number}"
440
+ [@right_broadside_hard_points, @left_broadside_hard_points, @front_hard_points].each do |group|
441
+ group.each do |hp|
442
+ # puts "STOPPING ATTACK #{hp.group_number} == #{group_number}: #{hp.group_number == group_number}"
443
+ hp.stop_attack if hp.group_number == group_number
444
+ end
445
+ end
446
+ end
447
+
448
+ def attack_group_1 pointer
449
+ return attack_group(pointer, 1)
450
+ end
451
+
452
+ def attack_group_2 pointer
453
+ return attack_group(pointer, 2)
454
+ end
455
+
456
+ def deactivate_group_1
457
+ deactivate_group(1)
458
+ end
459
+
460
+ def deactivate_group_2
461
+ deactivate_group(2)
462
+ end
463
+
464
+ def get_draw_ordering
465
+ ZOrder::Ship
466
+ end
467
+
468
+ def draw
469
+ @drawable_items_near_self.reject! { |item| item.draw }
470
+ # puts "DRAWING HARDPOINTS"
471
+ # puts "@right_broadside_hard_points: #{@right_broadside_hard_points.count}"
472
+ if !@hide_hardpoints
473
+ @right_broadside_hard_points.each { |item| item.draw }
474
+ @left_broadside_hard_points.each { |item| item.draw }
475
+ @front_hard_points.each { |item| item.draw }
476
+ end
477
+
478
+ # test = Ashton::ParticleEmitter.new(@x, @y, get_draw_ordering)
479
+ # test.draw
480
+ # test.update(5.0)
481
+ # image = self.get_image
482
+ # Why using self?
483
+ image = self.get_image
484
+ # if @broadside_mode
485
+ # image = @broadside_image
486
+ # else
487
+ # if @turn_right
488
+ # image = @right_image
489
+ # elsif @turn_left
490
+ # image = @left_image
491
+ # else
492
+ # image = @image
493
+ # end
494
+ # end
495
+ # super
496
+ # puts "DRAWING PLAYER: image_height_half: #{@image_height_half} and image_width_half: #{@image_width_half}"
497
+ image.draw(@x - @image_width_half, @y - @image_height_half, get_draw_ordering, @scale, @scale)
498
+ @turn_right = false
499
+ @turn_left = false
500
+ end
501
+
502
+ POINTS_X = 7
503
+ POINTS_Y = 7
504
+
505
+ def draw_gl_list
506
+ @drawable_items_near_self + [self]
507
+ end
508
+
509
+ def draw_gl
510
+ # draw gl stuff
511
+ @drawable_items_near_self.each {|item| item.draw_gl }
512
+
513
+ @left_broadside_hard_points.each { |item| item.draw_gl }
514
+ @right_broadside_hard_points.each { |item| item.draw_gl }
515
+ @front_hard_points.each { |item| item.draw_gl }
516
+
517
+ info = @image.gl_tex_info
518
+
519
+ # glDepthFunc(GL_GEQUAL)
520
+ # glEnable(GL_DEPTH_TEST)
521
+ # glEnable(GL_BLEND)
522
+
523
+ # glMatrixMode(GL_PROJECTION)
524
+ # glLoadIdentity
525
+ # perspective matrix
526
+ # glFrustum(-0.10, 0.10, -0.075, 0.075, 1, 100)
527
+
528
+ # glMatrixMode(GL_MODELVIEW)
529
+ # glLoadIdentity
530
+ # glTranslated(0, 0, -4)
531
+
532
+ z = get_draw_ordering
533
+
534
+ # offs_y = 1.0 * @scrolls / SCROLLS_PER_STEP
535
+ # offs_y = 1
536
+ new_width1, new_height1, increment_x, increment_y = Player.convert_x_and_y_to_opengl_coords(@x - @image_width_half/2, @y - @image_height_half/2, @screen_width, @screen_height)
537
+ new_width2, new_height2, increment_x, increment_y = Player.convert_x_and_y_to_opengl_coords(@x - @image_width_half/2, @y + @image_height_half/2, @screen_width, @screen_height)
538
+ new_width3, new_height3, increment_x, increment_y = Player.convert_x_and_y_to_opengl_coords(@x + @image_width_half/2, @y - @image_height_half/2, @screen_width, @screen_height)
539
+ new_width4, new_height4, increment_x, increment_y = Player.convert_x_and_y_to_opengl_coords(@x + @image_width_half/2, @y + @image_height_half/2, @screen_width, @screen_height)
540
+
541
+ glEnable(GL_TEXTURE_2D)
542
+ glBindTexture(GL_TEXTURE_2D, info.tex_name)
543
+
544
+ glBegin(GL_TRIANGLE_STRIP)
545
+ # glColor4d(1, 1, 1, get_draw_ordering)
546
+ glTexCoord2d(info.left, info.top)
547
+ # glVertex3f(new_width1, new_height1, z)
548
+
549
+ # glColor4d(1, 1, 1, get_draw_ordering)
550
+ glTexCoord2d(info.left, info.bottom)
551
+ # glVertex3f(new_width2, new_height2, z)
552
+
553
+ # glColor4d(1, 1, 1, get_draw_ordering)
554
+ glTexCoord2d(info.right, info.top)
555
+ # glVertex3f(new_width3, new_height3, z)
556
+
557
+ # glColor4d(1, 1, 1, get_draw_ordering)
558
+ glTexCoord2d(info.right, info.bottom)
559
+ # glVertex3f(new_width4, new_height4, z)
560
+ glEnd
561
+ end
562
+
563
+ def update mouse_x = nil, mouse_y = nil, player = nil, scroll_factor = 1
564
+ # Update list of weapons for special cases like beans. Could iterate though an association in the future.
565
+ # @main_weapon.update(mouse_x, mouse_y, player) if @main_weapon
566
+ @front_hard_points.each do |hardpoint|
567
+ hardpoint.update(mouse_x, mouse_y, self, scroll_factor)
568
+ end
569
+ @left_broadside_hard_points.each do |hardpoint|
570
+ hardpoint.update(mouse_x, mouse_y, self, scroll_factor)
571
+ end
572
+ @right_broadside_hard_points.each do |hardpoint|
573
+ hardpoint.update(mouse_x, mouse_y, self, scroll_factor)
574
+ end
575
+
576
+ # @cooldown_wait -= 1 if @cooldown_wait > 0
577
+ # @secondary_cooldown_wait -= 1 if @secondary_cooldown_wait > 0
578
+ # @grapple_hook_cooldown_wait -= 1 if @grapple_hook_cooldown_wait > 0
579
+ # @time_alive += 1 if self.is_alive
580
+ end
581
+
582
+ def collect_pickups(pickups)
583
+ pickups.reject! do |pickup|
584
+ if Gosu.distance(@x, @y, pickup.x, pickup.y) < ((self.get_radius) + (pickup.get_radius)) * 1.2 && pickup.respond_to?(:collected_by_player)
585
+ pickup.collected_by_player(self)
586
+ if pickup.respond_to?(:get_points)
587
+ self.score += pickup.get_points
588
+ end
589
+ # stop that!
590
+ # @beep.play
591
+ true
592
+ else
593
+ false
594
+ end
595
+ end
596
+ end
597
+
598
+
599
+ end