rtanque 0.0.2 → 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2710b201f052939f4fdf9e2816050597b26e948e
4
+ data.tar.gz: 8273925c71ec90ecce35e5c8041674fe300dfeb7
5
+ SHA512:
6
+ metadata.gz: 38ccf85cf7d8c1a36d9ede963892303865b611db05111e283d8baccdc27f3b86db48b384a6e5dd5535cb88aef076c27f60f0eb7646c7eefd7acc73f4b08d3752
7
+ data.tar.gz: be0f95f95194b3e72f0574478869a756615aafbaa0b10772e588eee2aee5e2c37495f53524e3883f5b6a97288d2873fb5a5aa19cc127be1f33dc067ed0c855b7
data/.travis.yml CHANGED
@@ -2,7 +2,6 @@ language: ruby
2
2
  gemfile: Gemfile.ci
3
3
  script: bundle exec rspec
4
4
  rvm:
5
- - 1.8.7
6
5
  - 1.9.2
7
6
  - 1.9.3
8
7
  - 2.0.0
data/README.md CHANGED
@@ -50,11 +50,20 @@ Make a project directory, init bundler, add the RTanque gem, and create a bot:
50
50
  * [RTanque::Heading](http://rubydoc.info/github/awilliams/RTanque/master/frames/RTanque/Heading)
51
51
  * [RTanque::Point](http://rubydoc.info/github/awilliams/RTanque/master/frames/RTanque/Point)
52
52
 
53
+ ## Sharing
54
+ At some point you'll want to compete against other bots, or maybe you'll even organize a small tournament. Sharing bots is easy.
55
+
56
+ Ask your friends to upload their bot(s) in a [gist](https://gist.github.com/), which you can then download with the following command:
57
+
58
+ bundle exec rtanque get_gist <gist_id> ...
59
+
60
+ If you'd like to publicly share your bot, post its gist id on the wiki https://github.com/awilliams/RTanque/wiki/bot-gists
61
+
53
62
  ## Bot API
54
63
 
55
64
  The tank api consists of reading input from Brain#sensors and giving output to Brain#command
56
65
 
57
- **Brain#sensors**
66
+ **[Brain#sensors](http://rubydoc.info/github/awilliams/RTanque/master/frames/RTanque/Bot/Sensors)**
58
67
 
59
68
  ```ruby
60
69
  class Bot < RTanque::Bot::Brain
@@ -75,7 +84,7 @@ class Bot < RTanque::Bot::Brain
75
84
  end
76
85
  end
77
86
  ```
78
- **Brain#command**
87
+ **[Brain#command](http://rubydoc.info/github/awilliams/RTanque/master/frames/RTanque/Bot/Command)**
79
88
 
80
89
  ```ruby
81
90
  class Bot < RTanque::Bot::Brain
data/bin/rtanque CHANGED
@@ -26,7 +26,9 @@ LONGDESC
26
26
  method_option :gui, :default => true, :type => :boolean, :banner => 'false to run headless'
27
27
  method_option :gc, :default => true, :type => :boolean, :banner => 'disable GC (EXPERIMENTAL)'
28
28
  method_option :quiet, :aliases => '-q', :default => false, :type => :boolean, :banner => 'disable chatter'
29
+ method_option :seed, :default => Kernel.srand, :type => :numeric, :banner => 'random number seed value'
29
30
  def start(*brain_paths)
31
+ Kernel.srand(options[:seed])
30
32
  runner = RTanque::Runner.new(options[:width], options[:height], options[:max_ticks])
31
33
  brain_paths.each { |brain_path|
32
34
  begin
data/lib/rtanque.rb CHANGED
@@ -7,17 +7,8 @@
7
7
  # * {RTanque::Bot::Command} Instance provided to {RTanque::Bot::Brain#command}
8
8
  # * {RTanque::Heading} Handles angles
9
9
  # * {RTanque::Point} Handles coordinates
10
- # * {RTanqueCLI} CLI
11
10
  module RTanque
12
- # @!visibility private
13
- def self.round(numeric, precision = nil)
14
- if RUBY_VERSION >= '1.9'
15
- numeric.round(precision)
16
- else
17
- # https://github.com/rails/rails/blob/v2.3.8/activesupport/lib/active_support/core_ext/float/rounding.rb
18
- precision ? numeric.round : (numeric * (10 ** precision)).round / (10 ** precision).to_f
19
- end
20
- end
11
+
21
12
  end
22
13
 
23
14
  require 'rtanque/version'
@@ -21,8 +21,12 @@ module RTanque
21
21
  end
22
22
 
23
23
  def button_down?(button_id)
24
- button_id = Gosu::Window.char_to_button_id(button_id) unless button_id.kind_of?(Integer)
25
- @gui_window && @gui_window.button_down?(button_id)
24
+ if self.class.const_defined?(:Gosu)
25
+ button_id = Gosu::Window.char_to_button_id(button_id) unless button_id.kind_of?(Integer)
26
+ @gui_window && @gui_window.button_down?(button_id)
27
+ else
28
+ false
29
+ end
26
30
  end
27
31
 
28
32
  def gui_window=(gui_window)
data/lib/rtanque/gui.rb CHANGED
@@ -7,12 +7,13 @@ module RTanque
7
7
 
8
8
  module ZOrder
9
9
  BACKGROUND = -1
10
- BOT_NAME = 0
11
- BOT_BODY = 1
12
- BOT_TURRET = 2
13
- BOT_RADAR = 3
14
- SHELL = 4
15
- EXPLOSION = 10
10
+ BOT_HEALTH = 5
11
+ BOT_NAME = 6
12
+ BOT_BODY = 7
13
+ BOT_TURRET = 8
14
+ BOT_RADAR = 9
15
+ SHELL = 10
16
+ EXPLOSION = 20
16
17
  end
17
18
  end
18
19
  end
@@ -1,16 +1,23 @@
1
1
  require 'gosu'
2
+ require 'texplay'
3
+
4
+ require 'rtanque/gui/bot/health_color_calculator'
2
5
 
3
6
  module RTanque
4
7
  module Gui
5
8
  class Bot
6
9
  attr_reader :bot
7
10
 
11
+ HEALTH_BAR_HEIGHT = 3
12
+ HEALTH_BAR_WIDTH = 100
13
+
8
14
  def initialize(window, bot)
9
15
  @window = window
10
16
  @bot = bot
11
17
  @body_image = Gosu::Image.new(@window, Gui.resource_path("images/body.png"))
12
18
  @turret_image = Gosu::Image.new(@window, Gui.resource_path("images/turret.png"))
13
19
  @radar_image = Gosu::Image.new(@window, Gui.resource_path("images/radar.png"))
20
+ @score_bar_image = TexPlay.create_blank_image(@window, HEALTH_BAR_WIDTH, HEALTH_BAR_HEIGHT)
14
21
  @name_font = Gosu::Font.new(@window, Window::FONT_NAME, Window::SMALL_FONT_SIZE)
15
22
  @x_factor = 1
16
23
  @y_factor = 1
@@ -20,6 +27,7 @@ module RTanque
20
27
  position = [@bot.position.x, @window.height - @bot.position.y]
21
28
  draw_bot(position)
22
29
  draw_name(position)
30
+ draw_health(position)
23
31
  end
24
32
 
25
33
  def grow(factor = 2, step = 0.002)
@@ -37,6 +45,27 @@ module RTanque
37
45
  x,y = *position
38
46
  @name_font.draw_rel(self.bot.name, x, y + (RTanque::Bot::RADIUS * @y_factor) + Window::SMALL_FONT_SIZE.to_i, ZOrder::BOT_NAME, 0.5, 0.5, @x_factor, @y_factor)
39
47
  end
48
+
49
+ def draw_health(position)
50
+ x,y = *position
51
+ x_health = health.round(0)
52
+ health_color = color_for_health
53
+ @score_bar_image.paint {
54
+ rect 0, 0, HEALTH_BAR_WIDTH, HEALTH_BAR_HEIGHT, :color => [0,0,0,0], :fill => true
55
+ rect 0, 0, x_health, HEALTH_BAR_HEIGHT, :color => health_color, :fill => true
56
+ }
57
+ @score_bar_image.draw(x - (HEALTH_BAR_WIDTH/2) * @x_factor, y + (5 + RTanque::Bot::RADIUS) * @y_factor, ZOrder::BOT_HEALTH, @x_factor, @y_factor)
58
+ end
59
+
60
+ private
61
+
62
+ def color_for_health
63
+ HealthColorCalculator.new(health).color_as_rgb
64
+ end
65
+
66
+ def health
67
+ self.bot.health
68
+ end
40
69
  end
41
70
  end
42
- end
71
+ end
@@ -0,0 +1,37 @@
1
+ module RTanque
2
+ module Gui
3
+ class Bot
4
+ class HealthColorCalculator
5
+
6
+ # different health-clors as RGB values
7
+ FULL_HEALTH_COLOR = [ 74, 190, 74].map { |v| v/255.0 }
8
+ MEDIUM_HEALTH_COLOR = [255, 190, 0].map { |v| v/255.0 }
9
+ LOW_HEALTH_COLOR = [220, 0, 0].map { |v| v/255.0 }
10
+
11
+ attr_reader :health
12
+
13
+ def initialize(health)
14
+ @health = health
15
+ end
16
+
17
+ def color_as_rgb
18
+ if health > 50
19
+ percentage = ((100 - health) / 50)
20
+ color_between FULL_HEALTH_COLOR, MEDIUM_HEALTH_COLOR, percentage
21
+ else
22
+ percentage = ((50 - health) / 50)
23
+ color_between MEDIUM_HEALTH_COLOR, LOW_HEALTH_COLOR, percentage
24
+ end
25
+ end
26
+
27
+ def color_between(color_a, color_b, percentage)
28
+ [
29
+ (color_b[0] - color_a[0]) * percentage + color_a[0],
30
+ (color_b[1] - color_a[1]) * percentage + color_a[1],
31
+ (color_b[2] - color_a[2]) * percentage + color_a[2]
32
+ ]
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -59,7 +59,7 @@ module RTanque
59
59
  end
60
60
 
61
61
  def self.rand
62
- self.new(Float.send(:rand) * FULL_ANGLE)
62
+ self.new(Kernel.rand * FULL_ANGLE)
63
63
  end
64
64
 
65
65
  attr_reader :radians
@@ -67,7 +67,7 @@ module RTanque
67
67
  # Creates a new RTanque::Heading
68
68
  # @param [#to_f] radians degree to wrap (in radians)
69
69
  def initialize(radians = NORTH)
70
- @radians = self.extract_radians_from_value(radians) % FULL_ANGLE
70
+ @radians = radians.to_f % FULL_ANGLE
71
71
  @memoized = {} # allow memoization since @some_var ||= x doesn't work when frozen
72
72
  self.freeze
73
73
  end
@@ -108,7 +108,7 @@ module RTanque
108
108
  # @param [#to_f] other_heading
109
109
  # @return [RTanque::Heading]
110
110
  def +(other_heading)
111
- self.class.new(self.radians + self.extract_radians_from_value(other_heading))
111
+ self.class.new(self.radians + other_heading.to_f)
112
112
  end
113
113
 
114
114
  # @param [#to_f] other_heading
@@ -120,7 +120,7 @@ module RTanque
120
120
  # @param [#to_f] other_heading
121
121
  # @return [RTanque::Heading]
122
122
  def *(other_heading)
123
- self.class.new(self.radians * self.extract_radians_from_value(other_heading))
123
+ self.class.new(self.radians * other_heading.to_f)
124
124
  end
125
125
 
126
126
  # @param [#to_f] other_heading
@@ -158,15 +158,5 @@ module RTanque
158
158
  def to_degrees
159
159
  @memoized[:to_degrees] ||= (self.radians * 180.0) / Math::PI
160
160
  end
161
-
162
- protected
163
-
164
- def extract_radians_from_value(value)
165
- if value.respond_to?(:radians)
166
- value.radians
167
- else
168
- value.to_f
169
- end
170
- end
171
161
  end
172
162
  end
data/lib/rtanque/match.rb CHANGED
@@ -49,7 +49,7 @@ module RTanque
49
49
 
50
50
  def pre_shell_tick(shell)
51
51
  shell.hits(self.bots.all_but(shell.bot)) do |origin_bot, bot_hit|
52
- damage = (shell.fire_power ** RTanque::Shell::RATIO)
52
+ damage = (shell.fire_power**RTanque::Shell::RATIO)
53
53
  bot_hit.reduce_health(damage)
54
54
  if bot_hit.dead?
55
55
  @explosions.add(Explosion.new(bot_hit.position))
data/lib/rtanque/point.rb CHANGED
@@ -111,8 +111,8 @@ module RTanque
111
111
 
112
112
  def move(heading, speed, bound_to_arena = true)
113
113
  # round to avoid floating point errors
114
- x = RTanque.round((self.x + (Math.sin(heading) * speed)), 10)
115
- y = RTanque.round((self.y + (Math.cos(heading) * speed)), 10)
114
+ x = (self.x + (Math.sin(heading) * speed)).round(10)
115
+ y = (self.y + (Math.cos(heading) * speed)).round(10)
116
116
  self.class.new(x, y, self.arena) { |point| point.bind_to_arena if bound_to_arena }
117
117
  end
118
118
 
@@ -1,3 +1,3 @@
1
1
  module RTanque
2
- VERSION = '0.0.2'
2
+ VERSION = '0.1.0'
3
3
  end
data/rtanque.gemspec CHANGED
@@ -26,6 +26,7 @@ Have fun competing against friends' tanks or the sample ones included. Maybe you
26
26
  gem.add_dependency 'configuration', '~> 1.3.2'
27
27
  gem.add_dependency 'octokit', '~> 1.23.0'
28
28
  gem.add_dependency 'thor', '~> 0.17.0'
29
+ gem.add_dependency 'texplay'
29
30
 
30
31
  gem.add_development_dependency 'pry'
31
32
  gem.add_development_dependency 'rspec', '~> 2.13.0'
@@ -52,8 +52,8 @@ describe RTanque::Heading do
52
52
 
53
53
  it 'correctly handles when a and b are on both sides of 180' do
54
54
  @instance = described_class.new(RTanque::Heading::S - RTanque::Heading::ONE_DEGREE)
55
- delta = RTanque.round(@instance.delta(RTanque::Heading::S + RTanque::Heading::ONE_DEGREE), 5)
56
- expected = RTanque.round(RTanque::Heading::ONE_DEGREE * 2, 5)
55
+ delta = (@instance.delta(RTanque::Heading::S + RTanque::Heading::ONE_DEGREE)).round(5)
56
+ expected = (RTanque::Heading::ONE_DEGREE * 2).round(5)
57
57
  expect(delta).to eq(expected)
58
58
  end
59
59
  end
data/spec/rtanque_spec.rb CHANGED
@@ -1,6 +1,34 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe RTanque do
4
- let(:bot){ RTanque::Bot.new(@arena, TestBrain) }
5
- # TODO: integration tests
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
+
6
34
  end
data/templates/bot.erb CHANGED
@@ -4,8 +4,14 @@ class <%= @bot_class_name %> < RTanque::Bot::Brain
4
4
 
5
5
  def tick!
6
6
  ## main logic goes here
7
+
7
8
  # use self.sensors to detect things
9
+ # See http://rubydoc.info/github/awilliams/RTanque/master/RTanque/Bot/Sensors
10
+
8
11
  # use self.command to control tank
12
+ # See http://rubydoc.info/github/awilliams/RTanque/master/RTanque/Bot/Command
13
+
9
14
  # self.arena contains the dimensions of the arena
15
+ # See http://rubydoc.info/github/awilliams/RTanque/master/frames/RTanque/Arena
10
16
  end
11
- end
17
+ end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rtanque
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Adam Williams
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-10 00:00:00.000000000 Z
11
+ date: 2013-04-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: gosu
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: configuration
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: octokit
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: thor
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,31 +62,41 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
77
68
  version: 0.17.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: texplay
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
78
83
  - !ruby/object:Gem::Dependency
79
84
  name: pry
80
85
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
86
  requirements:
83
- - - ! '>='
87
+ - - '>='
84
88
  - !ruby/object:Gem::Version
85
89
  version: '0'
86
90
  type: :development
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
93
  requirements:
91
- - - ! '>='
94
+ - - '>='
92
95
  - !ruby/object:Gem::Version
93
96
  version: '0'
94
97
  - !ruby/object:Gem::Dependency
95
98
  name: rspec
96
99
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
100
  requirements:
99
101
  - - ~>
100
102
  - !ruby/object:Gem::Version
@@ -102,7 +104,6 @@ dependencies:
102
104
  type: :development
103
105
  prerelease: false
104
106
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
107
  requirements:
107
108
  - - ~>
108
109
  - !ruby/object:Gem::Version
@@ -110,7 +111,6 @@ dependencies:
110
111
  - !ruby/object:Gem::Dependency
111
112
  name: rspec-mocks
112
113
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
114
  requirements:
115
115
  - - ~>
116
116
  - !ruby/object:Gem::Version
@@ -118,24 +118,16 @@ dependencies:
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
121
  requirements:
123
122
  - - ~>
124
123
  - !ruby/object:Gem::Version
125
124
  version: 2.13.0
126
- description: ! 'RTanque is a game for programmers. Players program the brain of a
127
- tank and then send their tank+brain into battle with other tanks. All tanks are
128
- otherwise equal.
129
-
130
-
131
- Rules of the game are simple: Last bot standing wins. Gameplay is also pretty simple.
132
- Each tank has a base, turret and radar, each of which rotate independently. The
133
- base moves the tank, the turret has a gun mounted to it which can fire at other
134
- tanks, and the radar detects other tanks in its field of vision.
125
+ description: |-
126
+ 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.
135
127
 
128
+ 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.
136
129
 
137
- Have fun competing against friends'' tanks or the sample ones included. Maybe you''ll
138
- start a small league at your local Ruby meetup.'
130
+ Have fun competing against friends' tanks or the sample ones included. Maybe you'll start a small league at your local Ruby meetup.
139
131
  email:
140
132
  - pwnfactory@gmail.com
141
133
  executables:
@@ -167,6 +159,7 @@ files:
167
159
  - lib/rtanque/explosion.rb
168
160
  - lib/rtanque/gui.rb
169
161
  - lib/rtanque/gui/bot.rb
162
+ - lib/rtanque/gui/bot/health_color_calculator.rb
170
163
  - lib/rtanque/gui/draw_group.rb
171
164
  - lib/rtanque/gui/explosion.rb
172
165
  - lib/rtanque/gui/shell.rb
@@ -275,27 +268,26 @@ files:
275
268
  homepage: https://github.com/awilliams/RTanque
276
269
  licenses:
277
270
  - MIT
271
+ metadata: {}
278
272
  post_install_message:
279
273
  rdoc_options: []
280
274
  require_paths:
281
275
  - lib
282
276
  required_ruby_version: !ruby/object:Gem::Requirement
283
- none: false
284
277
  requirements:
285
- - - ! '>='
278
+ - - '>='
286
279
  - !ruby/object:Gem::Version
287
280
  version: '0'
288
281
  required_rubygems_version: !ruby/object:Gem::Requirement
289
- none: false
290
282
  requirements:
291
- - - ! '>='
283
+ - - '>='
292
284
  - !ruby/object:Gem::Version
293
285
  version: '0'
294
286
  requirements: []
295
287
  rubyforge_project:
296
- rubygems_version: 1.8.25
288
+ rubygems_version: 2.0.3
297
289
  signing_key:
298
- specification_version: 3
290
+ specification_version: 4
299
291
  summary: RTanque is a game for programmers. Players program the brain of a tank and
300
292
  then send their tank into battle against other tanks.
301
293
  test_files: