line-em-up 0.4.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/line-em-up/game_window.rb +189 -52
- data/line-em-up/irb_requirements.rb +24 -2
- data/line-em-up/lib/config_setting.rb +126 -16
- data/line-em-up/lib/difficulty_setting.rb +64 -64
- data/line-em-up/lib/lighting.rb +143 -0
- data/line-em-up/lib/resolution_setting.rb +58 -58
- data/line-em-up/lib/setting.rb +104 -0
- data/line-em-up/lib/ship_loadout_setting.rb +476 -0
- data/line-em-up/lib/ship_setting.rb +98 -0
- data/line-em-up/lib/z_order.rb +1 -1
- data/line-em-up/loadout_window.rb +253 -0
- data/line-em-up/media/bullet_launcher_hardpoint.png +0 -0
- data/line-em-up/media/hardpoint_empty.png +0 -0
- data/line-em-up/media/header@2x.psd +0 -0
- data/line-em-up/media/laser-end-background-half.png +0 -0
- data/line-em-up/media/laser-end-background.png +0 -0
- data/line-em-up/media/laser-end-overlay-half.png +0 -0
- data/line-em-up/media/laser-end-overlay.png +0 -0
- data/line-em-up/media/laser-middle-background-half.png +0 -0
- data/line-em-up/media/laser-middle-background.png +0 -0
- data/line-em-up/media/laser-middle-overlay-half.png +0 -0
- data/line-em-up/media/laser-middle-overlay-short.png +0 -0
- data/line-em-up/media/laser-middle-overlay.png +0 -0
- data/line-em-up/media/laser-overlay-half.png +0 -0
- data/line-em-up/media/laser-overlay.png +0 -0
- data/line-em-up/media/laser-start-background-half.png +0 -0
- data/line-em-up/media/laser-start-background.png +0 -0
- data/line-em-up/media/laser-start-overlay-half.png +0 -0
- data/line-em-up/media/laser-start-overlay.png +0 -0
- data/line-em-up/media/laser_beam_hardpoint copy.png +0 -0
- data/line-em-up/media/laser_beam_hardpoint.png +0 -0
- data/line-em-up/media/line-em-up-resolution.png +0 -0
- data/line-em-up/media/menu/loadout.png +0 -0
- data/line-em-up/media/{start.png → menu/start.png} +0 -0
- data/line-em-up/media/missile_launcher.png +0 -0
- data/line-em-up/media/{spaceship.png → pilotable_ships/basic_ship/default.png} +0 -0
- data/line-em-up/media/{spaceship_original.png → pilotable_ships/basic_ship/large.png} +0 -0
- data/line-em-up/media/{spaceship_left.png → pilotable_ships/basic_ship/left.png} +0 -0
- data/line-em-up/media/pilotable_ships/basic_ship/left_broadside.png +0 -0
- data/line-em-up/media/pilotable_ships/basic_ship/original.png +0 -0
- data/line-em-up/media/{spaceship_right.png → pilotable_ships/basic_ship/right.png} +0 -0
- data/line-em-up/media/pilotable_ships/basic_ship/right_broadside.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/default.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/large.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/left.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/left_broadside.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/original.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/right.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship/right_broadside.png +0 -0
- data/line-em-up/media/pilotable_ships/mite_ship.zip +0 -0
- data/line-em-up/models/basic_ship.rb +94 -0
- data/line-em-up/models/bomb.rb +1 -1
- data/line-em-up/models/building.rb +2 -2
- data/line-em-up/models/bullet.rb +127 -74
- data/line-em-up/models/bullet_launcher.rb +23 -0
- data/line-em-up/models/cursor.rb +37 -1
- data/line-em-up/models/dumb_missile_launcher.rb +40 -0
- data/line-em-up/models/dumb_projectile.rb +9 -2
- data/line-em-up/models/enemy_bomb.rb +1 -1
- data/line-em-up/models/enemy_bullet.rb +55 -0
- data/line-em-up/models/enemy_player.rb +1 -1
- data/line-em-up/models/execute_open_gl.rb +80 -0
- data/line-em-up/models/general_object.rb +82 -9
- data/line-em-up/models/gl_background.rb +103 -30
- data/line-em-up/models/grappling_hook.rb +1 -1
- data/line-em-up/models/hardpoint.rb +120 -0
- data/line-em-up/models/laser_launcher.rb +192 -0
- data/line-em-up/models/laser_particle.rb +133 -0
- data/line-em-up/models/launcher.rb +149 -0
- data/line-em-up/models/main.rb +119 -26
- data/line-em-up/models/menu.rb +43 -3
- data/line-em-up/models/menu_item.rb +25 -14
- data/line-em-up/models/missile_boat.rb +5 -4
- data/line-em-up/models/mite.rb +3 -2
- data/line-em-up/models/mite_ship.rb +61 -0
- data/line-em-up/models/mothership.rb +1 -1
- data/line-em-up/models/pickup.rb +2 -2
- data/line-em-up/models/pilotable_ship.rb +599 -0
- data/line-em-up/models/player.rb +207 -150
- data/line-em-up/models/projectile.rb +3 -24
- data/line-em-up/models/semi_guided_missile.rb +1 -1
- data/line-em-up/models/small_explosion.rb +2 -2
- data/line-em-up/models/star.rb +7 -2
- data/menu_launcher.rb +10 -6
- metadata +113 -10
- data/line-em-up/media/spaceship_left-test.png +0 -0
@@ -0,0 +1,149 @@
|
|
1
|
+
require_relative 'dumb_projectile.rb'
|
2
|
+
require_relative 'laser_particle.rb'
|
3
|
+
require 'opengl'
|
4
|
+
require 'glu'
|
5
|
+
require 'glut'
|
6
|
+
|
7
|
+
class Launcher < DumbProjectile
|
8
|
+
attr_accessor :x, :y, :active, :projectiles, :image_path, :test, :inited, :cooldown_wait
|
9
|
+
# DAMAGE = 0.001
|
10
|
+
COOLDOWN_DELAY = 15
|
11
|
+
# Friendly projects are + speeds
|
12
|
+
MAX_SPEED = 15
|
13
|
+
|
14
|
+
def init_projectile
|
15
|
+
raise "Override me"
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def initialize(scale, screen_width, screen_height, object, options = {})
|
20
|
+
options[:relative_y_padding] = -(object.image_height_half)
|
21
|
+
super(scale, screen_width, screen_height, object, options)
|
22
|
+
@active = true
|
23
|
+
@projectiles = []
|
24
|
+
@image_optional = self.class.get_image#Gosu::Image.new("#{MEDIA_DIRECTORY}/laser-start-overlay.png")
|
25
|
+
|
26
|
+
@inited = true
|
27
|
+
@cooldown_wait = 0
|
28
|
+
# @image_angle = options[:image_angle] || 0
|
29
|
+
# puts "IMAGE ANGLE: #{@image_angle}"
|
30
|
+
# raise "STOP "
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_cooldown
|
34
|
+
COOLDOWN_DELAY
|
35
|
+
end
|
36
|
+
|
37
|
+
# Used via hardpoint
|
38
|
+
def self.get_hardpoint_image
|
39
|
+
# raise "Override me"
|
40
|
+
# default
|
41
|
+
Gosu::Image.new("#{MEDIA_DIRECTORY}/laser_beam_hardpoint.png")
|
42
|
+
end
|
43
|
+
|
44
|
+
def attack pointer
|
45
|
+
if @cooldown_wait <= 0
|
46
|
+
options = {damage_increase: @damage_increase}
|
47
|
+
projectile = init_projectile(options)
|
48
|
+
@projectiles << projectile
|
49
|
+
@cooldown_wait = get_cooldown
|
50
|
+
return projectile
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get image is called before the initialization is complete
|
55
|
+
def self.get_image
|
56
|
+
# optional image
|
57
|
+
# Gosu::Image.new("#{MEDIA_DIRECTORY}/laser-start-overlay.png")
|
58
|
+
end
|
59
|
+
# In generalobject
|
60
|
+
# def get_image
|
61
|
+
# self.class.get_image
|
62
|
+
# end
|
63
|
+
|
64
|
+
def get_hardpoint_image
|
65
|
+
# default
|
66
|
+
Gosu::Image.new("#{MEDIA_DIRECTORY}/hardpoint_empty.png")
|
67
|
+
end
|
68
|
+
|
69
|
+
def deactivate
|
70
|
+
@active = false
|
71
|
+
# @projectiles.each do |particle|
|
72
|
+
# particle.active = false
|
73
|
+
# end
|
74
|
+
end
|
75
|
+
|
76
|
+
def update mouse_x = nil, mouse_y = nil, object = nil, scroll_factor = 1
|
77
|
+
if @inited && @active
|
78
|
+
@x = object.x
|
79
|
+
@y = object.y
|
80
|
+
end
|
81
|
+
@cooldown_wait -= 1.0 if @cooldown_wait > 0.0
|
82
|
+
if !@active && @projectiles.count == 0
|
83
|
+
return false
|
84
|
+
else
|
85
|
+
# @projectiles.reject! do |particle|
|
86
|
+
# !particle.parental_update(nil, nil, nil)
|
87
|
+
# end
|
88
|
+
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_draw_ordering
|
94
|
+
ZOrder::Launcher
|
95
|
+
end
|
96
|
+
|
97
|
+
# Furthest active particle in active beam
|
98
|
+
# def get_furthest_active_particle
|
99
|
+
# last_active_particle = nil
|
100
|
+
# if @active
|
101
|
+
# @projectiles.reverse.each do |lp|
|
102
|
+
# if lp.active && lp.y_is_on_screen
|
103
|
+
# last_active_particle = lp
|
104
|
+
# else
|
105
|
+
# break
|
106
|
+
# end
|
107
|
+
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
# return last_active_particle
|
111
|
+
# end
|
112
|
+
|
113
|
+
def draw
|
114
|
+
if @inited
|
115
|
+
if @active
|
116
|
+
if @image_optional
|
117
|
+
# if @image_angle != nil
|
118
|
+
# @image_optional.draw_rot(@x - @image_width_half, @y - @image_height_half, get_draw_ordering, @image_angle, 0.5, 0.5, @scale, @scale)
|
119
|
+
# else
|
120
|
+
@image_optional.draw(@x - @image_width_half, @y - @image_height_half, get_draw_ordering, @scale, @scale)
|
121
|
+
# end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
return true
|
126
|
+
else
|
127
|
+
return false
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def draw_gl
|
132
|
+
# if @inited
|
133
|
+
# z = ZOrder::Projectile
|
134
|
+
# new_width1, new_height1, increment_x, increment_y = LaserBeam.convert_x_and_y_to_opengl_coords(@x - @image_width_half/2, @y - @image_height_half/2, @screen_width , @screen_height)
|
135
|
+
# new_width2, new_height2, increment_x, increment_y = LaserBeam.convert_x_and_y_to_opengl_coords(@x, @y + @image_height_half/2, @screen_width , @screen_height)
|
136
|
+
# new_width3, new_height3, increment_x, increment_y = LaserBeam.convert_x_and_y_to_opengl_coords(@x + @image_width_half/2, @y - @image_height_half/2, @screen_width , @screen_height)
|
137
|
+
|
138
|
+
# glEnable(GL_BLEND)
|
139
|
+
# glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
|
140
|
+
|
141
|
+
# glBegin(GL_TRIANGLES)
|
142
|
+
# glColor4f(0, 1, 0, 0.2)
|
143
|
+
# glVertex3f(new_width1, new_height1, 0.0)
|
144
|
+
# glVertex3f(new_width2, new_height2, 0.0)
|
145
|
+
# glVertex3f(new_width3, new_height3, 0.0)
|
146
|
+
# glEnd
|
147
|
+
# end
|
148
|
+
end
|
149
|
+
end
|
data/line-em-up/models/main.rb
CHANGED
@@ -1,6 +1,38 @@
|
|
1
|
+
|
1
2
|
class Main < Gosu::Window
|
2
|
-
|
3
|
-
|
3
|
+
CURRENT_DIRECTORY = File.expand_path('../', __FILE__)
|
4
|
+
CONFIG_FILE = "#{CURRENT_DIRECTORY}/../../config.txt"
|
5
|
+
require "#{CURRENT_DIRECTORY}/../game_window.rb"
|
6
|
+
require "#{CURRENT_DIRECTORY}/../loadout_window.rb"
|
7
|
+
|
8
|
+
|
9
|
+
def initialize config_path = nil
|
10
|
+
config_path = CONFIG_FILE if config_path.nil?
|
11
|
+
|
12
|
+
|
13
|
+
# @width, @height = ResolutionSetting::SELECTION[0].split('x').collect{|s| s.to_i}
|
14
|
+
value = ConfigSetting.get_setting(config_path, 'resolution', ResolutionSetting::SELECTION[0])
|
15
|
+
raise "DID NOT GET A RESOLUTION FROM CONFIG" if value.nil?
|
16
|
+
width, height = value.split('x')
|
17
|
+
@width, @height = [width.to_i, height.to_i]
|
18
|
+
|
19
|
+
default_width, default_height = ResolutionSetting::SELECTION[0].split('x')
|
20
|
+
# default_width, default_height = default_value.split('x')
|
21
|
+
default_width, default_height = [default_width.to_i, default_height.to_i]
|
22
|
+
|
23
|
+
|
24
|
+
# Need to just pull from config file.. and then do scaling.
|
25
|
+
# index = GameWindow.find_index_of_current_resolution(self.width, self.height)
|
26
|
+
if @width == default_width && @height == @default_height
|
27
|
+
@scale = 1
|
28
|
+
else
|
29
|
+
# original_width, original_height = RESOLUTIONS[0]
|
30
|
+
width_scale = @width / default_width.to_f
|
31
|
+
height_scale = @height / default_height.to_f
|
32
|
+
@scale = (width_scale + height_scale) / 2
|
33
|
+
end
|
34
|
+
|
35
|
+
|
4
36
|
super(@width, @height, false)
|
5
37
|
@cursor = Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/cursor.png", false)
|
6
38
|
@gl_background = GLBackground.new
|
@@ -17,26 +49,78 @@ class Main < Gosu::Window
|
|
17
49
|
# @menu.add_item(Gosu::Image.new(self, "#{MEDIA_DIRECTORY}/item.png", false), x, y, 1, lambda { })
|
18
50
|
# y += lineHeight
|
19
51
|
# }, lambda {}]
|
20
|
-
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
#
|
25
|
-
|
26
|
-
|
27
|
-
# 8
|
28
|
-
@menu.add_item(exit_image, ((@width / 2) - (exit_image.width / 2)), get_center_font_ui_y, 1, lambda { self.close }, exit_image)
|
52
|
+
|
53
|
+
# exit_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/exit.png")
|
54
|
+
|
55
|
+
|
56
|
+
# @menu.add_item(exit_image, @, @menu.y_offset, 1, lambda { self.close }, exit_image)
|
57
|
+
|
58
|
+
|
29
59
|
window_height = Gosu.screen_height
|
30
|
-
@
|
60
|
+
@window = self
|
61
|
+
@resolution_menu = ResolutionSetting.new(@window, window_height, @width, @height, get_center_font_ui_y, config_path)
|
31
62
|
|
32
63
|
@difficulty = nil
|
33
|
-
@difficulty_menu = DifficultySetting.new(@width, @height, get_center_font_ui_y,
|
64
|
+
@difficulty_menu = DifficultySetting.new(@window, window_height, @width, @height, get_center_font_ui_y, config_path)
|
65
|
+
@menu = Menu.new(self, @width / 2, get_center_font_ui_y, ZOrder::UI, @scale)
|
66
|
+
# Just move everything else above the menu
|
67
|
+
# increase_center_font_ui_y(@menu.current_height)
|
68
|
+
|
69
|
+
# start_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/menu/start.png")
|
70
|
+
# @game_window_width, @game_window_height, @full_screen = [nil, nil, nil]
|
71
|
+
# @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)
|
72
|
+
|
73
|
+
button_key = :start_game
|
74
|
+
@menu.add_item(
|
75
|
+
LUIT::Button.new(@menu.local_window, button_key, @menu.x, @menu.y + @menu.current_height, "Start", 0, 1),
|
76
|
+
0,
|
77
|
+
0,
|
78
|
+
lambda {|window, id| self.close; GameWindow.start(@game_window_width, @game_window_height, dynamic_get_resolution_fs, {block_controls_until_button_up: true, difficulty: @difficulty}) },
|
79
|
+
# lambda {|window, id| self.close },
|
80
|
+
nil,
|
81
|
+
{is_button: true, key: button_key}
|
82
|
+
)
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
# loadout_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/menu/loadout.png")
|
88
|
+
# @menu.add_item(loadout_image, (@width / 2) - (loadout_image.width / 2), get_center_font_ui_y, 1, lambda {self.close; LoadoutWindow.start(@game_window_width, @game_window_height, dynamic_get_resolution_fs, {block_controls_until_button_up: true}) }, loadout_image)
|
89
|
+
button_key = :loadout
|
90
|
+
@menu.add_item(
|
91
|
+
LUIT::Button.new(@menu.local_window, button_key, @menu.x, @menu.y + @menu.current_height, "Loadout", 0, 1),
|
92
|
+
0,
|
93
|
+
0,
|
94
|
+
lambda {|window, id| self.close; LoadoutWindow.start(@game_window_width, @game_window_height, dynamic_get_resolution_fs, {block_controls_until_button_up: true}) },
|
95
|
+
nil,
|
96
|
+
{is_button: true, key: button_key}
|
97
|
+
)
|
98
|
+
|
99
|
+
# debug_start_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/debug_start.png")
|
100
|
+
# @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}) }, debug_start_image)
|
101
|
+
|
102
|
+
button_key = :debug_start
|
103
|
+
@menu.add_item(
|
104
|
+
LUIT::Button.new(@menu.local_window, button_key, @menu.x, @menu.y + @menu.current_height, "Debug Start", 0, 1),
|
105
|
+
0,
|
106
|
+
0,
|
107
|
+
lambda {|window, id| self.close; GameWindow.start(@game_window_width, @game_window_height, dynamic_get_resolution_fs, {block_controls_until_button_up: true, debug: true, difficulty: @difficulty}) },
|
108
|
+
nil,
|
109
|
+
{is_button: true, key: button_key}
|
110
|
+
)
|
111
|
+
button_key = :exit
|
112
|
+
@menu.add_item(
|
113
|
+
LUIT::Button.new(@menu.local_window, button_key, @menu.x, @menu.y + @menu.current_height, "Exit", 0, 1),
|
114
|
+
0,
|
115
|
+
0,
|
116
|
+
lambda {|window, id| self.close },
|
117
|
+
nil,
|
118
|
+
{is_button: true, key: button_key}
|
119
|
+
)
|
120
|
+
|
121
|
+
|
122
|
+
|
34
123
|
|
35
|
-
start_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/start.png")
|
36
|
-
@game_window_width, @game_window_height, @full_screen = [nil, nil, nil]
|
37
|
-
@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)
|
38
|
-
debug_start_image = Gosu::Image.new("#{MEDIA_DIRECTORY}/debug_start.png")
|
39
|
-
@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}) }, debug_start_image)
|
40
124
|
# @font.draw("<", width + 15, get_center_font_ui_y, 1, 1.0, 1.0, 0xff_ffff00)
|
41
125
|
# @font.draw("Resolution", width / 2, get_center_font_ui_y, 1, 1.0, 1.0, 0xff_ffff00)
|
42
126
|
# @font.draw(">", width - 15, get_center_font_ui_y, 1, 1.0, 1.0, 0xff_ffff00)
|
@@ -52,13 +136,13 @@ class Main < Gosu::Window
|
|
52
136
|
@resolution_menu.update(self.mouse_x, self.mouse_y)
|
53
137
|
@difficulty_menu.update(self.mouse_x, self.mouse_y)
|
54
138
|
|
55
|
-
@game_window_width, @game_window_height, @fullscreen = @resolution_menu.
|
56
|
-
@difficulty = @difficulty_menu.
|
139
|
+
@game_window_width, @game_window_height, @fullscreen = @resolution_menu.get_values
|
140
|
+
@difficulty = @difficulty_menu.get_values
|
57
141
|
@gl_background.scroll
|
58
142
|
end
|
59
143
|
|
60
144
|
def draw
|
61
|
-
@cursor.draw(self.mouse_x, self.mouse_y,
|
145
|
+
@cursor.draw(self.mouse_x, self.mouse_y, ZOrder::Cursor)
|
62
146
|
# @back.draw(0,0,0)
|
63
147
|
reset_center_font_ui_y
|
64
148
|
@menu.draw
|
@@ -75,18 +159,27 @@ class Main < Gosu::Window
|
|
75
159
|
end
|
76
160
|
end
|
77
161
|
|
162
|
+
def increase_center_font_ui_y amount
|
163
|
+
@center_ui_y += amount
|
164
|
+
end
|
165
|
+
|
78
166
|
def get_center_font_ui_y
|
79
|
-
|
80
|
-
@center_ui_y += 50
|
81
|
-
return return_value
|
167
|
+
increase_center_font_ui_y(50)
|
82
168
|
end
|
83
169
|
|
170
|
+
|
171
|
+
# def get_center_font_ui_y
|
172
|
+
# return_value = @center_ui_y
|
173
|
+
# @center_ui_y += 50
|
174
|
+
# return return_value
|
175
|
+
# end
|
176
|
+
|
84
177
|
def get_center_font_ui_x
|
85
178
|
return @center_ui_x
|
86
179
|
end
|
87
180
|
|
88
181
|
def reset_center_font_ui_y
|
89
|
-
@center_ui_y = self.height / 2
|
90
|
-
@center_ui_x = self.width / 2
|
182
|
+
@center_ui_y = -(self.height / 2) + self.height / 1.5
|
183
|
+
@center_ui_x = self.width / 2
|
91
184
|
end
|
92
185
|
end
|
data/line-em-up/models/menu.rb
CHANGED
@@ -1,12 +1,40 @@
|
|
1
1
|
require_relative 'menu_item.rb'
|
2
2
|
class Menu
|
3
|
-
|
3
|
+
attr_accessor :local_window, :current_height, :x, :y
|
4
|
+
def initialize(window, x, y, z = ZOrder::UI, scale = 1)
|
5
|
+
@scale = scale
|
4
6
|
@window = window
|
7
|
+
@x = x
|
8
|
+
@y = y
|
9
|
+
@z = z
|
10
|
+
@cell_padding = 10 * @scale
|
11
|
+
# @offset_y = 0
|
12
|
+
@local_window = self
|
13
|
+
LUIT.config({window: @window, z: z})
|
5
14
|
@items = Array.new
|
15
|
+
@current_height = 0
|
16
|
+
# Add to it while the buttons are being added, in add_item
|
17
|
+
@button_id_mapping = {}
|
6
18
|
end
|
7
19
|
|
8
|
-
|
9
|
-
|
20
|
+
# For external use
|
21
|
+
def increase_y_offset amount
|
22
|
+
@current_height = @current_height + amount
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_item(object, x, y, callback, hover_image = nil, options = {})
|
26
|
+
if options[:key]
|
27
|
+
@button_id_mapping[options[:key]] = callback
|
28
|
+
end
|
29
|
+
if options[:is_button]
|
30
|
+
|
31
|
+
end
|
32
|
+
item = MenuItem.new(@window, object, x, y, @z, callback, hover_image, options)
|
33
|
+
if options[:is_button]
|
34
|
+
@current_height = @current_height + object.h + @cell_padding
|
35
|
+
else
|
36
|
+
@current_height = @current_height + object.height + @cell_padding
|
37
|
+
end
|
10
38
|
@items << item
|
11
39
|
self
|
12
40
|
end
|
@@ -28,4 +56,16 @@ class Menu
|
|
28
56
|
i.clicked
|
29
57
|
end
|
30
58
|
end
|
59
|
+
|
60
|
+
def onClick element_id
|
61
|
+
# puts "LOADOUT WINDOW ONCLICK"
|
62
|
+
button_clicked_exists = @button_id_mapping.key?(element_id)
|
63
|
+
if button_clicked_exists
|
64
|
+
@button_id_mapping[element_id].call(@local_window, element_id)
|
65
|
+
else
|
66
|
+
puts "Clicked button that is not mapped: #{element_id}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
31
71
|
end
|
@@ -10,6 +10,8 @@ class MenuItem
|
|
10
10
|
@callback = callback
|
11
11
|
# Can also be a font object!
|
12
12
|
@active_image = @main_image
|
13
|
+
@is_button = options[:is_button]
|
14
|
+
@y_offset = options[:y_offset] || 0
|
13
15
|
# @text = options[:text]
|
14
16
|
# @value = options[:value]
|
15
17
|
# @settings_name = options[:settings_name]
|
@@ -18,26 +20,33 @@ class MenuItem
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def draw
|
21
|
-
if @text
|
23
|
+
if @text && !@is_button
|
22
24
|
@active_image.draw(@text, @x, @y, 1, 1.0, 1.0, 0xff_ffff00)
|
23
|
-
|
25
|
+
elsif !@is_button
|
24
26
|
@active_image.draw(@x, @y, @z)
|
27
|
+
elsif @is_button
|
28
|
+
@main_image.draw(-(@main_image.w / 2), -(@y_offset - @main_image.h / 2))
|
29
|
+
# @main_image.draw(0, 0)
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
28
33
|
def update
|
29
34
|
# @text = @get_value_callback.call(@config_file, @settings_name) if @get_value_callback && @config_file && @settings_name
|
30
|
-
if
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
if !@is_button
|
36
|
+
if is_mouse_hovering
|
37
|
+
if !@hover_image.nil? then
|
38
|
+
@active_image = @hover_image
|
39
|
+
end
|
34
40
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
+
@x = @original_x + HOVER_OFFSET
|
42
|
+
@y = @original_y + HOVER_OFFSET
|
43
|
+
else
|
44
|
+
@active_image = @main_image
|
45
|
+
@x = @original_x
|
46
|
+
@y = @original_y
|
47
|
+
end
|
48
|
+
else
|
49
|
+
@main_image.update(-(@main_image.w / 2), -(@y_offset - @main_image.h / 2))
|
41
50
|
end
|
42
51
|
end
|
43
52
|
|
@@ -60,8 +69,10 @@ class MenuItem
|
|
60
69
|
# if is_mouse_hovering && @callback && @value && @config_file && @settings_name
|
61
70
|
# return_value = @callback.call(@config_file, @settings_name, @value)
|
62
71
|
# end
|
63
|
-
if
|
64
|
-
@callback
|
72
|
+
if !@is_button
|
73
|
+
if is_mouse_hovering && @callback
|
74
|
+
@callback.call
|
75
|
+
end
|
65
76
|
end
|
66
77
|
# if return_value
|
67
78
|
# @text = return_value
|
@@ -24,6 +24,7 @@ class MissileBoat < GeneralObject
|
|
24
24
|
@health = 10
|
25
25
|
@armor = 0
|
26
26
|
@current_speed = (rand(5) * @scale).round + 1
|
27
|
+
@damage_factor = options[:damage_increase] || 0.5
|
27
28
|
end
|
28
29
|
|
29
30
|
def get_points
|
@@ -44,9 +45,9 @@ class MissileBoat < GeneralObject
|
|
44
45
|
x_padding_2 = -(5 * @scale)
|
45
46
|
return {
|
46
47
|
projectiles: [
|
47
|
-
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {custom_initial_delay: 2}),
|
48
|
-
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {custom_initial_delay: 12, x_homing_padding: x_padding_1}),
|
49
|
-
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {custom_initial_delay: 18, x_homing_padding: x_padding_2})
|
48
|
+
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {custom_initial_delay: 2, damage_increase: @damage_factor}),
|
49
|
+
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {custom_initial_delay: 12, x_homing_padding: x_padding_1, damage_increase: @damage_factor}),
|
50
|
+
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, MISSILE_LAUNCHER_MIN_ANGLE, MISSILE_LAUNCHER_MAX_ANGLE, MISSILE_LAUNCHER_INIT_ANGLE, {custom_initial_delay: 18, x_homing_padding: x_padding_2, damage_increase: @damage_factor})
|
50
51
|
],
|
51
52
|
cooldown: SemiGuidedMissile::COOLDOWN_DELAY
|
52
53
|
}
|
@@ -69,7 +70,7 @@ class MissileBoat < GeneralObject
|
|
69
70
|
|
70
71
|
# end
|
71
72
|
|
72
|
-
def update mouse_x = nil, mouse_y = nil, player = nil
|
73
|
+
def update mouse_x = nil, mouse_y = nil, player = nil, scroll_factor = 1
|
73
74
|
@cooldown_wait -= 1 if @cooldown_wait > 0
|
74
75
|
if is_alive
|
75
76
|
# Stay above the player
|
data/line-em-up/models/mite.rb
CHANGED
@@ -28,6 +28,7 @@ class Mite < GeneralObject
|
|
28
28
|
@current_speed = self.class.get_max_speed * @scale
|
29
29
|
@x_direction = x_direction
|
30
30
|
@switched_directions = false
|
31
|
+
@damage_factor = options[:damage_increase] || 0.3
|
31
32
|
end
|
32
33
|
|
33
34
|
def get_points
|
@@ -46,7 +47,7 @@ class Mite < GeneralObject
|
|
46
47
|
def attack player
|
47
48
|
return {
|
48
49
|
projectiles: [
|
49
|
-
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player)
|
50
|
+
SemiGuidedMissile.new(@scale, @screen_width, @screen_height, self, player, nil, nil, nil, {damage_increase: @damage_factor})
|
50
51
|
],
|
51
52
|
cooldown: SemiGuidedMissile::COOLDOWN_DELAY * MAX_ATTACK_SPEED
|
52
53
|
}
|
@@ -67,7 +68,7 @@ class Mite < GeneralObject
|
|
67
68
|
# raise "HERE"
|
68
69
|
# end
|
69
70
|
|
70
|
-
def update mouse_x = nil, mouse_y = nil, player = nil
|
71
|
+
def update mouse_x = nil, mouse_y = nil, player = nil, scroll_factor = 1
|
71
72
|
@cooldown_wait -= 1 if @cooldown_wait > 0
|
72
73
|
@time_alive += 1
|
73
74
|
if is_alive
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'general_object.rb'
|
2
|
+
require_relative 'rocket_launcher_pickup.rb'
|
3
|
+
require_relative 'pilotable_ship.rb'
|
4
|
+
require 'gosu'
|
5
|
+
|
6
|
+
require 'opengl'
|
7
|
+
require 'glut'
|
8
|
+
|
9
|
+
|
10
|
+
include OpenGL
|
11
|
+
include GLUT
|
12
|
+
|
13
|
+
class MiteShip < PilotableShip
|
14
|
+
SHIP_MEDIA_DIRECTORY = "#{MEDIA_DIRECTORY}/pilotable_ships/mite_ship"
|
15
|
+
SPEED = 8
|
16
|
+
MAX_ATTACK_SPEED = 3.0
|
17
|
+
attr_accessor :cooldown_wait, :secondary_cooldown_wait, :attack_speed, :health, :armor, :x, :y, :rockets, :score, :time_alive
|
18
|
+
|
19
|
+
attr_accessor :bombs, :secondary_weapon, :grapple_hook_cooldown_wait, :damage_reduction, :boost_increase, :damage_increase, :kill_count
|
20
|
+
attr_accessor :special_attack, :main_weapon, :drawable_items_near_self, :broadside_mode, :front_hard_points, :broadside_hard_points
|
21
|
+
MAX_HEALTH = 100
|
22
|
+
|
23
|
+
# SECONDARY_WEAPONS = [RocketLauncherPickup::NAME] + %w[bomb]
|
24
|
+
# Range goes clockwise around the 0-360 angle
|
25
|
+
# MISSILE_LAUNCHER_MIN_ANGLE = 75
|
26
|
+
# MISSILE_LAUNCHER_MAX_ANGLE = 105
|
27
|
+
# MISSILE_LAUNCHER_INIT_ANGLE = 90
|
28
|
+
|
29
|
+
# SPECIAL_POWER = 'laser'
|
30
|
+
# SPECIAL_POWER_KILL_MAX = 50
|
31
|
+
|
32
|
+
# FRONT_HARDPOINT_LOCATIONS = [{x_offset: 0, y_offset: -get_image.height}]
|
33
|
+
# RIGHT_BROADSIDE_HARDPOINT_LOCATIONS = [{x_offset: get_image.width / 2, y_offset: -(get_image.height * 0.9)}, {x_offset: get_image.width, y_offset: -(get_image.height * 0.8)}, {x_offset: -(get_image.width / 2), y_offset: -(get_image.height * 0.8)}]
|
34
|
+
FRONT_HARDPOINT_LOCATIONS = [{x_offset: lambda { |image, scale| 0 }, y_offset: lambda { |image, scale| -(image.height * scale / 2) } }]
|
35
|
+
RIGHT_BROADSIDE_HARDPOINT_LOCATIONS = [
|
36
|
+
{x_offset: lambda { |image, scale| image.width * scale / 2 }, y_offset: lambda { |image, scale| -(image.height * scale / 2)} },
|
37
|
+
{x_offset: lambda { |image, scale| -(image.width * scale / 2) } , y_offset: lambda { |image, scale| -(image.height * scale / 2)} }
|
38
|
+
]
|
39
|
+
LEFT_BROADSIDE_HARDPOINT_LOCATIONS = []
|
40
|
+
|
41
|
+
|
42
|
+
# Rocket Launcher, Rocket launcher, yannon, Cannon, Bomb Launcher
|
43
|
+
# FRONT_HARD_POINTS_MAX = 1
|
44
|
+
# BROADSIDE_HARD_POINTS = 2
|
45
|
+
|
46
|
+
# def self.get_broadside_image
|
47
|
+
# Gosu::Image.new("#{MEDIA_DIRECTORY}/mite.png")
|
48
|
+
# end
|
49
|
+
|
50
|
+
# def self.get_image
|
51
|
+
# Gosu::Image.new("#{MEDIA_DIRECTORY}/mite.png")
|
52
|
+
# end
|
53
|
+
|
54
|
+
|
55
|
+
# def get_image_path
|
56
|
+
# "#{MEDIA_DIRECTORY}/spaceship.png"
|
57
|
+
# end
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
end
|
@@ -99,7 +99,7 @@ class Mothership < GeneralObject
|
|
99
99
|
|
100
100
|
# end
|
101
101
|
|
102
|
-
def update mouse_x = nil, mouse_y = nil, player = nil
|
102
|
+
def update mouse_x = nil, mouse_y = nil, player = nil, scroll_factor = 1
|
103
103
|
@cooldown_wait -= 1 if @cooldown_wait > 0
|
104
104
|
@secondary_cooldown_wait -= 1 if @secondary_cooldown_wait > 0
|
105
105
|
@tertiary_cooldown_wait -= 1 if @tertiary_cooldown_wait > 0
|
data/line-em-up/models/pickup.rb
CHANGED
@@ -19,8 +19,8 @@ class Pickup < GeneralObject
|
|
19
19
|
end
|
20
20
|
|
21
21
|
|
22
|
-
def update mouse_x = nil, mouse_y = nil, player = nil
|
23
|
-
@y += @current_speed
|
22
|
+
def update mouse_x = nil, mouse_y = nil, player = nil, scroll_factor = 1
|
23
|
+
@y += @current_speed * scroll_factor
|
24
24
|
|
25
25
|
super(mouse_x, mouse_y)
|
26
26
|
end
|