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

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 (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