scorched_earth 5.0.4.pre-java → 5.0.5.pre-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/bin/console +1 -1
  3. data/exe/scorched +3 -1
  4. data/lib/scorched_earth/event_runner.rb +1 -1
  5. data/lib/scorched_earth/events/{game_ending.rb → game_over.rb} +1 -1
  6. data/lib/scorched_earth/events/{entity_created.rb → game_update.rb} +1 -1
  7. data/lib/scorched_earth/events/{entity_destroyed.rb → hit.rb} +1 -1
  8. data/lib/scorched_earth/game.rb +39 -53
  9. data/lib/scorched_earth/game_window.rb +2 -7
  10. data/lib/scorched_earth/helpers.rb +2 -1
  11. data/lib/scorched_earth/objects/explosion.rb +17 -0
  12. data/lib/scorched_earth/objects/mouse.rb +13 -0
  13. data/lib/scorched_earth/objects/player.rb +12 -0
  14. data/lib/scorched_earth/objects/shot.rb +41 -0
  15. data/lib/scorched_earth/renders/explosion.rb +33 -0
  16. data/lib/scorched_earth/renders/map.rb +76 -0
  17. data/lib/scorched_earth/renders/mouse.rb +27 -0
  18. data/lib/scorched_earth/renders/player.rb +30 -0
  19. data/lib/scorched_earth/renders/shot.rb +23 -0
  20. data/lib/scorched_earth/renders/trajectory.rb +34 -0
  21. data/lib/scorched_earth/renders.rb +16 -0
  22. data/lib/scorched_earth/services/cie94.rb +23 -23
  23. data/lib/scorched_earth/services/color_palette.rb +66 -0
  24. data/lib/scorched_earth/services/deform.rb +30 -0
  25. data/lib/scorched_earth/services/wave.rb +21 -0
  26. data/lib/scorched_earth/subscribers/game_over/timeout.rb +15 -0
  27. data/lib/scorched_earth/subscribers/game_update/collisions.rb +18 -0
  28. data/lib/scorched_earth/subscribers/hit/deform.rb +18 -0
  29. data/lib/scorched_earth/subscribers/hit/effect.rb +15 -0
  30. data/lib/scorched_earth/subscribers/hit/radius.rb +17 -0
  31. data/lib/scorched_earth/subscribers/mouse_moved.rb +13 -0
  32. data/lib/scorched_earth/subscribers/mouse_pressed.rb +13 -0
  33. data/lib/scorched_earth/subscribers/mouse_released/fire.rb +35 -0
  34. data/lib/scorched_earth/subscribers/mouse_released/next_player.rb +13 -0
  35. data/lib/scorched_earth/version.rb +1 -1
  36. data/lib/scorched_earth.rb +1 -0
  37. metadata +28 -11
  38. data/lib/scorched_earth/color_palette.rb +0 -66
  39. data/lib/scorched_earth/explosion.rb +0 -23
  40. data/lib/scorched_earth/mouse.rb +0 -75
  41. data/lib/scorched_earth/player.rb +0 -18
  42. data/lib/scorched_earth/shot.rb +0 -52
  43. data/lib/scorched_earth/terrain.rb +0 -72
@@ -0,0 +1,66 @@
1
+ include Java
2
+
3
+ import java.awt.Color
4
+
5
+ require 'scorched_earth/services/cie94'
6
+
7
+ module ScorchedEarth
8
+ module Services
9
+ class ColorPalette
10
+ include Enumerable
11
+
12
+ attr_reader :cache, :colors, :strategy
13
+
14
+ def initialize(*colors)
15
+ @cache = {}
16
+ @colors = colors
17
+ @strategy = Strategies::TriadMixing
18
+ end
19
+
20
+ def get(key)
21
+ cache[key] ||= begin
22
+ first
23
+ end
24
+ end
25
+
26
+ def each
27
+ return enum_for(:each) unless block_given?
28
+
29
+ loop do
30
+ color = strategy.color colors
31
+ yield color unless already_exists?(color)
32
+ end
33
+ end
34
+
35
+ def already_exists?(color)
36
+ cache.values.any? do |color2|
37
+ delta_e94 = Services::CIE94.new.call color, color2
38
+
39
+ delta_e94 < 750 # MAX: 10_0000 e.g. black vs. white
40
+ end
41
+ end
42
+
43
+ module Strategies
44
+ module TriadMixing
45
+ def self.color(colors)
46
+ sum = 0.0
47
+
48
+ colors.map do |color|
49
+ sum += ratio = rand
50
+
51
+ [color, ratio]
52
+ end.inject(Color.new(0, 0, 0)) do |mix, (color, ratio)|
53
+ scale = ratio / sum
54
+
55
+ Color.new(
56
+ (mix.red + color.red * scale).to_i,
57
+ (mix.green + color.green * scale).to_i,
58
+ (mix.blue + color.blue * scale).to_i
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,30 @@
1
+ require 'scorched_earth/helpers'
2
+
3
+ module ScorchedEarth
4
+ module Services
5
+ class Deform
6
+ include Helpers
7
+ attr_reader :array
8
+
9
+ def initialize(array)
10
+ @array = array
11
+ end
12
+
13
+ def call(center_x, radius, center_y = array[center_x])
14
+ new_array = array.dup
15
+ circle(radius) do |offset_x, offset_y|
16
+ x = center_x + offset_x
17
+ y = array[x]
18
+ next unless y
19
+ z = offset_y * 2
20
+ q = center_y - offset_y
21
+ q = y if q > y
22
+
23
+ new_array[x] = [y - z, q, 0].max
24
+ end
25
+
26
+ new_array
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ module ScorchedEarth
2
+ module Services
3
+ class Wave
4
+ attr_reader :width, :height, :phases
5
+
6
+ def initialize(width, height, phases)
7
+ @width = width
8
+ @height = height
9
+ @phases = phases
10
+ end
11
+
12
+ def each
13
+ return enum_for(:each) unless block_given?
14
+
15
+ width.times do |index|
16
+ yield Math.sin(index.to_f / width * phases) * height / 4 + (height / 4)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require 'scorched_earth/events/game_over'
2
+
3
+ module ScorchedEarth
4
+ module Subscribers
5
+ module Timeout
6
+ def setup
7
+ super
8
+
9
+ event_runner.subscribe(Events::GameOver) do |event|
10
+ event.time < Time.now ? setup : event_runner.publish(event)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module ScorchedEarth
2
+ module Subscribers
3
+ module Collisions
4
+ def setup
5
+ super
6
+
7
+ event_runner.subscribe(Events::GameUpdate) do
8
+ objects
9
+ .select { |object| object.is_a? Shot }
10
+ .select { |object| array.fetch(object.x, 0) > object.y }
11
+ .each { |object| event_runner.publish Events::Hit.new(object, radius = 50) }
12
+ .each { |object| objects << object.trajectory }
13
+ .each { |object| objects.delete object }
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'scorched_earth/events/hit'
2
+
3
+ module ScorchedEarth
4
+ module Subscribers
5
+ module Deform
6
+ def setup
7
+ super
8
+
9
+ event_runner.subscribe(Events::Hit) do |event|
10
+ if event.object.x < array.size && event.object.x > 0
11
+ @array = Services::Deform.new(array).call(event.object.x, event.radius)
12
+ @players = players.map { |player| Player.new player.x, array[player.x] }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'scorched_earth/events/hit'
2
+
3
+ module ScorchedEarth
4
+ module Subscribers
5
+ module Effect
6
+ def setup
7
+ super
8
+
9
+ event_runner.subscribe(Events::Hit) do |event|
10
+ objects << Explosion.new(event.object.x, event.object.y)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ require 'scorched_earth/events/hit'
2
+
3
+ module ScorchedEarth
4
+ module Subscribers
5
+ module Radius
6
+ def setup
7
+ super
8
+
9
+ event_runner.subscribe(Events::Hit) do |event|
10
+ if players.any? { |player| inside_radius? event.object.x - player.x, 0, event.radius }
11
+ event_runner.publish Events::GameOver.new(Time.now + 0.25)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module ScorchedEarth
2
+ module Subscribers
3
+ module MouseMoved
4
+ def setup
5
+ super
6
+
7
+ event_runner.subscribe(Events::MouseMoved) do |event|
8
+ @mouse = Mouse.new event.x, event.y, mouse.pressed_at
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module ScorchedEarth
2
+ module Subscribers
3
+ module MousePressed
4
+ def setup
5
+ super
6
+
7
+ event_runner.subscribe(Events::MousePressed) do |_event|
8
+ @mouse = Mouse.new mouse.x, mouse.y, Time.now
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,35 @@
1
+ module ScorchedEarth
2
+ module Subscribers
3
+ module Fire
4
+ def setup
5
+ super
6
+
7
+ event_runner.subscribe(Events::MouseReleased) do |_event|
8
+ if mouse.pressed_at && mouse.x && mouse.y
9
+ shot = Shot.new current_player.x, array[current_player.x], velocity_x, velocity_y
10
+
11
+ objects << shot
12
+ end
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def delta
19
+ (Time.now - mouse.pressed_at) * 1000 + 1000
20
+ end
21
+
22
+ def degrees
23
+ angle(height - current_player.y - mouse.y, current_player.x - mouse.x) + 180
24
+ end
25
+
26
+ def velocity_x
27
+ offset_x(degrees, delta)
28
+ end
29
+
30
+ def velocity_y
31
+ offset_y(degrees, delta)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ module ScorchedEarth
2
+ module Subscribers
3
+ module NextPlayer
4
+ def setup
5
+ super
6
+
7
+ event_runner.subscribe(Events::MouseReleased) do |_event|
8
+ @players = players.rotate!
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module ScorchedEarth
2
- VERSION = '5.0.4.pre'.freeze
2
+ VERSION = '5.0.5.pre'.freeze
3
3
  end
@@ -1,6 +1,7 @@
1
1
  $LOAD_PATH.unshift File.dirname(__FILE__)
2
2
 
3
3
  require 'scorched_earth/version'
4
+ require 'scorched_earth/game'
4
5
  require 'scorched_earth/game_window'
5
6
 
6
7
  module ScorchedEarth; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scorched_earth
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.4.pre
4
+ version: 5.0.5.pre
5
5
  platform: java
6
6
  authors:
7
7
  - James Moriarty
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-08 00:00:00.000000000 Z
11
+ date: 2016-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -99,23 +99,40 @@ files:
99
99
  - bin/setup
100
100
  - exe/scorched
101
101
  - lib/scorched_earth.rb
102
- - lib/scorched_earth/color_palette.rb
103
102
  - lib/scorched_earth/event_runner.rb
104
- - lib/scorched_earth/events/entity_created.rb
105
- - lib/scorched_earth/events/entity_destroyed.rb
106
- - lib/scorched_earth/events/game_ending.rb
103
+ - lib/scorched_earth/events/game_over.rb
104
+ - lib/scorched_earth/events/game_update.rb
105
+ - lib/scorched_earth/events/hit.rb
107
106
  - lib/scorched_earth/events/mouse_moved.rb
108
107
  - lib/scorched_earth/events/mouse_pressed.rb
109
108
  - lib/scorched_earth/events/mouse_released.rb
110
- - lib/scorched_earth/explosion.rb
111
109
  - lib/scorched_earth/game.rb
112
110
  - lib/scorched_earth/game_window.rb
113
111
  - lib/scorched_earth/helpers.rb
114
- - lib/scorched_earth/mouse.rb
115
- - lib/scorched_earth/player.rb
112
+ - lib/scorched_earth/objects/explosion.rb
113
+ - lib/scorched_earth/objects/mouse.rb
114
+ - lib/scorched_earth/objects/player.rb
115
+ - lib/scorched_earth/objects/shot.rb
116
+ - lib/scorched_earth/renders.rb
117
+ - lib/scorched_earth/renders/explosion.rb
118
+ - lib/scorched_earth/renders/map.rb
119
+ - lib/scorched_earth/renders/mouse.rb
120
+ - lib/scorched_earth/renders/player.rb
121
+ - lib/scorched_earth/renders/shot.rb
122
+ - lib/scorched_earth/renders/trajectory.rb
116
123
  - lib/scorched_earth/services/cie94.rb
117
- - lib/scorched_earth/shot.rb
118
- - lib/scorched_earth/terrain.rb
124
+ - lib/scorched_earth/services/color_palette.rb
125
+ - lib/scorched_earth/services/deform.rb
126
+ - lib/scorched_earth/services/wave.rb
127
+ - lib/scorched_earth/subscribers/game_over/timeout.rb
128
+ - lib/scorched_earth/subscribers/game_update/collisions.rb
129
+ - lib/scorched_earth/subscribers/hit/deform.rb
130
+ - lib/scorched_earth/subscribers/hit/effect.rb
131
+ - lib/scorched_earth/subscribers/hit/radius.rb
132
+ - lib/scorched_earth/subscribers/mouse_moved.rb
133
+ - lib/scorched_earth/subscribers/mouse_pressed.rb
134
+ - lib/scorched_earth/subscribers/mouse_released/fire.rb
135
+ - lib/scorched_earth/subscribers/mouse_released/next_player.rb
119
136
  - lib/scorched_earth/version.rb
120
137
  - scorched_earth.gemspec
121
138
  homepage: https://github.com/jamesmoriarty/scorched-earth
@@ -1,66 +0,0 @@
1
- include Java
2
-
3
- import java.awt.Color
4
-
5
- require 'scorched_earth/services/cie94'
6
-
7
- module ScorchedEarth
8
- class ColorPalette
9
- include Enumerable
10
-
11
- attr_reader :cache, :colors, :strategy
12
-
13
- def initialize(*colors)
14
- @cache = {}
15
- @colors = colors
16
- @strategy = Strategies::TriadMixing
17
- end
18
-
19
- def get(key)
20
- cache[key] ||= begin
21
- first
22
- end
23
- end
24
-
25
- def each
26
- return enum_for(:each) unless block_given?
27
-
28
- loop do
29
- color = strategy.color colors
30
- unless already_exists?(color)
31
- yield color
32
- end
33
- end
34
- end
35
-
36
- def already_exists?(color)
37
- cache.values.any? do |color2|
38
- delta_e94 = Services::CIE94.new.call color, color2
39
-
40
- delta_e94 < 1000
41
- end
42
- end
43
-
44
- module Strategies
45
- module TriadMixing
46
- def self.color(colors)
47
- sum = 0.0
48
-
49
- colors.map do |color|
50
- sum += ratio = rand
51
-
52
- [color, ratio]
53
- end.inject(Color.new(0, 0, 0)) do |mix, (color, ratio)|
54
- scale = ratio / sum
55
-
56
- Color.new(
57
- (mix.red + color.red * scale).to_i,
58
- (mix.green + color.green * scale).to_i,
59
- (mix.blue + color.blue * scale).to_i
60
- )
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,23 +0,0 @@
1
- module ScorchedEarth
2
- class Explosion
3
- attr_reader :x, :y, :color, :radius
4
-
5
- def initialize(x, y)
6
- @x = x
7
- @y = y
8
- @radius = 25
9
- end
10
-
11
- def update(_delta)
12
- @radius += 25
13
- @x -= 1_000_000 if radius > 100
14
- end
15
-
16
- def draw(graphics)
17
- height = graphics.destination.height
18
-
19
- graphics.set_color Color.white
20
- graphics.fill_oval x - radius / 2, height - y - radius / 2, radius, radius
21
- end
22
- end
23
- end
@@ -1,75 +0,0 @@
1
- include Java
2
-
3
- import java.awt.BasicStroke
4
-
5
- require 'scorched_earth/helpers'
6
- require 'scorched_earth/events/mouse_pressed'
7
- require 'scorched_earth/events/mouse_released'
8
- require 'scorched_earth/events/mouse_moved'
9
-
10
- module ScorchedEarth
11
- class Mouse
12
- include Helpers
13
-
14
- attr_reader :event_runner, :players, :terrain, :mouse_pressed_at, :x, :y
15
-
16
- def initialize(event_runner, players, terrain)
17
- @event_runner = event_runner
18
- @players = players
19
- @terrain = terrain
20
- end
21
-
22
- def current_player
23
- players.first
24
- end
25
-
26
- def next_player
27
- players.rotate!
28
- end
29
-
30
- def mouse_released(event)
31
- return unless mouse_pressed_at
32
-
33
- delta = (Time.now - mouse_pressed_at) * 1000 + 1000
34
- x1 = event.x
35
- y1 = event.y
36
- x2 = current_player.x
37
- y2 = height - terrain[current_player.x]
38
- degrees = angle(y2 - y1, x2 - x1) + 180
39
- velocity_x = offset_x(degrees, delta)
40
- velocity_y = offset_y(degrees, delta)
41
- shot = Shot.new current_player.x, terrain[current_player.x], velocity_x, velocity_y, Color.white
42
-
43
- event_runner.publish Events::EntityCreated.new shot
44
-
45
- next_player
46
- end
47
-
48
- def mouse_pressed(_event)
49
- @mouse_pressed_at = Time.now
50
- end
51
-
52
- def mouse_moved(event)
53
- @x = event.x
54
- @y = event.y
55
- end
56
-
57
- def height
58
- terrain.height
59
- end
60
-
61
- def draw(graphics)
62
- return unless x && y
63
-
64
- height = graphics.destination.height
65
- x1 = x
66
- y1 = y
67
- x2 = current_player.x
68
- y2 = height - terrain[current_player.x]
69
-
70
- graphics.set_color current_player.color
71
- graphics.setStroke BasicStroke.new 3
72
- graphics.draw_line x1, y1, x2, y2
73
- end
74
- end
75
- end
@@ -1,18 +0,0 @@
1
- module ScorchedEarth
2
- class Player
3
- attr_reader :x, :color
4
-
5
- def initialize(x, color)
6
- @x = x
7
- @color = color
8
- end
9
-
10
- def draw(graphics, y)
11
- height = graphics.destination.height
12
- radius = 25
13
-
14
- graphics.set_color color
15
- graphics.fill_oval x - radius / 2, height - y - radius / 2, radius, radius
16
- end
17
- end
18
- end
@@ -1,52 +0,0 @@
1
- include Java
2
-
3
- import java.awt.BasicStroke
4
-
5
- require 'scorched_earth/helpers'
6
-
7
- module ScorchedEarth
8
- class Shot
9
- include Helpers
10
-
11
- attr_reader :x, :y, :velocity_x, :velocity_y, :color
12
-
13
- def initialize(x, y, velocity_x, velocity_y, color)
14
- @x = x
15
- @y = y
16
- @velocity_x = velocity_x
17
- @velocity_y = velocity_y
18
- @color = color
19
- end
20
-
21
- def update(delta)
22
- @velocity_y -= gravity * delta
23
- @x += velocity_x * delta
24
- @y += velocity_y * delta
25
- end
26
-
27
- def draw(graphics)
28
- height = graphics.destination.height
29
- degrees = angle velocity_y, velocity_x
30
- x1 = x
31
- y1 = height - y
32
- x2 = x1 + offset_x(degrees, length)
33
- y2 = y1 + offset_y(degrees, length)
34
-
35
- graphics.set_color color
36
- graphics.setStroke BasicStroke.new 3
37
- graphics.draw_line x1, y1, x2, y2
38
- end
39
-
40
- def length
41
- 10
42
- end
43
-
44
- def width
45
- 3
46
- end
47
-
48
- def gravity
49
- 2000
50
- end
51
- end
52
- end
@@ -1,72 +0,0 @@
1
- require 'scorched_earth/helpers'
2
-
3
- include Java
4
-
5
- import java.awt.Transparency
6
-
7
- module ScorchedEarth
8
- class Terrain < Array
9
- include Helpers
10
-
11
- attr_reader :color, :height
12
-
13
- def initialize(width, height, cycles, color)
14
- @color = color
15
- @height = height
16
-
17
- super(width) do |index|
18
- Math.sin(index.to_f / width * cycles) * height / 4 + (height / 4)
19
- end
20
- end
21
-
22
- def width
23
- size
24
- end
25
-
26
- def draw(graphics)
27
- graphics.draw_image cache { _draw(graphics) }, 0, 0, nil
28
- end
29
-
30
- def bite(center_x, radius, center_y = self[center_x])
31
- circle(radius) do |offset_x, offset_y|
32
- x = center_x + offset_x
33
- y = self[x]
34
- next unless y
35
- z = offset_y * 2
36
- q = center_y - offset_y
37
- q = y if q > y
38
-
39
- self[x] = [y - z, q, 0].max
40
- end
41
-
42
- clear_cache!
43
- end
44
-
45
- private
46
-
47
- def _draw(graphics)
48
- image = graphics
49
- .get_device_configuration
50
- .create_compatible_image width, height, Transparency::TRANSLUCENT
51
-
52
- each_with_index do |y, x|
53
- image.graphics.tap do |image_graphics|
54
- image_graphics.set_color color
55
- image_graphics.draw_line x, height - y, x, height
56
- end
57
- end
58
-
59
- image
60
- end
61
-
62
- def cache
63
- @cache ||= begin
64
- yield
65
- end
66
- end
67
-
68
- def clear_cache!
69
- @cache = nil
70
- end
71
- end
72
- end