UG_RRobots 2.0 → 2.1

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 (176) hide show
  1. data/Rakefile +20 -4
  2. data/bin/rrobots +48 -17
  3. data/config/locales/en.yml +4 -2
  4. data/config/locales/fr.yml +3 -1
  5. data/doc/install.rdoc +20 -20
  6. data/doc/install_fr.rdoc +20 -20
  7. data/lib/GUI/gosu.rb +237 -0
  8. data/lib/GUI/tk.rb +215 -0
  9. data/lib/battlefield.rb +2 -0
  10. data/lib/mines.rb +36 -0
  11. data/lib/misc.rb +7 -4
  12. data/lib/robotrunner.rb +4 -0
  13. data/medias/gosu/images/blue_body000.bmp +0 -0
  14. data/medias/gosu/images/blue_radar000.bmp +0 -0
  15. data/medias/gosu/images/blue_turret000.bmp +0 -0
  16. data/medias/gosu/images/bullet.png +0 -0
  17. data/medias/gosu/images/explosion00.bmp +0 -0
  18. data/medias/gosu/images/explosion01.bmp +0 -0
  19. data/medias/gosu/images/explosion02.bmp +0 -0
  20. data/medias/gosu/images/explosion03.bmp +0 -0
  21. data/medias/gosu/images/explosion04.bmp +0 -0
  22. data/medias/gosu/images/explosion05.bmp +0 -0
  23. data/medias/gosu/images/explosion06.bmp +0 -0
  24. data/medias/gosu/images/explosion07.bmp +0 -0
  25. data/medias/gosu/images/explosion08.bmp +0 -0
  26. data/medias/gosu/images/explosion09.bmp +0 -0
  27. data/medias/gosu/images/explosion10.bmp +0 -0
  28. data/medias/gosu/images/explosion11.bmp +0 -0
  29. data/medias/gosu/images/explosion12.bmp +0 -0
  30. data/medias/gosu/images/explosion13.bmp +0 -0
  31. data/medias/gosu/images/explosion14.bmp +0 -0
  32. data/medias/gosu/images/lime_body000.bmp +0 -0
  33. data/medias/gosu/images/lime_radar000.bmp +0 -0
  34. data/medias/gosu/images/lime_turret000.bmp +0 -0
  35. data/medias/gosu/images/mine.png +0 -0
  36. data/medias/gosu/images/red_body000.bmp +0 -0
  37. data/medias/gosu/images/red_radar000.bmp +0 -0
  38. data/medias/gosu/images/red_turret000.bmp +0 -0
  39. data/medias/gosu/images/space.png +0 -0
  40. data/medias/gosu/images/toolbox.png +0 -0
  41. data/medias/gosu/images/white_body000.bmp +0 -0
  42. data/medias/gosu/images/white_radar000.bmp +0 -0
  43. data/medias/gosu/images/white_turret000.bmp +0 -0
  44. data/medias/gosu/images/yellow_body000.bmp +0 -0
  45. data/medias/gosu/images/yellow_radar000.bmp +0 -0
  46. data/medias/gosu/images/yellow_turret000.bmp +0 -0
  47. data/medias/gosu/music/song.mod +0 -0
  48. data/medias/gosu/sounds/shotborn.wav +0 -0
  49. data/medias/gosu/sounds/sunexp.wav +0 -0
  50. data/{images → medias/tk/images}/explosion00.gif +0 -0
  51. data/{images → medias/tk/images}/explosion01.gif +0 -0
  52. data/{images → medias/tk/images}/explosion02.gif +0 -0
  53. data/{images → medias/tk/images}/explosion03.gif +0 -0
  54. data/{images → medias/tk/images}/explosion04.gif +0 -0
  55. data/{images → medias/tk/images}/explosion05.gif +0 -0
  56. data/{images → medias/tk/images}/explosion06.gif +0 -0
  57. data/{images → medias/tk/images}/explosion07.gif +0 -0
  58. data/{images → medias/tk/images}/explosion08.gif +0 -0
  59. data/{images → medias/tk/images}/explosion09.gif +0 -0
  60. data/{images → medias/tk/images}/explosion10.gif +0 -0
  61. data/{images → medias/tk/images}/explosion11.gif +0 -0
  62. data/{images → medias/tk/images}/explosion12.gif +0 -0
  63. data/{images → medias/tk/images}/explosion13.gif +0 -0
  64. data/{images → medias/tk/images}/explosion14.gif +0 -0
  65. data/medias/tk/images/mine.gif +0 -0
  66. data/{images → medias/tk/images}/red_body000.gif +0 -0
  67. data/{images → medias/tk/images}/red_body010.gif +0 -0
  68. data/{images → medias/tk/images}/red_body020.gif +0 -0
  69. data/{images → medias/tk/images}/red_body030.gif +0 -0
  70. data/{images → medias/tk/images}/red_body040.gif +0 -0
  71. data/{images → medias/tk/images}/red_body050.gif +0 -0
  72. data/{images → medias/tk/images}/red_body060.gif +0 -0
  73. data/{images → medias/tk/images}/red_body070.gif +0 -0
  74. data/{images → medias/tk/images}/red_body080.gif +0 -0
  75. data/{images → medias/tk/images}/red_body090.gif +0 -0
  76. data/{images → medias/tk/images}/red_body100.gif +0 -0
  77. data/{images → medias/tk/images}/red_body110.gif +0 -0
  78. data/{images → medias/tk/images}/red_body120.gif +0 -0
  79. data/{images → medias/tk/images}/red_body130.gif +0 -0
  80. data/{images → medias/tk/images}/red_body140.gif +0 -0
  81. data/{images → medias/tk/images}/red_body150.gif +0 -0
  82. data/{images → medias/tk/images}/red_body160.gif +0 -0
  83. data/{images → medias/tk/images}/red_body170.gif +0 -0
  84. data/{images → medias/tk/images}/red_body180.gif +0 -0
  85. data/{images → medias/tk/images}/red_body190.gif +0 -0
  86. data/{images → medias/tk/images}/red_body200.gif +0 -0
  87. data/{images → medias/tk/images}/red_body210.gif +0 -0
  88. data/{images → medias/tk/images}/red_body220.gif +0 -0
  89. data/{images → medias/tk/images}/red_body230.gif +0 -0
  90. data/{images → medias/tk/images}/red_body240.gif +0 -0
  91. data/{images → medias/tk/images}/red_body250.gif +0 -0
  92. data/{images → medias/tk/images}/red_body260.gif +0 -0
  93. data/{images → medias/tk/images}/red_body270.gif +0 -0
  94. data/{images → medias/tk/images}/red_body280.gif +0 -0
  95. data/{images → medias/tk/images}/red_body290.gif +0 -0
  96. data/{images → medias/tk/images}/red_body300.gif +0 -0
  97. data/{images → medias/tk/images}/red_body310.gif +0 -0
  98. data/{images → medias/tk/images}/red_body320.gif +0 -0
  99. data/{images → medias/tk/images}/red_body330.gif +0 -0
  100. data/{images → medias/tk/images}/red_body340.gif +0 -0
  101. data/{images → medias/tk/images}/red_body350.gif +0 -0
  102. data/{images → medias/tk/images}/red_radar000.gif +0 -0
  103. data/{images → medias/tk/images}/red_radar010.gif +0 -0
  104. data/{images → medias/tk/images}/red_radar020.gif +0 -0
  105. data/{images → medias/tk/images}/red_radar030.gif +0 -0
  106. data/{images → medias/tk/images}/red_radar040.gif +0 -0
  107. data/{images → medias/tk/images}/red_radar050.gif +0 -0
  108. data/{images → medias/tk/images}/red_radar060.gif +0 -0
  109. data/{images → medias/tk/images}/red_radar070.gif +0 -0
  110. data/{images → medias/tk/images}/red_radar080.gif +0 -0
  111. data/{images → medias/tk/images}/red_radar090.gif +0 -0
  112. data/{images → medias/tk/images}/red_radar100.gif +0 -0
  113. data/{images → medias/tk/images}/red_radar110.gif +0 -0
  114. data/{images → medias/tk/images}/red_radar120.gif +0 -0
  115. data/{images → medias/tk/images}/red_radar130.gif +0 -0
  116. data/{images → medias/tk/images}/red_radar140.gif +0 -0
  117. data/{images → medias/tk/images}/red_radar150.gif +0 -0
  118. data/{images → medias/tk/images}/red_radar160.gif +0 -0
  119. data/{images → medias/tk/images}/red_radar170.gif +0 -0
  120. data/{images → medias/tk/images}/red_radar180.gif +0 -0
  121. data/{images → medias/tk/images}/red_radar190.gif +0 -0
  122. data/{images → medias/tk/images}/red_radar200.gif +0 -0
  123. data/{images → medias/tk/images}/red_radar210.gif +0 -0
  124. data/{images → medias/tk/images}/red_radar220.gif +0 -0
  125. data/{images → medias/tk/images}/red_radar230.gif +0 -0
  126. data/{images → medias/tk/images}/red_radar240.gif +0 -0
  127. data/{images → medias/tk/images}/red_radar250.gif +0 -0
  128. data/{images → medias/tk/images}/red_radar260.gif +0 -0
  129. data/{images → medias/tk/images}/red_radar270.gif +0 -0
  130. data/{images → medias/tk/images}/red_radar280.gif +0 -0
  131. data/{images → medias/tk/images}/red_radar290.gif +0 -0
  132. data/{images → medias/tk/images}/red_radar300.gif +0 -0
  133. data/{images → medias/tk/images}/red_radar310.gif +0 -0
  134. data/{images → medias/tk/images}/red_radar320.gif +0 -0
  135. data/{images → medias/tk/images}/red_radar330.gif +0 -0
  136. data/{images → medias/tk/images}/red_radar340.gif +0 -0
  137. data/{images → medias/tk/images}/red_radar350.gif +0 -0
  138. data/{images → medias/tk/images}/red_turret000.gif +0 -0
  139. data/{images → medias/tk/images}/red_turret010.gif +0 -0
  140. data/{images → medias/tk/images}/red_turret020.gif +0 -0
  141. data/{images → medias/tk/images}/red_turret030.gif +0 -0
  142. data/{images → medias/tk/images}/red_turret040.gif +0 -0
  143. data/{images → medias/tk/images}/red_turret050.gif +0 -0
  144. data/{images → medias/tk/images}/red_turret060.gif +0 -0
  145. data/{images → medias/tk/images}/red_turret070.gif +0 -0
  146. data/{images → medias/tk/images}/red_turret080.gif +0 -0
  147. data/{images → medias/tk/images}/red_turret090.gif +0 -0
  148. data/{images → medias/tk/images}/red_turret100.gif +0 -0
  149. data/{images → medias/tk/images}/red_turret110.gif +0 -0
  150. data/{images → medias/tk/images}/red_turret120.gif +0 -0
  151. data/{images → medias/tk/images}/red_turret130.gif +0 -0
  152. data/{images → medias/tk/images}/red_turret140.gif +0 -0
  153. data/{images → medias/tk/images}/red_turret150.gif +0 -0
  154. data/{images → medias/tk/images}/red_turret160.gif +0 -0
  155. data/{images → medias/tk/images}/red_turret170.gif +0 -0
  156. data/{images → medias/tk/images}/red_turret180.gif +0 -0
  157. data/{images → medias/tk/images}/red_turret190.gif +0 -0
  158. data/{images → medias/tk/images}/red_turret200.gif +0 -0
  159. data/{images → medias/tk/images}/red_turret210.gif +0 -0
  160. data/{images → medias/tk/images}/red_turret220.gif +0 -0
  161. data/{images → medias/tk/images}/red_turret230.gif +0 -0
  162. data/{images → medias/tk/images}/red_turret240.gif +0 -0
  163. data/{images → medias/tk/images}/red_turret250.gif +0 -0
  164. data/{images → medias/tk/images}/red_turret260.gif +0 -0
  165. data/{images → medias/tk/images}/red_turret270.gif +0 -0
  166. data/{images → medias/tk/images}/red_turret280.gif +0 -0
  167. data/{images → medias/tk/images}/red_turret290.gif +0 -0
  168. data/{images → medias/tk/images}/red_turret300.gif +0 -0
  169. data/{images → medias/tk/images}/red_turret310.gif +0 -0
  170. data/{images → medias/tk/images}/red_turret320.gif +0 -0
  171. data/{images → medias/tk/images}/red_turret330.gif +0 -0
  172. data/{images → medias/tk/images}/red_turret340.gif +0 -0
  173. data/{images → medias/tk/images}/red_turret350.gif +0 -0
  174. data/{images → medias/tk/images}/toolbox.gif +0 -0
  175. metadata +168 -128
  176. data/lib/tkarena.rb +0 -194
data/Rakefile CHANGED
@@ -1,17 +1,20 @@
1
1
  require 'rubygems'
2
+
2
3
  require 'rake'
3
4
  require "rake/clean"
4
5
  require "rake/gempackagetask"
6
+ require "rake/rdoctask"
7
+
5
8
 
6
9
  spec = Gem::Specification.new do |s|
7
10
  s.name = "UG_RRobots"
8
- s.version = "2.0"
11
+ s.version = "2.1"
9
12
  s.author = "Simon Kröger, Romain GEORGES"
10
13
  s.email = "dev@ultragreen.net"
11
14
  s.homepage = "http://www.ultragreen.net/projects/rrobots"
12
15
  s.platform = Gem::Platform::RUBY
13
16
  s.summary = "Ultragreen RRobots Fork with new features like toolboxes, config file, gemified"
14
- s.files = FileList["{bin,lib,images,config,doc,contribs,robots}/**/*"].to_a.concat(['COPYRIGHT.txt','Rakefile'])
17
+ s.files = FileList["{bin,lib,medias,config,doc,contribs,robots}/**/*"].to_a.concat(['COPYRIGHT.txt','Rakefile'])
15
18
  s.require_path = "lib"
16
19
  # s.autorequire = "name"
17
20
  # s.test_files = FileList["{test}/**/*test.rb"].to_a
@@ -21,9 +24,22 @@ spec = Gem::Specification.new do |s|
21
24
  s.bindir = 'bin'
22
25
  s.executables = ['rrobots','tournament']
23
26
  s.description = "Ultragreen RRobots Fork"
24
- s.rdoc_options << '--title' << 'UG RRobots a RRobots project Fork ' << '--main' << 'doc/manual.rdoc' << '--line-numbers' << '--exclude' << 'robots images' << '--diagram'
27
+ s.rdoc_options << '--title' << 'UG RRobots a RRobots project Fork ' << '--main' << 'doc/manual.rdoc' << '--line-numbers' << '--exclude' << 'contribs robots medias' << '--diagram'
25
28
  end
29
+
26
30
 
27
31
  Rake::GemPackageTask.new(spec) do |pkg|
28
32
  pkg.need_tar = true
29
- end
33
+ end
34
+
35
+ Rake::RDocTask.new('rdoc') do |d|
36
+ d.rdoc_files.include('doc/**/*','lib/**/*.rb','bin/*')
37
+ d.main = 'doc/manual.rdoc'
38
+ d.title = 'UG RRobots a RRobots project Fork '
39
+ d.options << '--line-numbers' << '--exclude' << 'contribs robots medias' << '--diagram' << '-SHN'
40
+ end
41
+
42
+ task :default => [:gem]
43
+
44
+
45
+
data/bin/rrobots CHANGED
@@ -40,6 +40,7 @@ require 'battlefield'
40
40
 
41
41
 
42
42
  init_I18n get_locale_from_env
43
+ @locales = I18n.backend.available_locales
43
44
 
44
45
  ##############################################
45
46
  # arena
@@ -66,21 +67,12 @@ def run_out_of_gui(battlefield)
66
67
  end
67
68
 
68
69
  def run_in_gui(battlefield, xres, yres, speed_multiplier)
69
- require 'tkarena'
70
- arena = TkArena.new(battlefield, xres, yres, speed_multiplier)
71
- game_over_counter = battlefield.teams.all?{|k,t| t.size < 2} ? 250 : 500
72
- outcome_printed = false
73
- arena.on_game_over{|battlefield|
74
- unless outcome_printed
75
- print_outcome(battlefield)
76
- outcome_printed = true
77
- end
78
- exit 0 if game_over_counter < 0
79
- game_over_counter -= 1
80
- }
81
- arena.run
70
+ require "GUI/#{@engine}"
71
+ load_gui(battlefield, xres, yres, speed_multiplier)
82
72
  end
83
73
 
74
+
75
+
84
76
  def print_outcome(battlefield)
85
77
  winners = battlefield.robots.find_all{|robot| !robot.dead}
86
78
  puts
@@ -121,7 +113,15 @@ def print_outcome(battlefield)
121
113
  end
122
114
 
123
115
 
124
-
116
+ def array_gui_engines
117
+ my_res = Array::new
118
+ engines_path = gem_path('lib')
119
+ Dir["#{engines_path}/GUI/*.rb"].each {|file|
120
+ engine = File.basename(file, ".rb")
121
+ my_res.push engine
122
+ }
123
+ return my_res
124
+ end
125
125
 
126
126
  def hash_internals
127
127
  my_res = Hash::new
@@ -142,21 +142,45 @@ def list_internals
142
142
  end
143
143
  end
144
144
 
145
+ def list_gui_engines
146
+ title = I18n.t('rrobots.list_gui_engines_title')
147
+ puts title
148
+ puts "-"*title.size
149
+ array_gui_engines.each do |value|
150
+ puts " - #{value}"
151
+ end
152
+ end
153
+
145
154
  def list_locales
146
155
  title = I18n.t('rrobots.list_locales_title')
147
156
  puts title
148
157
  puts "-"*title.size
149
- I18n.backend.available_locales.each do |value|
158
+ @locales.each do |value|
150
159
  puts " - #{value}"
151
160
  end
152
161
  end
153
162
 
154
163
  $stdout.sync = true
155
164
 
165
+ @engine = 'tk'
166
+ ARGV.grep( /^-set-gui-engine=(\w+)/ ) do |item|
167
+ x = $1.to_s
168
+ if array_gui_engines.include?(x) then
169
+ @engine=x
170
+ else
171
+ puts I18n.t('rrobots.gui_engine_not_found')
172
+ end
173
+ ARGV.delete(item)
174
+ end
175
+
156
176
 
157
- ARGV.grep( /^-set-locale=(\w{2})/ )do |item|
177
+ ARGV.grep( /^-set-locale=(\w{2})/ ) do |item|
158
178
  x = $1.to_s
159
- I18n.locale=x
179
+ if @locales.include?(x) then
180
+ I18n.locale=x
181
+ else
182
+ I18n.locale='en'
183
+ end
160
184
  ARGV.delete(item)
161
185
  end
162
186
 
@@ -166,6 +190,13 @@ ARGV.grep(/^(-list-internals)/) do |item|
166
190
  exit 0
167
191
  end
168
192
 
193
+ # look for query for robots internal list
194
+ ARGV.grep(/^(-list-gui-engines)/) do |item|
195
+ list_gui_engines
196
+ exit 0
197
+ end
198
+
199
+
169
200
  # look for query for robots internal list
170
201
  ARGV.grep(/^(-manual)/) do |item|
171
202
  manual_file = "manual.rdoc"
@@ -2,11 +2,13 @@
2
2
  en:
3
3
  rrobots:
4
4
  list_internals_title: List of avaibles internals robots
5
- list_locales_title: List of avaible locales
5
+ list_locales_title: List of avaibles locales
6
+ list_gui_engines_title: List of avaibles GUI Engines
6
7
  match_limit_warning: match ends if only 1 bot/team left or dots get here-->|
8
+ gui_engine_not_found: The GUI Engine you have requested not exist
7
9
  battlefield:
8
10
  robot_made_an_exception: '{{robot}} made an exception'
9
- tkarena:
11
+ gui:
10
12
  ai_name_dead: '{{ai_name}} dead'
11
13
  draw: "Draw!"
12
14
  no_team_wonn: ' won!'
@@ -3,10 +3,12 @@ fr:
3
3
  rrobots:
4
4
  list_internals_title: Liste des robots disponibles en interne
5
5
  list_locales_title: Liste des locales disponibles
6
+ list_gui_engines_title: Listes des moteur GUI disponibles
6
7
  match_limit_warning: fin si 1 robot/equipe survi(e) ou ligne jusqu'ici -->|
8
+ gui_engine_not_found: The GUI Engine you have requested not exist
7
9
  battlefield:
8
10
  robot_made_an_exception: '{{robot}} a lev� une exception'
9
- tkarena:
11
+ gui:
10
12
  ai_name_dead: '{{ai_name}} d�truit'
11
13
  draw: Match nul !
12
14
  no_team_won: '{{winner_name}} a gagn� !'
data/doc/install.rdoc CHANGED
@@ -13,11 +13,11 @@ Files are sort by release
13
13
 
14
14
  *Info* : this step is mandatory only if you choose to download TGZ sources
15
15
 
16
- Exemple version 2.0 :
16
+ Exemple version 2.1 :
17
17
 
18
- $ wget http://www.ultragreen.net/attachments/download/51/UG_RRobots-2.0.tgz
19
- $ tar xvzf G_RRobots-2.0.tgz
20
- $ cd UG_RRobots-2.0/
18
+ $ wget http://www.ultragreen.net/attachments/download/51/UG_RRobots-2.1.tgz
19
+ $ tar xvzf G_RRobots-2.1.tgz
20
+ $ cd UG_RRobots-2.1/
21
21
  $ rake clean
22
22
  $ rake clobber
23
23
  $ rake gem
@@ -31,14 +31,14 @@ If you create your gem, please do :
31
31
 
32
32
  otherwise
33
33
 
34
- $ wget http://www.ultragreen.net/attachments/download/52/UG_RRobots-2.0.gem
34
+ $ wget http://www.ultragreen.net/attachments/download/52/UG_RRobots-2.1.gem
35
35
 
36
36
  == Gem Installation
37
37
 
38
38
  You should be root
39
39
 
40
40
  $ sudo bash
41
- # gem install UG_RRobots-2.0.gem
41
+ # gem install UG_RRobots-2.1.gem
42
42
 
43
43
  deinstallation :
44
44
 
@@ -52,26 +52,26 @@ deinstallation :
52
52
  YAML file : rrobots.yaml
53
53
 
54
54
  battlefield:
55
- :width: 800
56
- :height: 800
55
+ width: 800
56
+ height: 800
57
57
  bullets:
58
- :speed: 30
58
+ speed: 30
59
59
  filename: rrobots.yml
60
60
  game:
61
- :timeout: 50000
61
+ timeout: 50000
62
62
  mines:
63
- :with_mines: false
64
- :bullet_energy_resistance: 2
65
- :energy_hit_points: 20
63
+ with_mines: false
64
+ bullet_energy_resistance: 2
65
+ energy_hit_points: 20
66
66
  robots:
67
- :nb_mines: 3
68
- :radar_mine_scanning_performance: 500
69
- :energy_max: 100
67
+ nb_mines: 3
68
+ radar_mine_scanning_performance: 500
69
+ energy_max: 100
70
70
  toolboxes:
71
- :energy_heal_points: 20
72
- :life_time: 200
73
- :with_toolboxes: false
74
- :spawning_chances: 100
71
+ energy_heal_points: 20
72
+ life_time: 200
73
+ with_toolboxes: false
74
+ spawning_chances: 100
75
75
 
76
76
 
77
77
  === Config file reading order and priority
data/doc/install_fr.rdoc CHANGED
@@ -13,11 +13,11 @@ Les fichiers sont classés par Release
13
13
 
14
14
  *Remarque* : Cette étape n'est necessaire que si on choisit de télécharger les sources
15
15
 
16
- Exemple version 2.0 :
16
+ Exemple version 2.1 :
17
17
 
18
- $ wget http://www.ultragreen.net/attachments/download/51/UG_RRobots-2.0.tgz
19
- $ tar xvzf G_RRobots-2.0.tgz
20
- $ cd UG_RRobots-2.0/
18
+ $ wget http://www.ultragreen.net/attachments/download/51/UG_RRobots-2.1.tgz
19
+ $ tar xvzf G_RRobots-2.1.tgz
20
+ $ cd UG_RRobots-2.1/
21
21
  $ rake clean
22
22
  $ rake clobber
23
23
  $ rake gem
@@ -30,14 +30,14 @@ si vous installez depuis le gem fraîchement crée la partie wget du Rubygem est
30
30
 
31
31
  sinon pour récupéré le gem
32
32
 
33
- $ wget http://www.ultragreen.net/attachments/download/52/UG_RRobots-2.0.gem
33
+ $ wget http://www.ultragreen.net/attachments/download/52/UG_RRobots-2.1.gem
34
34
 
35
35
  == Installation gem
36
36
 
37
37
  On doit être root pour installer :
38
38
 
39
39
  $ sudo bash
40
- # gem install UG_RRobots-2.0.gem
40
+ # gem install UG_RRobots-2.1.gem
41
41
 
42
42
  Pour désinstaller :
43
43
 
@@ -52,26 +52,26 @@ Pour désinstaller :
52
52
  fichier YAML : rrobots.yaml
53
53
 
54
54
  battlefield:
55
- :width: 800
56
- :height: 800
55
+ width: 800
56
+ height: 800
57
57
  bullets:
58
- :speed: 30
58
+ speed: 30
59
59
  filename: rrobots.yml
60
60
  game:
61
- :timeout: 50000
61
+ timeout: 50000
62
62
  mines:
63
- :with_mines: false
64
- :bullet_energy_resistance: 2
65
- :energy_hit_points: 20
63
+ with_mines: false
64
+ bullet_energy_resistance: 2
65
+ energy_hit_points: 20
66
66
  robots:
67
- :nb_mines: 3
68
- :radar_mine_scanning_performance: 500
69
- :energy_max: 100
67
+ nb_mines: 3
68
+ radar_mine_scanning_performance: 500
69
+ energy_max: 100
70
70
  toolboxes:
71
- :energy_heal_points: 20
72
- :life_time: 200
73
- :with_toolboxes: false
74
- :spawning_chances: 100
71
+ energy_heal_points: 20
72
+ life_time: 200
73
+ with_toolboxes: false
74
+ spawning_chances: 100
75
75
 
76
76
 
77
77
  === priorité de lecture des fichiers
data/lib/GUI/gosu.rb ADDED
@@ -0,0 +1,237 @@
1
+ def load_gui(battlefield, xres, yres, speed_multiplier)
2
+ arena = GUI::RRobotsGameWindow.new(battlefield, xres, yres)
3
+ game_over_counter = battlefield.teams.all?{|k,t| t.size < 2} ? 250 : 500
4
+ outcome_printed = false
5
+ arena.on_game_over{|battlefield|
6
+ unless outcome_printed
7
+ print_outcome(battlefield)
8
+ outcome_printed = true
9
+ end
10
+ if game_over_counter < 0
11
+ arena.close
12
+ exit 0
13
+ end
14
+ game_over_counter -= 1
15
+ }
16
+ arena.show
17
+ end
18
+
19
+ require 'gosu'
20
+
21
+ module GUI
22
+
23
+ BIG_FONT = 'PortagoITC TT'
24
+ SMALL_FONT = 'Monaco'
25
+ COLORS = ['white', 'blue', 'yellow', 'red', 'lime']
26
+ FONT_COLORS = [0xffffffff, 0xff0008ff, 0xfffff706, 0xffff0613, 0xff00ff04]
27
+
28
+ BUTTONS = [Gosu::Button::KbNumpad0, Gosu::Button::KbNumpad1, Gosu::Button::KbNumpad2, Gosu::Button::KbNumpad3, Gosu::Button::KbNumpad4, Gosu::Button::KbNumpad5, Gosu::Button::KbNumpad6, Gosu::Button::KbNumpad7, Gosu::Button::KbNumpad8, Gosu::Button::KbNumpad9, Gosu::Button::KbNumpadMultiply]
29
+ GosuRobot = Struct.new(:body, :gun, :radar, :speech, :info, :status, :color, :font_color)
30
+
31
+ module ZOrder
32
+ Background, Mines, Toolboxes, Robot, Explosions, UI = *0..5
33
+ end
34
+
35
+ class LeaderBoard
36
+ def initialize(window, robots, xres, yres, position = :right_top)
37
+ @font_size = (xres / 45).to_i
38
+ @position = position
39
+ @robots = robots
40
+ @font = Gosu::Font.new(window, BIG_FONT, @font_size)
41
+ case position
42
+ when :right_top
43
+ @x_offset = xres-(@font_size * 9)
44
+ when :left_top
45
+ @x_offset = @font_size
46
+ end
47
+ @y_offset = @font_size * 2
48
+ end
49
+
50
+ def draw
51
+ if @robots
52
+ @robots.sort_by{|k,v| -k.energy}.each_with_index do |r, i|
53
+ y = @y_offset + (i * (@font_size * 1.5).to_i) - (@font_size * 1.5).to_i
54
+ @font.draw("#{r.first.name}", @x_offset, y, ZOrder::UI, 1.0, 1.0, r.last.font_color)
55
+ @font.draw("#{r.first.energy.to_i}", @x_offset + (@font_size * 6), y, ZOrder::UI, 1.0, 1.0, r.last.font_color)
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ class RRobotsGameWindow < Gosu::Window
62
+
63
+ attr_reader :battlefield, :xres, :yres
64
+ attr_accessor :on_game_over_handlers
65
+ attr_accessor :boom, :robots, :bullets, :explosions, :toolboxes, :mines
66
+
67
+ def initialize(battlefield, xres, yres)
68
+ super(xres,yres, false, 16)
69
+ self.caption = 'RRobots - GOSU POWERED'
70
+ @font = Gosu::Font.new(self, BIG_FONT, xres / 20)
71
+ @small_font = Gosu::Font.new(self, SMALL_FONT, xres/100)
72
+ @engine = 'gosu'
73
+ @path_prefix = "#{gem_path}/medias/#{@engine}"
74
+ @background_image = Gosu::Image.new(self, "#{@path_prefix}/images/space.png", true)
75
+ @battlefield = battlefield
76
+ @xres, @yres = xres, yres
77
+ @on_game_over_handlers = []
78
+ init_window
79
+ init_simulation
80
+ @leaderboard = LeaderBoard.new(self, @robots, xres, yres, :left_top)
81
+
82
+ # for ultimate win
83
+ #@theme = Gosu::Song.new(self, 'music/song.mod')
84
+ #@theme.play
85
+ @sound_boom = Gosu::Sample.new(self, "#{@path_prefix}/sounds/sunexp.wav")
86
+ @sound_gun = Gosu::Sample.new(self, "#{@path_prefix}/sounds/shotborn.wav")
87
+ end
88
+
89
+ def on_game_over(&block)
90
+ @on_game_over_handlers << block
91
+ end
92
+
93
+ def init_window
94
+ @boom = (0..14).map do |i|
95
+ Gosu::Image.new(self, "#{@path_prefix}/images/explosion#{i.to_s.rjust(2, '0')}.bmp")
96
+ end
97
+ @bullet_image = Gosu::Image.new(self, "#{@path_prefix}/images/bullet.png")
98
+ @mine_image = Gosu::Image.new(self, "#{@path_prefix}/images/mine.png")
99
+ @toolbox_image = Gosu::Image.new(self, "#{@path_prefix}/images/toolbox.png")
100
+ end
101
+
102
+ def init_simulation
103
+ @robots, @bullets, @explosions, @toolboxes, @mines = {}, {}, {}, {}, {}
104
+ end
105
+
106
+
107
+ def draw
108
+ robot_keys
109
+ simulate
110
+ draw_battlefield
111
+ play_sounds
112
+ @leaderboard.draw
113
+ if button_down? Gosu::Button::KbEscape
114
+ self.close
115
+ end
116
+ end
117
+
118
+ def robot_keys
119
+ pressed = []
120
+ BUTTONS.each do |b|
121
+ pressed << b if button_down?(b)
122
+ end
123
+ @battlefield.robots.each do |ai|
124
+ ai.pressed_button(pressed)
125
+ end
126
+ end
127
+
128
+ def play_sounds
129
+ @battlefield.robots.each do |ai|
130
+ if !ai.robot.events['got_hit'].empty?
131
+ pan = -1.0 + (2.0 * ai.x / @battlefield.width)
132
+ @sound_boom.play_pan(pan, 0.4)
133
+ end
134
+
135
+ if ai.actions[:fire] > 0 && ai.gun_heat <= 0
136
+ pan = -1.0 + (2.0 * ai.x / @battlefield.width)
137
+ @sound_gun.play_pan(pan, [ai.actions[:fire]*3, 1].min)
138
+ end
139
+ end
140
+ end
141
+
142
+ def draw_battlefield
143
+ draw_robots
144
+ draw_bullets
145
+ draw_explosions
146
+ draw_mines
147
+ draw_toolboxes
148
+ end
149
+
150
+ def simulate(ticks=1)
151
+ @explosions.reject!{|e,tko| e.dead }
152
+ @bullets.reject!{|b,tko| b.dead }
153
+ @robots.reject! { |ai,tko| ai.dead}
154
+ @mines.reject! { |m,tko| m.dead}
155
+ @toolboxes.reject! { |t,tko| t.dead}
156
+ ticks.times do
157
+ if @battlefield.game_over
158
+ @on_game_over_handlers.each{|h| h.call(@battlefield) }
159
+ winner = @robots.keys.first
160
+ whohaswon = if winner.nil?
161
+ I18n.t('gui.draw')
162
+ elsif @battlefield.teams.all?{|k,t|t.size<2}
163
+ I18n.t('gui.no_team_won', :winner_name => winner.name)
164
+ else
165
+ I18n.t('gui.team_won', :winner_team => winner.team)
166
+ end
167
+ text_color = winner ? winner.team : 7
168
+ @font.draw_rel("#{whohaswon}", xres/2, yres/2, ZOrder::UI, 0.5, 0.5, 1, 1, 0xffffff00)
169
+ end
170
+ @battlefield.tick
171
+ end
172
+ end
173
+
174
+ def draw_robots
175
+ @battlefield.robots.each_with_index do |ai, i|
176
+ next if ai.dead
177
+ col = COLORS[i % COLORS.size]
178
+ font_col = FONT_COLORS[i % FONT_COLORS.size]
179
+ @robots[ai] ||= GosuRobot.new(
180
+ Gosu::Image.new(self, "#{@path_prefix}/images/#{col}_body000.bmp"),
181
+ Gosu::Image.new(self, "#{@path_prefix}/images/#{col}_turret000.bmp"),
182
+ Gosu::Image.new(self, "#{@path_prefix}/images/#{col}_radar000.bmp"),
183
+ @small_font,
184
+ @small_font,
185
+ @small_font,
186
+ col,
187
+ font_col
188
+ )
189
+
190
+ @robots[ai].body.draw_rot(ai.x / 2, ai.y / 2, ZOrder::Robot, (-(ai.heading-90)) % 360)
191
+ @robots[ai].gun.draw_rot(ai.x / 2, ai.y / 2, ZOrder::Robot, (-(ai.gun_heading-90)) % 360)
192
+ @robots[ai].radar.draw_rot(ai.x / 2, ai.y / 2, ZOrder::Robot, (-(ai.radar_heading-90)) % 360)
193
+
194
+ if @talkative
195
+ @robots[ai].info.draw("#{ai.name}\n#{'|' * (ai.energy / 5)}",
196
+ ai.x / 2 - 50, ai.y / 2 + 30, ZOrder::UI, 1.0, 1.0, font_col)
197
+ @robots[ai].status.draw("#{ai.name.ljust(20)} #{'%.1f' % ai.energy}",
198
+ ai.x / 2 - 50, ai.y / 2 + 30, ZOrder::UI, 1.0, 1.0, font_col)
199
+ else
200
+ @robots[ai].speech.draw_rel(ai.speech.to_s, ai.x / 2, ai.y / 2 - 40, ZOrder::UI, 0.5, 0.5, 1, 1, font_col)
201
+ @robots[ai].info.draw_rel("#{ai.name}", ai.x / 2, ai.y / 2 + 30, ZOrder::UI, 0.5, 0.5, 1, 1, font_col)
202
+ end
203
+ end
204
+ end
205
+
206
+ def draw_bullets
207
+ @battlefield.bullets.each do |bullet|
208
+ @bullets[bullet] ||= @bullet_image
209
+ @bullets[bullet].draw(bullet.x / 2, bullet.y / 2, ZOrder::Explosions)
210
+ end
211
+ end
212
+
213
+ def draw_explosions
214
+ @battlefield.explosions.each do |explosion|
215
+ @explosions[explosion] = boom[explosion.t % 14]
216
+ @explosions[explosion].draw_rot(explosion.x / 2, explosion.y / 2, ZOrder::Explosions, 0)
217
+ end
218
+ end
219
+
220
+ def draw_toolboxes
221
+ @battlefield.toolboxes.each do |toolbox|
222
+ @toolboxes[toolbox] ||= @toolbox_image
223
+ @toolboxes[toolbox].draw(toolbox.x / 2, toolbox.y / 2, ZOrder::Toolboxes)
224
+ end
225
+ end
226
+
227
+ def draw_mines
228
+ @battlefield.mines.each do |mine|
229
+ @mines[mine] ||= @mine_image
230
+ @mines[mine].draw(mine.x / 2, mine.y / 2, ZOrder::Mines)
231
+ end
232
+ end
233
+
234
+ end
235
+
236
+ end
237
+