line-em-up 0.3.6 → 0.4.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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/line-em-up/game_window.rb +38 -10
  3. data/line-em-up/lib/resolution_setting.rb +0 -1
  4. data/line-em-up/lib/z_order.rb +1 -1
  5. data/line-em-up/media/back_to_menu.png +0 -0
  6. data/line-em-up/media/laserbolt.png +0 -0
  7. data/line-em-up/media/mite.png +0 -0
  8. data/line-em-up/media/mite_original.png +0 -0
  9. data/line-em-up/media/progress_bar_0.png +0 -0
  10. data/line-em-up/media/progress_bar_1.png +0 -0
  11. data/line-em-up/media/progress_bar_10.png +0 -0
  12. data/line-em-up/media/progress_bar_11.png +0 -0
  13. data/line-em-up/media/progress_bar_12.png +0 -0
  14. data/line-em-up/media/progress_bar_13.png +0 -0
  15. data/line-em-up/media/progress_bar_14.png +0 -0
  16. data/line-em-up/media/progress_bar_15.png +0 -0
  17. data/line-em-up/media/progress_bar_16.png +0 -0
  18. data/line-em-up/media/progress_bar_17.png +0 -0
  19. data/line-em-up/media/progress_bar_18.png +0 -0
  20. data/line-em-up/media/progress_bar_19.png +0 -0
  21. data/line-em-up/media/progress_bar_2.png +0 -0
  22. data/line-em-up/media/progress_bar_20.png +0 -0
  23. data/line-em-up/media/progress_bar_3.png +0 -0
  24. data/line-em-up/media/progress_bar_4.png +0 -0
  25. data/line-em-up/media/progress_bar_5.png +0 -0
  26. data/line-em-up/media/progress_bar_6.png +0 -0
  27. data/line-em-up/media/progress_bar_7.png +0 -0
  28. data/line-em-up/media/progress_bar_8.png +0 -0
  29. data/line-em-up/media/progress_bar_9.png +0 -0
  30. data/line-em-up/media/rocket_launcher.png +0 -0
  31. data/line-em-up/media/rocket_launcher_original.png +0 -0
  32. data/line-em-up/media/tiny_missile.png +0 -0
  33. data/line-em-up/models/bomb_pack.rb +2 -1
  34. data/line-em-up/models/bullet.rb +86 -3
  35. data/line-em-up/models/bullet_open_gl_backup.rb +69 -0
  36. data/line-em-up/models/dumb_projectile.rb +2 -1
  37. data/line-em-up/models/enemy_bullet.rb +4 -3
  38. data/line-em-up/models/enemy_player.rb +1 -1
  39. data/line-em-up/models/footer_bar.rb +34 -1
  40. data/line-em-up/models/general_object.rb +2 -0
  41. data/line-em-up/models/health_pack.rb +5 -3
  42. data/line-em-up/models/horizontal_swarm.rb +123 -0
  43. data/line-em-up/models/main.rb +92 -0
  44. data/line-em-up/models/missile.rb +52 -5
  45. data/line-em-up/models/missile_boat.rb +9 -3
  46. data/line-em-up/models/missile_pack.rb +6 -1
  47. data/line-em-up/models/mite.rb +104 -0
  48. data/line-em-up/models/mothership.rb +4 -4
  49. data/line-em-up/models/player.rb +126 -40
  50. data/line-em-up/models/projectile.rb +28 -13
  51. data/line-em-up/models/rocket_launcher_pickup.rb +26 -0
  52. data/line-em-up/models/{enemy_homing_missile.rb → semi_guided_missile.rb} +13 -5
  53. data/line-em-up/models/small_explosion.rb +18 -6
  54. data/line-em-up/models/star.rb +7 -3
  55. data/menu_launcher.rb +1 -95
  56. metadata +35 -3
  57. data/line-em-up/media/bomb_original copy.png +0 -0
@@ -1,23 +1,84 @@
1
1
  require_relative 'general_object.rb'
2
+ require_relative 'rocket_launcher_pickup.rb'
2
3
 
3
4
  class Player < GeneralObject
4
5
  SPEED = 7
5
6
  MAX_ATTACK_SPEED = 3.0
6
- attr_accessor :cooldown_wait, :secondary_cooldown_wait, :attack_speed, :health, :armor, :x, :y, :rockets, :score, :time_alive, :bombs, :secondary_weapon, :grapple_hook_cooldown_wait
7
+ attr_accessor :cooldown_wait, :secondary_cooldown_wait, :attack_speed, :health, :armor, :x, :y, :rockets, :score, :time_alive
8
+
9
+ attr_accessor :bombs, :secondary_weapon, :grapple_hook_cooldown_wait, :damage_reduction, :boost_increase, :damage_increase, :kill_count
10
+ attr_accessor :special_attack
7
11
  MAX_HEALTH = 200
8
12
 
9
- SECONDARY_WEAPONS = %w[missile bomb]
13
+ SECONDARY_WEAPONS = [RocketLauncherPickup::NAME] + %w[bomb]
10
14
  # Range goes clockwise around the 0-360 angle
11
15
  MISSILE_LAUNCHER_MIN_ANGLE = 75
12
16
  MISSILE_LAUNCHER_MAX_ANGLE = 105
13
17
  MISSILE_LAUNCHER_INIT_ANGLE = 90
14
18
 
19
+ SPECIAL_POWER = 'laser'
20
+ SPECIAL_POWER_KILL_MAX = 50
21
+
22
+ def get_kill_count_max
23
+ self.class::SPECIAL_POWER_KILL_MAX
24
+ end
25
+
26
+ def ready_for_special?
27
+ @kill_count >= get_kill_count_max
28
+ end
29
+
30
+ def special_attack
31
+ # Fire special attack.
32
+ @kill_count = 0
33
+ end
34
+
35
+ # Rocket Launcher, Rocket launcher, Cannon, Cannon, Bomb Launcher
36
+ HARD_POINTS = 12
37
+
38
+ def add_kill_count kill_count
39
+ if @kill_count + kill_count > get_kill_count_max
40
+ @kill_count = get_kill_count_max
41
+ else
42
+ @kill_count += kill_count
43
+ end
44
+ end
45
+
46
+ def add_hard_point hard_point
47
+ @hard_point_items << hard_point
48
+ trigger_hard_point_load
49
+ end
50
+
51
+ def trigger_hard_point_load
52
+ @rocket_launchers, @bomb_launchers, @cannon_launchers = [0, 0, 0]
53
+ count = 0
54
+ # puts "RUNNING ON: #{@hard_point_items}"
55
+ @hard_point_items.each do |hard_point|
56
+ break if count == HARD_POINTS
57
+ case hard_point
58
+ when 'bomb_launcher'
59
+ @bomb_launchers += 1
60
+ when RocketLauncherPickup::NAME
61
+ # puts "INCREASTING ROCKET LAUNCHER: #{RocketLauncherPickup::NAME}"
62
+ @rocket_launchers += 1
63
+ when 'cannon_launcher'
64
+ @cannon_launchers += 1
65
+ else
66
+ "Raise should never get here. hard_point: #{hard_point}"
67
+ end
68
+ count += 1
69
+ end
70
+ end
71
+
15
72
  def get_image
16
73
  Gosu::Image.new("#{MEDIA_DIRECTORY}/spaceship.png")
17
74
  end
18
75
 
19
76
  def initialize(scale, x, y, screen_width, screen_height, options = {})
20
77
  super(scale, x, y, screen_width, screen_height, options)
78
+ # Top of screen
79
+ @min_moveable_height = options[:min_moveable_height] || 0
80
+ # Bottom of the screen
81
+ @max_movable_height = options[:max_movable_height] || screen_height
21
82
  @right_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/spaceship_right.png")
22
83
  @left_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/spaceship_left.png")
23
84
  @score = 0
@@ -25,19 +86,31 @@ class Player < GeneralObject
25
86
  @secondary_cooldown_wait = 0
26
87
  @grapple_hook_cooldown_wait = 0
27
88
  @attack_speed = 1
28
- @health = 100
89
+ # @attack_speed = 3
90
+ @health = 100.0
29
91
  @armor = 0
30
- @rockets = 25
92
+ @rockets = 50
31
93
  # @rockets = 250
32
94
  @bombs = 3
33
- @secondary_weapon = "missile"
95
+ @secondary_weapon = RocketLauncherPickup::NAME
34
96
  @turn_right = false
35
97
  @turn_left = false
98
+
99
+ @hard_point_items = [RocketLauncherPickup::NAME, 'cannon_launcher', 'cannon_launcher', 'bomb_launcher']
100
+ @rocket_launchers = 0
101
+ @bomb_launchers = 0
102
+ @cannon_launchers = 0
103
+ trigger_hard_point_load
104
+ @damage_reduction = options[:handicap] ? options[:handicap] : 1
105
+ invert_handicap = 1 - options[:handicap]
106
+ @boost_increase = invert_handicap > 0 ? 1 + (invert_handicap * 1.25) : 1
107
+ @damage_increase = invert_handicap > 0 ? 1 + (invert_handicap) : 1
108
+ @kill_count = 0
36
109
  end
37
110
 
38
111
 
39
112
  def take_damage damage
40
- @health -= damage
113
+ @health -= damage * @damage_reduction
41
114
  end
42
115
 
43
116
  def toggle_secondary
@@ -59,12 +132,12 @@ class Player < GeneralObject
59
132
  end
60
133
 
61
134
 
62
- def decrement_secondary_ammo_count
135
+ def decrement_secondary_ammo_count count = 1
63
136
  return case @secondary_weapon
64
137
  when 'bomb'
65
- self.bombs -= 1
138
+ self.bombs -= count
66
139
  else
67
- self.rockets -= 1
140
+ self.rockets -= count
68
141
  end
69
142
  end
70
143
 
@@ -103,19 +176,24 @@ class Player < GeneralObject
103
176
  end
104
177
 
105
178
  def accelerate
106
- @y = [@y - get_speed, (get_height/2)].max
179
+ # # Top of screen
180
+ # @min_moveable_height = options[:min_moveable_height] || 0
181
+ # # Bottom of the screen
182
+ # @max_movable_height = options[:max_movable_height] || screen_height
183
+
184
+ @y = [@y - get_speed, @min_moveable_height + (get_height/2)].max
107
185
  end
108
186
 
109
187
  def brake
110
- @y = [@y + get_speed, @screen_height].min
188
+ @y = [@y + get_speed, @max_movable_height - (get_height/2)].min
111
189
  end
112
190
 
113
191
 
114
192
  def attack pointer
115
193
  return {
116
194
  projectiles: [
117
- Bullet.new(@scale, @screen_width, @screen_height, self, {side: 'left', relative_object: self}),
118
- Bullet.new(@scale, @screen_width, @screen_height, self, {side: 'right', relative_object: self})
195
+ Bullet.new(@scale, @screen_width, @screen_height, self, {side: 'left', damage_increase: @damage_increase}),
196
+ Bullet.new(@scale, @screen_width, @screen_height, self, {side: 'right', damage_increase: @damage_increase})
119
197
  ],
120
198
  cooldown: Bullet::COOLDOWN_DELAY
121
199
  }
@@ -130,7 +208,6 @@ class Player < GeneralObject
130
208
  self.secondary_cooldown_wait = cooldown.to_f.fdiv(self.attack_speed)
131
209
 
132
210
  projectiles.each do |projectile|
133
- self.decrement_secondary_ammo_count
134
211
  return_projectiles.push(projectile)
135
212
  end
136
213
  end
@@ -146,35 +223,44 @@ class Player < GeneralObject
146
223
  # end
147
224
 
148
225
  def secondary_attack pointer
149
- second_weapon = case @secondary_weapon
226
+ projectiles = []
227
+ cooldown = 0
228
+ case @secondary_weapon
150
229
  when 'bomb'
151
- {
152
- projectiles: [Bomb.new(@scale, @screen_width, @screen_height, self, pointer.x, pointer.y)],
153
- cooldown: Bomb::COOLDOWN_DELAY
154
- }
155
- else
156
- if get_secondary_ammo_count > 1
157
- {
158
- projectiles: [
159
- Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', relative_object: self}),
160
- Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', relative_object: self})
161
- ],
162
- cooldown: Missile::COOLDOWN_DELAY
163
- }
164
- # {
165
- # projectiles: [
166
- # Missile.new(@scale, @screen_width, @screen_height, self, mouse_x, mouse_y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE)
167
- # ],
168
- # cooldown: Missile::COOLDOWN_DELAY
169
- # }
170
- else get_secondary_ammo_count == 1
171
- {
172
- projectiles: [Missile.new(@scale, @screen_width, @screen_height, self, pointer.x, pointer.y, {relative_object: self})],
173
- cooldown: Missile::COOLDOWN_DELAY
174
- }
230
+ projectiles << Bomb.new(@scale, @screen_width, @screen_height, self, pointer.x, pointer.y, nil, nil, nil, {damage_increase: @damage_increase})
231
+ cooldown = Bomb::COOLDOWN_DELAY
232
+ when RocketLauncherPickup::NAME
233
+ # NEEED TO DECRETMENT AMMO BASED OFF OF LAUNCHERS!!!!!!!!!!!
234
+ # puts "ROCKET LAUNCHERS: #{@rocket_launchers}"
235
+ cooldown = Missile::COOLDOWN_DELAY
236
+ if get_secondary_ammo_count == 1 && @rocket_launchers > 0 || @rocket_launchers == 1
237
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {damage_increase: @damage_increase})
238
+ elsif get_secondary_ammo_count == 2 && @rocket_launchers >= 2 || @rocket_launchers == 2
239
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', damage_increase: @damage_increase})
240
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', damage_increase: @damage_increase})
241
+ elsif get_secondary_ammo_count == 3 && @rocket_launchers >= 3 || @rocket_launchers == 3
242
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {damage_increase: @damage_increase})
243
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', damage_increase: @damage_increase})
244
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', damage_increase: @damage_increase})
245
+ elsif get_secondary_ammo_count == 4 && @rocket_launchers >= 4 || @rocket_launchers == 4
246
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE + 15, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', damage_increase: @damage_increase})
247
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE - 15, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', damage_increase: @damage_increase})
248
+
249
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half / 2, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE + 5, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', damage_increase: @damage_increase, relative_x_padding: (@image_width_half / 2) })
250
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half / 2, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE - 5, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', damage_increase: @damage_increase, relative_x_padding: -(@image_width_half / 2) })
251
+ elsif get_secondary_ammo_count == 5 && @rocket_launchers >= 5 || @rocket_launchers >= 5
252
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {damage_increase: @damage_increase})
253
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE + 15, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', damage_increase: @damage_increase})
254
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE - 15, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', damage_increase: @damage_increase})
255
+
256
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x - @image_width_half / 2, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE + 5, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'left', damage_increase: @damage_increase, relative_x_padding: (@image_width_half / 2) })
257
+ projectiles << Missile.new(@scale, @screen_width, @screen_height, self, pointer.x + @image_width_half / 2, pointer.y, MISSILE_LAUNCHER_MIN_ANGLE - 5, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {side: 'right', damage_increase: @damage_increase, relative_x_padding: -(@image_width_half / 2) })
258
+ else
259
+ raise "Should never get here: @secondary_weapon: #{@secondary_weapon} for @rocket_launchers: #{@rocket_launchers} and get_secondary_ammo_count: #{get_secondary_ammo_count}"
175
260
  end
176
261
  end
177
- return second_weapon
262
+ decrement_secondary_ammo_count projectiles.count
263
+ return {projectiles: projectiles, cooldown: cooldown}
178
264
  end
179
265
 
180
266
  def get_draw_ordering
@@ -19,6 +19,11 @@ class Projectile < GeneralObject
19
19
  end
20
20
 
21
21
  def initialize(scale, screen_width, screen_height, object, end_point_x, end_point_y, angle_min = nil, angle_max = nil, angle_init = nil, options = {})
22
+ if options[:x_homing_padding]
23
+ end_point_x = end_point_x + options[:x_homing_padding]
24
+ end
25
+ @damage_increase = options[:damage_increase] || 1
26
+ @custom_initial_delay = options[:custom_initial_delay] if options[:custom_initial_delay]
22
27
  options[:relative_object] = object
23
28
  super(scale, nil, nil, screen_width, screen_height, options)
24
29
 
@@ -94,26 +99,26 @@ class Projectile < GeneralObject
94
99
 
95
100
 
96
101
  new_speed = 0
97
- if @time_alive > self.class.get_initial_delay
102
+ if @time_alive > (@custom_initial_delay || self.class.get_initial_delay)
98
103
  new_speed = self.class.get_starting_speed + (self.class.get_speed_increase_factor > 0 ? @time_alive * self.class.get_speed_increase_factor : 0)
99
104
  new_speed = self.class.get_max_speed if new_speed > self.class.get_max_speed
100
105
  new_speed = new_speed * @scale
101
- end
102
106
 
103
107
 
104
108
 
105
- vx = 0
106
- vy = 0
107
- if new_speed != 0
108
- vx = ((new_speed / 3) * 1) * Math.cos(@angle * Math::PI / 180)
109
+ vx = 0
110
+ vy = 0
111
+ if new_speed != 0
112
+ vx = ((new_speed / 3) * 1) * Math.cos(@angle * Math::PI / 180)
109
113
 
110
- vy = ((new_speed / 3) * 1) * Math.sin(@angle * Math::PI / 180)
111
- vy = vy * -1
112
- end
114
+ vy = ((new_speed / 3) * 1) * Math.sin(@angle * Math::PI / 180)
115
+ vy = vy * -1
116
+ end
113
117
 
114
- @x = @x + vx
115
- @y = @y + vy
118
+ @x = @x + vx
119
+ @y = @y + vy
116
120
 
121
+ end
117
122
  super(mouse_x, mouse_y)
118
123
  end
119
124
 
@@ -165,7 +170,7 @@ class Projectile < GeneralObject
165
170
  # hit_object = true
166
171
  if self.class.get_aoe <= 0
167
172
  if object.respond_to?(:health) && object.respond_to?(:take_damage)
168
- object.take_damage(self.class.get_damage)
173
+ object.take_damage(self.class.get_damage * @damage_increase)
169
174
  end
170
175
 
171
176
  if object.respond_to?(:is_alive) && !object.is_alive && object.respond_to?(:drops)
@@ -189,7 +194,7 @@ class Projectile < GeneralObject
189
194
  next if object.nil?
190
195
  if Gosu.distance(@x, @y, object.x, object.y) < self.class.get_aoe * @scale
191
196
  if object.respond_to?(:health) && object.respond_to?(:take_damage)
192
- object.take_damage(self.class.get_damage)
197
+ object.take_damage(self.class.get_damage * @damage_increase)
193
198
  end
194
199
 
195
200
  if object.respond_to?(:is_alive) && !object.is_alive && object.respond_to?(:drops)
@@ -206,6 +211,16 @@ class Projectile < GeneralObject
206
211
  end
207
212
  end
208
213
  end
214
+
215
+ # Drop projectile explosions
216
+ if hit_object
217
+ if self.respond_to?(:drops)
218
+ self.drops.each do |drop|
219
+ drops << drop
220
+ end
221
+ end
222
+ end
223
+
209
224
  @y = @off_screen if hit_object
210
225
  return {drops: drops, point_value: points, killed: killed}
211
226
  end
@@ -0,0 +1,26 @@
1
+ require_relative 'pickup.rb'
2
+
3
+ class RocketLauncherPickup < Pickup
4
+
5
+ NAME = 'rocket_launcher'
6
+
7
+ def initialize(scale, screen_width, screen_height, x = nil, y = nil, options = {})
8
+ @x = x || rand(screen_width)
9
+ @y = y || 0
10
+ super(scale, screen_width, screen_height, @x, @y, options)
11
+ end
12
+
13
+ def get_image
14
+ Gosu::Image.new("#{MEDIA_DIRECTORY}/rocket_launcher.png")
15
+ end
16
+
17
+ # def draw
18
+ # end
19
+
20
+ # def update
21
+ # end
22
+
23
+ def collected_by_player player
24
+ player.add_hard_point(RocketLauncherPickup::NAME)
25
+ end
26
+ end
@@ -1,11 +1,12 @@
1
1
  require_relative 'projectile.rb'
2
- class EnemyHomingMissile < Projectile
2
+ # Follows targets location only at time of launch. Will not follow target
3
+ class SemiGuidedMissile < Projectile
3
4
  attr_reader :x, :y, :time_alive, :mouse_start_x, :mouse_start_y, :health
4
5
  COOLDOWN_DELAY = 75
5
- MAX_SPEED = 18
6
+ MAX_SPEED = 30
6
7
  STARTING_SPEED = 0.0
7
8
  INITIAL_DELAY = 2
8
- SPEED_INCREASE_FACTOR = 0.5
9
+ SPEED_INCREASE_FACTOR = 2
9
10
  DAMAGE = 15
10
11
  AOE = 0
11
12
 
@@ -15,13 +16,14 @@ class EnemyHomingMissile < Projectile
15
16
 
16
17
  def get_image
17
18
  # Gosu::Image.new("#{MEDIA_DIRECTORY}/mini_missile_reverse.png")
18
- Gosu::Image.new("#{MEDIA_DIRECTORY}/mini_missile.png")
19
+ Gosu::Image.new("#{MEDIA_DIRECTORY}/tiny_missile.png")
19
20
  end
20
21
 
21
- def initialize(scale, screen_width, screen_height, object, homing_object, angle_min, angle_max, angle_init, options = {})
22
+ def initialize(scale, screen_width, screen_height, object, homing_object, angle_min = nil, angle_max = nil, angle_init = nil, options = {})
22
23
  options[:relative_object] = object
23
24
  super(scale, screen_width, screen_height, object, homing_object.x, homing_object.y, angle_min, angle_max, angle_init, options)
24
25
  @health = 5
26
+ # puts "CUSTOM DELAY: #{@custom_initial_delay}"
25
27
  end
26
28
 
27
29
  def destructable?
@@ -32,6 +34,12 @@ class EnemyHomingMissile < Projectile
32
34
  @health > 0
33
35
  end
34
36
 
37
+ def drops
38
+ [
39
+ SmallExplosion.new(@scale, @screen_width, @screen_height, @x, @y, nil, {ttl: 2, third_scale: true}),
40
+ ]
41
+ end
42
+
35
43
 
36
44
  def take_damage damage
37
45
  @health -= damage
@@ -6,6 +6,9 @@ class SmallExplosion < GeneralObject
6
6
 
7
7
  def initialize(scale, screen_width, screen_height, x = nil, y = nil, image = nil, options = {})
8
8
  @scale = scale
9
+ if options[:third_scale]
10
+ @scale = @scale / 3
11
+ end
9
12
  @smoke_scale = @scale * 1.2
10
13
  @smoke = Gosu::Image.new("#{MEDIA_DIRECTORY}/smoke.png")
11
14
  @image = image#Gosu::Image.new("#{MEDIA_DIRECTORY}/starfighterv4.png", :tileable => true)
@@ -13,15 +16,24 @@ class SmallExplosion < GeneralObject
13
16
  @x = x || 0
14
17
  @y = y || 0
15
18
  @time_alive = 0
16
- @image_width = @image.width * @scale
17
- @image_height = @image.height * @scale
18
- @image_size = @image_width * @image_height / 2
19
- @image_radius = (@image_width + @image_height) / 4
19
+ if @image
20
+ @image_width = @image.width * @scale
21
+ @image_height = @image.height * @scale
22
+ @image_size = @image_width * @image_height / 2
23
+ @image_radius = (@image_width + @image_height) / 4
24
+ else
25
+ @image_width = @smoke.width * @scale
26
+ @image_height = @smoke.height * @scale
27
+ @image_size = @image_width * @image_height / 2
28
+ @image_radius = (@image_width + @image_height) / 4
29
+ end
20
30
  @current_speed = (SCROLLING_SPEED - 1) * @scale
21
31
 
22
32
  @screen_width = screen_width
23
33
  @screen_height = screen_height
24
34
  @off_screen = screen_height + screen_height
35
+
36
+ @time_to_live = options[:ttl] || TIME_TO_LIVE
25
37
  end
26
38
 
27
39
  def draw
@@ -33,13 +45,13 @@ class SmallExplosion < GeneralObject
33
45
  spin_down = @time_alive * 10
34
46
  end
35
47
  @smoke.draw_rot(@x, @y, ZOrder::SmallExplosions, (360 - spin_down), 0.5, 0.5, @smoke_scale, @smoke_scale)
36
- @image.draw_rot(@x, @y, ZOrder::SmallExplosions, (360 - spin_down), 0.5, 0.5, @scale, @scale)
48
+ @image.draw_rot(@x, @y, ZOrder::SmallExplosions, (360 - spin_down), 0.5, 0.5, @scale, @scale) if @image
37
49
  end
38
50
 
39
51
 
40
52
  def update mouse_x = nil, mouse_y = nil, player = nil
41
53
  # Remove even if hasn't gone offscreen
42
- if @time_alive <= TIME_TO_LIVE
54
+ if @time_alive <= @time_to_live
43
55
  @time_alive += 1
44
56
  @y += @current_speed
45
57
  super(mouse_x, mouse_y)
@@ -9,7 +9,7 @@ class Star < Pickup
9
9
  # @scale = scale
10
10
  # @image = get_image
11
11
  # @time_alive = 0
12
- @x = x || rand * 800
12
+ @x = x || rand(screen_width)
13
13
  @y = y || 0
14
14
  super(scale, screen_width, screen_height, @x, @y, options)
15
15
  @color = Gosu::Color.new(0xff_000000)
@@ -53,7 +53,11 @@ class Star < Pickup
53
53
  # end
54
54
 
55
55
  def collected_by_player player
56
- player.attack_speed += 0.1
57
- player.attack_speed = Player::MAX_ATTACK_SPEED if player.attack_speed > Player::MAX_ATTACK_SPEED
56
+ value = 0.02
57
+ player.attack_speed += player.boost_increase * value
58
+ if player.attack_speed > Player::MAX_ATTACK_SPEED
59
+ player.attack_speed = Player::MAX_ATTACK_SPEED
60
+ player.health += 1
61
+ end
58
62
  end
59
63
  end
data/menu_launcher.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'gosu'
2
2
 
3
3
  CURRENT_DIRECTORY = File.expand_path('../', __FILE__)
4
- MEDIA_DIRECTORY = File.expand_path('../', __FILE__) + "/media"
4
+ MEDIA_DIRECTORY = File.expand_path('../', __FILE__) + "/line-em-up/media"
5
5
  CONFIG_FILE = "#{CURRENT_DIRECTORY}/config.txt"
6
6
 
7
7
  Dir["#{CURRENT_DIRECTORY}/line-em-up/lib/*.rb"].each { |f| require f }
@@ -17,98 +17,4 @@ require "#{CURRENT_DIRECTORY}/line-em-up/game_window.rb"
17
17
  # @menu.add_item(Gosu::Image.new("#{MEDIA_DIRECTORY}question.png"), 100, 200, 1, lambda { self.close }, Gosu::Image.new(self, "#{MEDIA_DIRECTORY}question.png", false))
18
18
  # @menu.add_item(Gosu::Image.new("#{MEDIA_DIRECTORY}question.png"), 100, 250, 1, lambda { puts "something" }, Gosu::Image.new(self, "#{MEDIA_DIRECTORY}question.png", false))
19
19
 
20
-
21
- class Main < Gosu::Window
22
- def initialize
23
- @width, @height = ResolutionSetting::RESOLUTIONS[0].split('x').collect{|s| s.to_i}
24
- super(@width, @height, false)
25
- @cursor = Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/cursor.png", false)
26
- @gl_background = GLBackground.new
27
- # x = self.width / 2 - 100
28
- # y = self.height / 2 - 100
29
- @center_ui_y = 0
30
- @center_ui_x = 0
31
- reset_center_font_ui_y
32
- lineHeight = 50
33
- @font = Gosu::Font.new(20)
34
- self.caption = "A menu with Gosu"
35
- # items = Array["exit", "additem", "item"]
36
- # actions = Array[lambda { self.close }, lambda {
37
- # @menu.add_item(Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/item.png", false), x, y, 1, lambda { })
38
- # y += lineHeight
39
- # }, lambda {}]
40
- @menu = Menu.new(self)
41
- # for i in (0..items.size - 1)
42
- # @menu.add_item(Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/#{items[i]}.png", false), x, y, 1, actions[i], Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/#{items[i]}_hover.png", false))
43
- # y += lineHeight
44
- # end
45
- exit_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/exit.png")
46
- # puts "WIDTH HERE: #{exit_image.width}"
47
- # 8
48
- @menu.add_item(exit_image, ((@width / 2) - (exit_image.width / 2)), get_center_font_ui_y, 1, lambda { self.close }, exit_image)
49
- window_height = Gosu.screen_height
50
- @resolution_menu = ResolutionSetting.new(window_height, @width, @height, get_center_font_ui_y, CONFIG_FILE)
51
-
52
- @difficulty = nil
53
- @difficulty_menu = DifficultySetting.new(@width, @height, get_center_font_ui_y, CONFIG_FILE)
54
-
55
- start_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/start.png")
56
- @game_window_width, @game_window_height, @full_screen = [nil, nil, nil]
57
- @menu.add_item(start_image, (@width / 2) - (start_image.width / 2), get_center_font_ui_y, 1, lambda {self.close; GameWindow.start(@game_window_width, @game_window_height, dynamic_get_resolution_fs, {block_controls_until_button_up: true, difficulty: @difficulty}) }, start_image)
58
- debug_start_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/debug_start.png")
59
- @menu.add_item(debug_start_image, (@width / 2) - (debug_start_image.width / 2), get_center_font_ui_y, 1, lambda {self.close; GameWindow.start(@game_window_width, @game_window_height, dynamic_get_resolution_fs, {block_controls_until_button_up: true, debug: true, difficulty: @difficulty}) }, start_image)
60
- # @font.draw("<", width + 15, get_center_font_ui_y, 1, 1.0, 1.0, 0xff_ffff00)
61
- # @font.draw("Resolution", width / 2, get_center_font_ui_y, 1, 1.0, 1.0, 0xff_ffff00)
62
- # @font.draw(">", width - 15, get_center_font_ui_y, 1, 1.0, 1.0, 0xff_ffff00)
63
- # @menu.add_item(Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/start.png", false), get_center_font_ui_x, get_center_font_ui_y, 1, lambda { self.close; GameWindow.start(nil, nil, {block_controls_until_button_up: true}) }, Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/start.png", false))
64
- end
65
-
66
- def dynamic_get_resolution_fs
67
- @fullscreen
68
- end
69
-
70
- def update
71
- @menu.update
72
- @resolution_menu.update(self.mouse_x, self.mouse_y)
73
- @difficulty_menu.update(self.mouse_x, self.mouse_y)
74
-
75
- @game_window_width, @game_window_height, @fullscreen = @resolution_menu.get_resolution
76
- @difficulty = @difficulty_menu.get_difficulty
77
- @gl_background.scroll
78
- end
79
-
80
- def draw
81
- @cursor.draw(self.mouse_x, self.mouse_y, 2)
82
- # @back.draw(0,0,0)
83
- reset_center_font_ui_y
84
- @menu.draw
85
- @resolution_menu.draw
86
- @difficulty_menu.draw
87
- @gl_background.draw(ZOrder::Background)
88
- end
89
-
90
- def button_down id
91
- if id == Gosu::MsLeft then
92
- @menu.clicked
93
- @resolution_menu.clicked(self.mouse_x, self.mouse_y)
94
- @difficulty_menu.clicked(self.mouse_x, self.mouse_y)
95
- end
96
- end
97
-
98
- def get_center_font_ui_y
99
- return_value = @center_ui_y
100
- @center_ui_y += 50
101
- return return_value
102
- end
103
-
104
- def get_center_font_ui_x
105
- return @center_ui_x
106
- end
107
-
108
- def reset_center_font_ui_y
109
- @center_ui_y = self.height / 2 - 100
110
- @center_ui_x = self.width / 2 - 100
111
- end
112
- end
113
-
114
20
  Main.new.show