colstrom-rtanque 0.1.3

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 (133) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +10 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +4 -0
  9. data/Gemfile.ci +6 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +168 -0
  12. data/Rakefile +1 -0
  13. data/bin/rtanque +117 -0
  14. data/lib/rtanque.rb +31 -0
  15. data/lib/rtanque/arena.rb +8 -0
  16. data/lib/rtanque/bot.rb +117 -0
  17. data/lib/rtanque/bot/brain.rb +50 -0
  18. data/lib/rtanque/bot/brain_helper.rb +23 -0
  19. data/lib/rtanque/bot/command.rb +23 -0
  20. data/lib/rtanque/bot/radar.rb +54 -0
  21. data/lib/rtanque/bot/sensors.rb +37 -0
  22. data/lib/rtanque/bot/turret.rb +14 -0
  23. data/lib/rtanque/configuration.rb +47 -0
  24. data/lib/rtanque/explosion.rb +23 -0
  25. data/lib/rtanque/gui.rb +25 -0
  26. data/lib/rtanque/gui/bot.rb +71 -0
  27. data/lib/rtanque/gui/bot/health_color_calculator.rb +37 -0
  28. data/lib/rtanque/gui/draw_group.rb +30 -0
  29. data/lib/rtanque/gui/explosion.rb +25 -0
  30. data/lib/rtanque/gui/shell.rb +31 -0
  31. data/lib/rtanque/gui/window.rb +64 -0
  32. data/lib/rtanque/heading.rb +162 -0
  33. data/lib/rtanque/match.rb +73 -0
  34. data/lib/rtanque/match/tick_group.rb +50 -0
  35. data/lib/rtanque/movable.rb +51 -0
  36. data/lib/rtanque/normalized_attr.rb +69 -0
  37. data/lib/rtanque/point.rb +140 -0
  38. data/lib/rtanque/runner.rb +88 -0
  39. data/lib/rtanque/shell.rb +44 -0
  40. data/lib/rtanque/version.rb +3 -0
  41. data/resources/images/body.png +0 -0
  42. data/resources/images/bullet.png +0 -0
  43. data/resources/images/explosions/explosion2-1.png +0 -0
  44. data/resources/images/explosions/explosion2-10.png +0 -0
  45. data/resources/images/explosions/explosion2-11.png +0 -0
  46. data/resources/images/explosions/explosion2-12.png +0 -0
  47. data/resources/images/explosions/explosion2-13.png +0 -0
  48. data/resources/images/explosions/explosion2-14.png +0 -0
  49. data/resources/images/explosions/explosion2-15.png +0 -0
  50. data/resources/images/explosions/explosion2-16.png +0 -0
  51. data/resources/images/explosions/explosion2-17.png +0 -0
  52. data/resources/images/explosions/explosion2-18.png +0 -0
  53. data/resources/images/explosions/explosion2-19.png +0 -0
  54. data/resources/images/explosions/explosion2-2.png +0 -0
  55. data/resources/images/explosions/explosion2-20.png +0 -0
  56. data/resources/images/explosions/explosion2-21.png +0 -0
  57. data/resources/images/explosions/explosion2-22.png +0 -0
  58. data/resources/images/explosions/explosion2-23.png +0 -0
  59. data/resources/images/explosions/explosion2-24.png +0 -0
  60. data/resources/images/explosions/explosion2-25.png +0 -0
  61. data/resources/images/explosions/explosion2-26.png +0 -0
  62. data/resources/images/explosions/explosion2-27.png +0 -0
  63. data/resources/images/explosions/explosion2-28.png +0 -0
  64. data/resources/images/explosions/explosion2-29.png +0 -0
  65. data/resources/images/explosions/explosion2-3.png +0 -0
  66. data/resources/images/explosions/explosion2-30.png +0 -0
  67. data/resources/images/explosions/explosion2-31.png +0 -0
  68. data/resources/images/explosions/explosion2-32.png +0 -0
  69. data/resources/images/explosions/explosion2-33.png +0 -0
  70. data/resources/images/explosions/explosion2-34.png +0 -0
  71. data/resources/images/explosions/explosion2-35.png +0 -0
  72. data/resources/images/explosions/explosion2-36.png +0 -0
  73. data/resources/images/explosions/explosion2-37.png +0 -0
  74. data/resources/images/explosions/explosion2-38.png +0 -0
  75. data/resources/images/explosions/explosion2-39.png +0 -0
  76. data/resources/images/explosions/explosion2-4.png +0 -0
  77. data/resources/images/explosions/explosion2-40.png +0 -0
  78. data/resources/images/explosions/explosion2-41.png +0 -0
  79. data/resources/images/explosions/explosion2-42.png +0 -0
  80. data/resources/images/explosions/explosion2-43.png +0 -0
  81. data/resources/images/explosions/explosion2-44.png +0 -0
  82. data/resources/images/explosions/explosion2-45.png +0 -0
  83. data/resources/images/explosions/explosion2-46.png +0 -0
  84. data/resources/images/explosions/explosion2-47.png +0 -0
  85. data/resources/images/explosions/explosion2-48.png +0 -0
  86. data/resources/images/explosions/explosion2-49.png +0 -0
  87. data/resources/images/explosions/explosion2-5.png +0 -0
  88. data/resources/images/explosions/explosion2-50.png +0 -0
  89. data/resources/images/explosions/explosion2-51.png +0 -0
  90. data/resources/images/explosions/explosion2-52.png +0 -0
  91. data/resources/images/explosions/explosion2-53.png +0 -0
  92. data/resources/images/explosions/explosion2-54.png +0 -0
  93. data/resources/images/explosions/explosion2-55.png +0 -0
  94. data/resources/images/explosions/explosion2-56.png +0 -0
  95. data/resources/images/explosions/explosion2-57.png +0 -0
  96. data/resources/images/explosions/explosion2-58.png +0 -0
  97. data/resources/images/explosions/explosion2-59.png +0 -0
  98. data/resources/images/explosions/explosion2-6.png +0 -0
  99. data/resources/images/explosions/explosion2-60.png +0 -0
  100. data/resources/images/explosions/explosion2-61.png +0 -0
  101. data/resources/images/explosions/explosion2-62.png +0 -0
  102. data/resources/images/explosions/explosion2-63.png +0 -0
  103. data/resources/images/explosions/explosion2-64.png +0 -0
  104. data/resources/images/explosions/explosion2-65.png +0 -0
  105. data/resources/images/explosions/explosion2-66.png +0 -0
  106. data/resources/images/explosions/explosion2-67.png +0 -0
  107. data/resources/images/explosions/explosion2-68.png +0 -0
  108. data/resources/images/explosions/explosion2-69.png +0 -0
  109. data/resources/images/explosions/explosion2-7.png +0 -0
  110. data/resources/images/explosions/explosion2-70.png +0 -0
  111. data/resources/images/explosions/explosion2-71.png +0 -0
  112. data/resources/images/explosions/explosion2-8.png +0 -0
  113. data/resources/images/explosions/explosion2-9.png +0 -0
  114. data/resources/images/grass.png +0 -0
  115. data/resources/images/radar.png +0 -0
  116. data/resources/images/turret.png +0 -0
  117. data/rtanque.gemspec +34 -0
  118. data/sample_bots/camper.rb +79 -0
  119. data/sample_bots/keyboard.rb +50 -0
  120. data/sample_bots/seek_and_destroy.rb +53 -0
  121. data/screenshots/battle_1.png +0 -0
  122. data/screenshots/battle_2.png +0 -0
  123. data/spec/rtanque/bot_spec.rb +239 -0
  124. data/spec/rtanque/heading_spec.rb +279 -0
  125. data/spec/rtanque/match_spec.rb +46 -0
  126. data/spec/rtanque/normalized_attr_spec.rb +90 -0
  127. data/spec/rtanque/point_spec.rb +196 -0
  128. data/spec/rtanque/radar_spec.rb +87 -0
  129. data/spec/rtanque/shell_spec.rb +35 -0
  130. data/spec/rtanque_spec.rb +34 -0
  131. data/spec/spec_helper.rb +51 -0
  132. data/templates/bot.erb +17 -0
  133. metadata +315 -0
@@ -0,0 +1,87 @@
1
+ require "spec_helper"
2
+
3
+ describe RTanque::Bot::Radar do
4
+ def reflection(heading, distance, name)
5
+ described_class::Reflection.new(RTanque::Heading.new(heading), distance, name)
6
+ end
7
+
8
+ let(:radar) { described_class.new(mockbot(10, 10), RTanque::Heading.new(0)) }
9
+
10
+ context '#scan' do
11
+ it 'should return an array' do
12
+ radar.scan([])
13
+ expect(radar.to_a).to be_an_instance_of Array
14
+ end
15
+
16
+ it 'should return an empty array' do
17
+ radar.scan([])
18
+ expect(radar.empty?).to be_true
19
+ end
20
+
21
+ it 'should 1 Reflection' do
22
+ radar.scan([mockbot(10, 20)])
23
+ expect(radar).to have(1).reflections
24
+ expect(radar.first).to be_an_instance_of described_class::Reflection
25
+ end
26
+
27
+ it 'reflection should be correct' do
28
+ radar.scan([mockbot(10, 20, 'otherbot')])
29
+ expect(radar.first).to eq reflection(0, 10.0, 'otherbot')
30
+ end
31
+
32
+ it 'should clear self' do
33
+ radar.scan([mockbot(10, 20, 'otherbot')])
34
+ radar.scan([])
35
+ expect(radar.empty?).to be_true
36
+ end
37
+
38
+ it 'reflections should be correct' do
39
+ bots = [mockbot(10, 20, 'below'), mockbot(10, 50, 'right')]
40
+ radar.scan(bots)
41
+ expect(radar.to_a).to include(
42
+ reflection(RTanque::Heading::N, 10.0, 'below'),
43
+ reflection(RTanque::Heading::N, 40.0, 'right')
44
+ )
45
+ end
46
+
47
+ it 'should detect bot in same position' do
48
+ bots = [mockbot(10, 10, 'ontop')]
49
+ radar.scan(bots)
50
+ expect(radar.to_a).to include(
51
+ reflection(RTanque::Heading::N, 0.0, 'ontop')
52
+ )
53
+ end
54
+
55
+ it 'should detect point on max vision range' do
56
+ x = 10 + Math.sin(RTanque::Bot::Radar::VISION_RANGE.last) * 10
57
+ y = 10 + Math.cos(RTanque::Bot::Radar::VISION_RANGE.last) * 10
58
+ bots = [mockbot(x, y, 'border')]
59
+ radar.scan(bots)
60
+ expect(radar.to_a).to have(1).reflections
61
+ end
62
+
63
+ it 'should detect point on min vision range' do
64
+ x = 10 + Math.sin(RTanque::Bot::Radar::VISION_RANGE.first) * 10
65
+ y = 10 + Math.cos(RTanque::Bot::Radar::VISION_RANGE.first) * 10
66
+ bots = [mockbot(x, y, 'border')]
67
+ radar.scan(bots)
68
+ expect(radar.to_a).to have(1).reflections
69
+ end
70
+
71
+ it 'should not detect point outside max vision range' do
72
+ x = 10 + Math.sin(RTanque::Bot::Radar::VISION_RANGE.last) * 10
73
+ y = 10 + Math.cos(RTanque::Bot::Radar::VISION_RANGE.last) * 10
74
+ bots = [mockbot(x + 0.01, y, 'border')]
75
+ radar.scan(bots)
76
+ expect(radar.to_a).to have(0).reflections
77
+ end
78
+
79
+ it 'should not detect point outside max vision range' do
80
+ x = 10 + Math.sin(RTanque::Bot::Radar::VISION_RANGE.first) * 10
81
+ y = 10 + Math.cos(RTanque::Bot::Radar::VISION_RANGE.first) * 10
82
+ bots = [mockbot(x, y - 0.01, 'border')]
83
+ radar.scan(bots)
84
+ expect(radar.to_a).to have(0).reflections
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe RTanque::Shell do
4
+ let(:bot) { mockbot(10, 10, 'shooter') }
5
+ let(:shell) { described_class.new(bot, RTanque::Point.new(10, 10, @arena), RTanque::Heading.new(0), 1) }
6
+
7
+ context '#hits' do
8
+ it 'should yield no bots' do
9
+ bots = []
10
+ expect{ |p| shell.hits(bots, &p) }.not_to yield_control
11
+ end
12
+
13
+ it 'should yield hit bot' do
14
+ bots = [mockbot(10, 10, 'deadbot')]
15
+ expect { |p| shell.hits(bots, &p) }.to yield_with_args(bot, bots[0])
16
+ end
17
+
18
+ it 'shell should be dead after hit' do
19
+ bots = [mockbot(10, 10, 'deadbot')]
20
+ expect(shell.dead?).to be_false
21
+ shell.hits(bots)
22
+ expect(shell.dead?).to be_true
23
+ end
24
+
25
+ it 'should hit shell on bot radius' do
26
+ bots = [mockbot(10 + RTanque::Bot::RADIUS, 10, 'deadbot')]
27
+ expect { |p| shell.hits(bots, &p) }.to yield_with_args(bot, bots[0])
28
+ end
29
+
30
+ it 'should not hit shell outside bot radius' do
31
+ bots = [mockbot(10 + RTanque::Bot::RADIUS + 0.01, 10, 'deadbot')]
32
+ expect { |p| shell.hits(bots, &p) }.not_to yield_with_args(bot, bots[0])
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ describe RTanque do
4
+
5
+ context 'face-off' do
6
+ before(:each) {
7
+ @winner = brain_bot { self.command.fire(RTanque::Bot::MAX_GUN_ENERGY) }
8
+ @looser = brain_bot { }
9
+ @winner.position = RTanque::Point.new(0, 0, @arena)
10
+ @winner.turret.heading = RTanque::Heading.new(RTanque::Heading::N)
11
+ @looser.position = RTanque::Point.new(0, @arena.height, @arena)
12
+ @match = RTanque::Match.new(@arena, 1000)
13
+ @match.add_bots(@winner, @looser)
14
+ }
15
+
16
+ it 'winner bot should win' do
17
+ @match.start
18
+ expect(@match.bots.to_a).to eq [@winner]
19
+ expect(@match.ticks).to be < @match.max_ticks
20
+ expect(@winner.health).to be(RTanque::Configuration.bot.health.max)
21
+ expect(@looser.health).to be <= RTanque::Configuration.bot.health.min
22
+ end
23
+
24
+ it 'no bot should win' do
25
+ @winner.turret.heading = RTanque::Heading.new(RTanque::Heading::E)
26
+ @match.start
27
+ expect(@match.bots.to_a).to eq [@winner, @looser]
28
+ expect(@match.ticks).to be(@match.max_ticks)
29
+ expect(@winner.health).to be(RTanque::Configuration.bot.health.max)
30
+ expect(@looser.health).to be(RTanque::Configuration.bot.health.max)
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,51 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ require 'rtanque'
8
+
9
+ RSpec.configure do |config|
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+ config.run_all_when_everything_filtered = true
12
+
13
+ # Run specs in random order to surface order dependencies. If you find an
14
+ # order dependency and want to debug it, you can fix the order by providing
15
+ # the seed, which is printed after each run.
16
+ # --seed 1234
17
+ config.order = 'random'
18
+
19
+ config.expect_with :rspec do |c|
20
+ # disable the `should` syntax
21
+ c.syntax = :expect
22
+ end
23
+
24
+ config.before(:all) do
25
+ @arena = RTanque::Arena.new(100, 100)
26
+ RTanque::Configuration.config do
27
+ raise_brain_tick_errors false # errors should be correctly captured
28
+ end
29
+ end
30
+
31
+ module BrainHelper
32
+ def on_brain_tick!(&block)
33
+ Class.new(RTanque::Bot::Brain).tap do |test_brain|
34
+ test_brain.send(:define_method, :tick!, &block)
35
+ end
36
+ end
37
+
38
+ def brain_bot(&tick)
39
+ RTanque::Bot.new(@arena, on_brain_tick!(&tick))
40
+ end
41
+ end
42
+ config.include BrainHelper
43
+
44
+ module BotHelper
45
+ def mockbot(x = 0, y = 0, name = 'testbot')
46
+ double('bot', :position => RTanque::Point.new(x, y, @arena), :name => name, :arena => @arena)
47
+ end
48
+ end
49
+
50
+ config.include BotHelper
51
+ end
@@ -0,0 +1,17 @@
1
+ class <%= @bot_class_name %> < RTanque::Bot::Brain
2
+ NAME = '<%= @bot_name %>'
3
+ include RTanque::Bot::BrainHelper
4
+
5
+ def tick!
6
+ ## main logic goes here
7
+
8
+ # use self.sensors to detect things
9
+ # See http://rubydoc.info/github/awilliams/RTanque/master/RTanque/Bot/Sensors
10
+
11
+ # use self.command to control tank
12
+ # See http://rubydoc.info/github/awilliams/RTanque/master/RTanque/Bot/Command
13
+
14
+ # self.arena contains the dimensions of the arena
15
+ # See http://rubydoc.info/github/awilliams/RTanque/master/frames/RTanque/Arena
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,315 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: colstrom-rtanque
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Adam Williams
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gosu
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.10'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.7.45
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.10'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.7.45
33
+ - !ruby/object:Gem::Dependency
34
+ name: configuration
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 1.3.2
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 1.3.2
47
+ - !ruby/object:Gem::Dependency
48
+ name: octokit
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 2.7.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 2.7.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: thor
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 0.17.0
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 0.17.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: texplay
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.4'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 0.4.3
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.4'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 0.4.3
95
+ - !ruby/object:Gem::Dependency
96
+ name: pry
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rspec
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: 2.13.0
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: 2.13.0
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec-mocks
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: 2.13.0
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: 2.13.0
137
+ description: |-
138
+ RTanque is a game for programmers. Players program the brain of a tank and then send their tank+brain into battle with other tanks. All tanks are otherwise equal.
139
+
140
+ Rules of the game are simple: Last bot standing wins. Gameplay is also pretty simple. Each tank has a base, turret and radar, each of which rotate independently. The base moves the tank, the turret has a gun mounted to it which can fire at other tanks, and the radar detects other tanks in its field of vision.
141
+
142
+ Have fun competing against friends' tanks or the sample ones included. Maybe you'll start a small league at your local Ruby meetup.
143
+ email:
144
+ - pwnfactory@gmail.com
145
+ executables:
146
+ - rtanque
147
+ extensions: []
148
+ extra_rdoc_files: []
149
+ files:
150
+ - ".gitignore"
151
+ - ".rspec"
152
+ - ".ruby-gemset"
153
+ - ".ruby-version"
154
+ - ".travis.yml"
155
+ - ".yardopts"
156
+ - Gemfile
157
+ - Gemfile.ci
158
+ - LICENSE.txt
159
+ - README.md
160
+ - Rakefile
161
+ - bin/rtanque
162
+ - lib/rtanque.rb
163
+ - lib/rtanque/arena.rb
164
+ - lib/rtanque/bot.rb
165
+ - lib/rtanque/bot/brain.rb
166
+ - lib/rtanque/bot/brain_helper.rb
167
+ - lib/rtanque/bot/command.rb
168
+ - lib/rtanque/bot/radar.rb
169
+ - lib/rtanque/bot/sensors.rb
170
+ - lib/rtanque/bot/turret.rb
171
+ - lib/rtanque/configuration.rb
172
+ - lib/rtanque/explosion.rb
173
+ - lib/rtanque/gui.rb
174
+ - lib/rtanque/gui/bot.rb
175
+ - lib/rtanque/gui/bot/health_color_calculator.rb
176
+ - lib/rtanque/gui/draw_group.rb
177
+ - lib/rtanque/gui/explosion.rb
178
+ - lib/rtanque/gui/shell.rb
179
+ - lib/rtanque/gui/window.rb
180
+ - lib/rtanque/heading.rb
181
+ - lib/rtanque/match.rb
182
+ - lib/rtanque/match/tick_group.rb
183
+ - lib/rtanque/movable.rb
184
+ - lib/rtanque/normalized_attr.rb
185
+ - lib/rtanque/point.rb
186
+ - lib/rtanque/runner.rb
187
+ - lib/rtanque/shell.rb
188
+ - lib/rtanque/version.rb
189
+ - resources/images/body.png
190
+ - resources/images/bullet.png
191
+ - resources/images/explosions/explosion2-1.png
192
+ - resources/images/explosions/explosion2-10.png
193
+ - resources/images/explosions/explosion2-11.png
194
+ - resources/images/explosions/explosion2-12.png
195
+ - resources/images/explosions/explosion2-13.png
196
+ - resources/images/explosions/explosion2-14.png
197
+ - resources/images/explosions/explosion2-15.png
198
+ - resources/images/explosions/explosion2-16.png
199
+ - resources/images/explosions/explosion2-17.png
200
+ - resources/images/explosions/explosion2-18.png
201
+ - resources/images/explosions/explosion2-19.png
202
+ - resources/images/explosions/explosion2-2.png
203
+ - resources/images/explosions/explosion2-20.png
204
+ - resources/images/explosions/explosion2-21.png
205
+ - resources/images/explosions/explosion2-22.png
206
+ - resources/images/explosions/explosion2-23.png
207
+ - resources/images/explosions/explosion2-24.png
208
+ - resources/images/explosions/explosion2-25.png
209
+ - resources/images/explosions/explosion2-26.png
210
+ - resources/images/explosions/explosion2-27.png
211
+ - resources/images/explosions/explosion2-28.png
212
+ - resources/images/explosions/explosion2-29.png
213
+ - resources/images/explosions/explosion2-3.png
214
+ - resources/images/explosions/explosion2-30.png
215
+ - resources/images/explosions/explosion2-31.png
216
+ - resources/images/explosions/explosion2-32.png
217
+ - resources/images/explosions/explosion2-33.png
218
+ - resources/images/explosions/explosion2-34.png
219
+ - resources/images/explosions/explosion2-35.png
220
+ - resources/images/explosions/explosion2-36.png
221
+ - resources/images/explosions/explosion2-37.png
222
+ - resources/images/explosions/explosion2-38.png
223
+ - resources/images/explosions/explosion2-39.png
224
+ - resources/images/explosions/explosion2-4.png
225
+ - resources/images/explosions/explosion2-40.png
226
+ - resources/images/explosions/explosion2-41.png
227
+ - resources/images/explosions/explosion2-42.png
228
+ - resources/images/explosions/explosion2-43.png
229
+ - resources/images/explosions/explosion2-44.png
230
+ - resources/images/explosions/explosion2-45.png
231
+ - resources/images/explosions/explosion2-46.png
232
+ - resources/images/explosions/explosion2-47.png
233
+ - resources/images/explosions/explosion2-48.png
234
+ - resources/images/explosions/explosion2-49.png
235
+ - resources/images/explosions/explosion2-5.png
236
+ - resources/images/explosions/explosion2-50.png
237
+ - resources/images/explosions/explosion2-51.png
238
+ - resources/images/explosions/explosion2-52.png
239
+ - resources/images/explosions/explosion2-53.png
240
+ - resources/images/explosions/explosion2-54.png
241
+ - resources/images/explosions/explosion2-55.png
242
+ - resources/images/explosions/explosion2-56.png
243
+ - resources/images/explosions/explosion2-57.png
244
+ - resources/images/explosions/explosion2-58.png
245
+ - resources/images/explosions/explosion2-59.png
246
+ - resources/images/explosions/explosion2-6.png
247
+ - resources/images/explosions/explosion2-60.png
248
+ - resources/images/explosions/explosion2-61.png
249
+ - resources/images/explosions/explosion2-62.png
250
+ - resources/images/explosions/explosion2-63.png
251
+ - resources/images/explosions/explosion2-64.png
252
+ - resources/images/explosions/explosion2-65.png
253
+ - resources/images/explosions/explosion2-66.png
254
+ - resources/images/explosions/explosion2-67.png
255
+ - resources/images/explosions/explosion2-68.png
256
+ - resources/images/explosions/explosion2-69.png
257
+ - resources/images/explosions/explosion2-7.png
258
+ - resources/images/explosions/explosion2-70.png
259
+ - resources/images/explosions/explosion2-71.png
260
+ - resources/images/explosions/explosion2-8.png
261
+ - resources/images/explosions/explosion2-9.png
262
+ - resources/images/grass.png
263
+ - resources/images/radar.png
264
+ - resources/images/turret.png
265
+ - rtanque.gemspec
266
+ - sample_bots/camper.rb
267
+ - sample_bots/keyboard.rb
268
+ - sample_bots/seek_and_destroy.rb
269
+ - screenshots/battle_1.png
270
+ - screenshots/battle_2.png
271
+ - spec/rtanque/bot_spec.rb
272
+ - spec/rtanque/heading_spec.rb
273
+ - spec/rtanque/match_spec.rb
274
+ - spec/rtanque/normalized_attr_spec.rb
275
+ - spec/rtanque/point_spec.rb
276
+ - spec/rtanque/radar_spec.rb
277
+ - spec/rtanque/shell_spec.rb
278
+ - spec/rtanque_spec.rb
279
+ - spec/spec_helper.rb
280
+ - templates/bot.erb
281
+ homepage: https://github.com/awilliams/RTanque
282
+ licenses:
283
+ - MIT
284
+ metadata: {}
285
+ post_install_message:
286
+ rdoc_options: []
287
+ require_paths:
288
+ - lib
289
+ required_ruby_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ required_rubygems_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ requirements: []
300
+ rubyforge_project:
301
+ rubygems_version: 2.6.7
302
+ signing_key:
303
+ specification_version: 4
304
+ summary: RTanque is a game for programmers. Players program the brain of a tank and
305
+ then send their tank into battle against other tanks.
306
+ test_files:
307
+ - spec/rtanque/bot_spec.rb
308
+ - spec/rtanque/heading_spec.rb
309
+ - spec/rtanque/match_spec.rb
310
+ - spec/rtanque/normalized_attr_spec.rb
311
+ - spec/rtanque/point_spec.rb
312
+ - spec/rtanque/radar_spec.rb
313
+ - spec/rtanque/shell_spec.rb
314
+ - spec/rtanque_spec.rb
315
+ - spec/spec_helper.rb