rubywarrior-i18n 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/CHANGELOG.rdoc +38 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +44 -0
  4. data/LICENSE +20 -0
  5. data/README.md +199 -0
  6. data/Rakefile +17 -0
  7. data/bin/rubywarrior +5 -0
  8. data/features/command_options.feature +46 -0
  9. data/features/levels.feature +71 -0
  10. data/features/profiles.feature +56 -0
  11. data/features/step_definitions/common_steps.rb +19 -0
  12. data/features/step_definitions/interaction_steps.rb +65 -0
  13. data/features/support/env.rb +12 -0
  14. data/features/support/mockio.rb +57 -0
  15. data/features/towers.feature +14 -0
  16. data/i18n/en.yml +232 -0
  17. data/i18n/es.yml +233 -0
  18. data/lib/ruby_warrior.rb +53 -0
  19. data/lib/ruby_warrior/abilities/attack.rb +25 -0
  20. data/lib/ruby_warrior/abilities/base.rb +44 -0
  21. data/lib/ruby_warrior/abilities/bind.rb +20 -0
  22. data/lib/ruby_warrior/abilities/detonate.rb +34 -0
  23. data/lib/ruby_warrior/abilities/direction_of.rb +13 -0
  24. data/lib/ruby_warrior/abilities/direction_of_stairs.rb +13 -0
  25. data/lib/ruby_warrior/abilities/distance_of.rb +13 -0
  26. data/lib/ruby_warrior/abilities/explode.rb +28 -0
  27. data/lib/ruby_warrior/abilities/feel.rb +14 -0
  28. data/lib/ruby_warrior/abilities/form.rb +25 -0
  29. data/lib/ruby_warrior/abilities/health.rb +13 -0
  30. data/lib/ruby_warrior/abilities/listen.rb +15 -0
  31. data/lib/ruby_warrior/abilities/look.rb +16 -0
  32. data/lib/ruby_warrior/abilities/pivot.rb +17 -0
  33. data/lib/ruby_warrior/abilities/rescue.rb +24 -0
  34. data/lib/ruby_warrior/abilities/rest.rb +20 -0
  35. data/lib/ruby_warrior/abilities/shoot.rb +24 -0
  36. data/lib/ruby_warrior/abilities/walk.rb +21 -0
  37. data/lib/ruby_warrior/config.rb +22 -0
  38. data/lib/ruby_warrior/core_additions.rb +29 -0
  39. data/lib/ruby_warrior/floor.rb +71 -0
  40. data/lib/ruby_warrior/game.rb +209 -0
  41. data/lib/ruby_warrior/level.rb +123 -0
  42. data/lib/ruby_warrior/level_loader.rb +56 -0
  43. data/lib/ruby_warrior/player_generator.rb +41 -0
  44. data/lib/ruby_warrior/position.rb +82 -0
  45. data/lib/ruby_warrior/profile.rb +120 -0
  46. data/lib/ruby_warrior/runner.rb +34 -0
  47. data/lib/ruby_warrior/space.rb +71 -0
  48. data/lib/ruby_warrior/tower.rb +14 -0
  49. data/lib/ruby_warrior/turn.rb +38 -0
  50. data/lib/ruby_warrior/ui.rb +54 -0
  51. data/lib/ruby_warrior/units/archer.rb +34 -0
  52. data/lib/ruby_warrior/units/base.rb +100 -0
  53. data/lib/ruby_warrior/units/captive.rb +17 -0
  54. data/lib/ruby_warrior/units/golem.rb +20 -0
  55. data/lib/ruby_warrior/units/sludge.rb +30 -0
  56. data/lib/ruby_warrior/units/thick_sludge.rb +13 -0
  57. data/lib/ruby_warrior/units/warrior.rb +73 -0
  58. data/lib/ruby_warrior/units/wizard.rb +34 -0
  59. data/lib/ruby_warrior/version.rb +3 -0
  60. data/spec/fixtures/short-tower/level_001.rb +15 -0
  61. data/spec/fixtures/short-tower/level_002.rb +15 -0
  62. data/spec/fixtures/walking_player.rb +5 -0
  63. data/spec/ruby_warrior/abilities/attack_spec.rb +51 -0
  64. data/spec/ruby_warrior/abilities/base_spec.rb +38 -0
  65. data/spec/ruby_warrior/abilities/bind_spec.rb +19 -0
  66. data/spec/ruby_warrior/abilities/direction_of_spec.rb +13 -0
  67. data/spec/ruby_warrior/abilities/direction_of_stairs_spec.rb +13 -0
  68. data/spec/ruby_warrior/abilities/distance_of_spec.rb +13 -0
  69. data/spec/ruby_warrior/abilities/explode_spec.rb +32 -0
  70. data/spec/ruby_warrior/abilities/feel_spec.rb +13 -0
  71. data/spec/ruby_warrior/abilities/form_spec.rb +48 -0
  72. data/spec/ruby_warrior/abilities/health_spec.rb +13 -0
  73. data/spec/ruby_warrior/abilities/listen_spec.rb +17 -0
  74. data/spec/ruby_warrior/abilities/look_spec.rb +15 -0
  75. data/spec/ruby_warrior/abilities/pivot_spec.rb +18 -0
  76. data/spec/ruby_warrior/abilities/rescue_spec.rb +40 -0
  77. data/spec/ruby_warrior/abilities/rest_spec.rb +29 -0
  78. data/spec/ruby_warrior/abilities/shoot_spec.rb +22 -0
  79. data/spec/ruby_warrior/abilities/throw_spec.rb +46 -0
  80. data/spec/ruby_warrior/abilities/walk_spec.rb +25 -0
  81. data/spec/ruby_warrior/core_additions_spec.rb +7 -0
  82. data/spec/ruby_warrior/floor_spec.rb +81 -0
  83. data/spec/ruby_warrior/game_spec.rb +119 -0
  84. data/spec/ruby_warrior/level_loader_spec.rb +54 -0
  85. data/spec/ruby_warrior/level_spec.rb +203 -0
  86. data/spec/ruby_warrior/player_generator_spec.rb +12 -0
  87. data/spec/ruby_warrior/position_spec.rb +108 -0
  88. data/spec/ruby_warrior/profile_spec.rb +171 -0
  89. data/spec/ruby_warrior/space_spec.rb +190 -0
  90. data/spec/ruby_warrior/tower_spec.rb +15 -0
  91. data/spec/ruby_warrior/turn_spec.rb +42 -0
  92. data/spec/ruby_warrior/ui_spec.rb +93 -0
  93. data/spec/ruby_warrior/units/archer_spec.rb +23 -0
  94. data/spec/ruby_warrior/units/base_spec.rb +133 -0
  95. data/spec/ruby_warrior/units/captive_spec.rb +23 -0
  96. data/spec/ruby_warrior/units/golem_spec.rb +28 -0
  97. data/spec/ruby_warrior/units/sludge_spec.rb +27 -0
  98. data/spec/ruby_warrior/units/thick_sludge_spec.rb +19 -0
  99. data/spec/ruby_warrior/units/warrior_spec.rb +65 -0
  100. data/spec/ruby_warrior/units/wizard_spec.rb +23 -0
  101. data/spec/spec_helper.rb +10 -0
  102. data/templates/README.erb +33 -0
  103. data/templates/player.rb +5 -0
  104. data/towers/beginner/level_001.rb +18 -0
  105. data/towers/beginner/level_002.rb +19 -0
  106. data/towers/beginner/level_003.rb +23 -0
  107. data/towers/beginner/level_004.rb +20 -0
  108. data/towers/beginner/level_005.rb +24 -0
  109. data/towers/beginner/level_006.rb +21 -0
  110. data/towers/beginner/level_007.rb +20 -0
  111. data/towers/beginner/level_008.rb +23 -0
  112. data/towers/beginner/level_009.rb +22 -0
  113. data/towers/intermediate/level_001.rb +20 -0
  114. data/towers/intermediate/level_002.rb +22 -0
  115. data/towers/intermediate/level_003.rb +25 -0
  116. data/towers/intermediate/level_004.rb +26 -0
  117. data/towers/intermediate/level_005.rb +21 -0
  118. data/towers/intermediate/level_006.rb +25 -0
  119. data/towers/intermediate/level_007.rb +27 -0
  120. data/towers/intermediate/level_008.rb +25 -0
  121. data/towers/intermediate/level_009.rb +33 -0
  122. metadata +226 -0
@@ -0,0 +1,233 @@
1
+ runner:
2
+ options:
3
+ banner: "Uso: rubywarrior [opciones]"
4
+ directory: Ejecutar bajo el directorio especificado
5
+ level: Practicar nivel en Modo Épico
6
+ skip: Ignorar datos ingresados por el usuario
7
+ time: Retardo en segundos de cada turno
8
+ help: Muestra este mensaje
9
+ welcome: Bienvenido a Guerrero Ruby
10
+ directory:
11
+ not_found: No se encontró el directorio rubywarrior, quieres crearlo?
12
+ cannot_continue: No se puede continuar sin el directorio.
13
+ practice_level:
14
+ unable_not_in_epic_mode: No se puede practicar nivel si no se está en Modo Épico, no uses la opción -l.
15
+ first_level_generated: El primer nivel ha sido generado. Consulta las instrucciones en el archivo rubywarrior/%1/README.
16
+ mode:
17
+ back_to_normal: Se ha añadido otro nivel desde que empezaste en Modo Épico, regresando al modo normal.
18
+ level:
19
+ level: nivel
20
+ number: "Nivel %1:"
21
+ starting: Empezando el Nivel %1
22
+ failed: Lo siento, no has logrado pasar el nivel %1. Edita player.rb e intenta de nuevo.
23
+ clues: Te gustaría leer más pistas para pasar este nivel?
24
+ continue_next: Quieres avanzar al siguiente nivel?
25
+ continue_epic_mode: Quieres avanzar al Modo Épico?
26
+ staying_on_current: Nos quedaremos en el nivel actual. Intenta ganar más puntos la siguiente vez
27
+ to_practice: "Para practicar un nivel usa la opción -l: por ejemplo: $ rubywarrior -l 3"
28
+ score: Marcador del nivel
29
+ grade: Grado del nivel
30
+ beginner: principiante
31
+ intermediate: intermedio
32
+ short: corto
33
+ tower: torre
34
+ profile:
35
+ profile: perfil
36
+ new: Nuevo perfil
37
+ replace_existing_for_tower: Estás seguro de querer reemplazar tu perfil existente para esta torre?
38
+ replace_existing: Reemplazando perfil existente.
39
+ not_replacing: Omitiendo reemplazo del perfil.
40
+ stairs:
41
+ stairs: escaleras
42
+ found: Excelente! Has encontrado las escaleras.
43
+ end_of_game: FELICIDADES! Has escalado a la cima de la torre y rescatado a la hermosa Ruby.
44
+ readme:
45
+ see_updated: Se ha actualizado el archivo README en el directorio rubywarrior/%1. Consulta las nuevas instrucciones.
46
+ to_play_epic_mode: Ejecuta rubywarrior de nuevo para jugar en Modo Épico.
47
+ game:
48
+ tower: torre
49
+ average_grade_for_tower: "Tu grado promedio para esta torre es: %1 "
50
+ warrior:
51
+ warrior: guerrero
52
+ enter_name: "Escribe el nombre de tu guerrero: "
53
+ earns_points: gana %1 puntos
54
+ does_nothing: no hace nada
55
+ abilities: Habilidades del guerrero
56
+ score:
57
+ score: marcador
58
+ epic: marcador Modo Épico
59
+ first: primer marcador
60
+ total: Marcador total
61
+ answer:
62
+ yes_no: sn
63
+ yes_initial: s
64
+ no_initial: n
65
+ item:
66
+ choose_typing_number: "Escoge %1 escribiendo un número: "
67
+ turn: turno
68
+ only_one_turn: Sólo se puede realizar una acción por turno.
69
+ bonus:
70
+ time: Bono de tiempo
71
+ clear: Bono por despejar el área
72
+ wall: la pared
73
+ nothing: nada
74
+ sludge:
75
+ name: monstruo
76
+ first_letter: s
77
+ archer:
78
+ name: arquero
79
+ first_letter: a
80
+ thicksludge:
81
+ name: monstruo gigante
82
+ first_letter: S
83
+ captive:
84
+ name: rehen
85
+ first_letter: R
86
+ wizard:
87
+ name: mago
88
+ first_letter: M
89
+ golem:
90
+ name: golem
91
+ first_letter: G
92
+ abilities: Habilidades del Golem
93
+ take_damage_health_left: recibe %1 de daño, le restan %2 puntos de salud
94
+ player:
95
+ dies: ha muerto!
96
+ released_from_bonds: desatado
97
+ direction:
98
+ unknown: "Dirección desconocida: %1. Debería ser :forward, :backward, :left o :right."
99
+ move_forward_default: Camina hacia la dirección especificada (adelante, por defecto).
100
+ bumps_into: choca con
101
+ forward: adelante
102
+ backward: atrás
103
+ left: la izquierda
104
+ right: la derecha
105
+ walk:
106
+ walk: caminar
107
+ s: camina hacia
108
+ attack:
109
+ in_given_direction: Ataca a un enemigo que está en la dirección especificada (adelante, por defecto).
110
+ and_hits: ataca hacia %1 y golpea a %2
111
+ and_hits_nothing: ataca hacia %1 y no golpea a nadie
112
+ feel:
113
+ description: Devuelve el nombre de la unidad (si existe alguna) que esté en la dirección especificada (adelante, por defecto).
114
+ rest:
115
+ description: Recupera 10% de salud, pero no hace nada más.
116
+ receives_health: recibe %1 de salud por descansar, ahora tiene %2 de salud
117
+ fit_fiddle: está en buen estado físico
118
+ health:
119
+ description: Regresa un número entero representando tu salud.
120
+ look:
121
+ description: Regresa una matriz de hasta tres Espacios en la dirección especificada (adelante, por defecto).
122
+ shoot:
123
+ description: Dispara arco y flecha en la dirección especificada (adelante, por defecto).
124
+ and_hits: dispara hacia %1 y golpea a %2
125
+ and_hits_nothing: dispara y no golpea a nadie
126
+ rescue:
127
+ description: Rescata a rehen de su prisión (ganando 20 puntos) en la dirección especificada (adelante, por defecto).
128
+ unbinds_and_rescues: desata a %1 y rescata a %2
129
+ unbinds_and_rescues_nothing: desata a %1 pero no restaca a nadie
130
+ rotate:
131
+ description: Gira hacia :left, :right or :backward (adelante, por defecto)
132
+ pivots: gira hacia
133
+ distance_of:
134
+ description: Pasa un espacio (Space) como argumento y regresará un número entero representando la distancia hacie ese espacio.
135
+ bind:
136
+ description: Paraliza a una unidad en la dirección dada para evitar que se mueva (adelante, por defecto).
137
+ and_restricts: ata a %1 y restringe restricts %2
138
+ and_restricts_nothing: ata a %1 y no restringe nada
139
+ listen:
140
+ description: Regresa una matriz con todos los espacios los cuales tengan unidades (enemigos, rehenes, etc).
141
+ direction_of_stairs:
142
+ description: Regresa la dirección (:left, :right, :forward, :backward) en la que están las escaleras desde tu ubicación.
143
+ direction_of:
144
+ description: Pasa un espacio como argumento y la dirección (:left, :right, :forward, :backward) hacia ese espacio será regresada.
145
+ explode:
146
+ description: Te mata a ti y a todas las unidades alrededor. Probablemente no quieras hacer esto intencionalmente.
147
+ collapsing_the_ceiling: explota, colapsando el techo e hiriendo a todas las unidades.
148
+ is_ticking: está haciendo tic tac
149
+ detonate:
150
+ description: Detona una bomba en la dirección especificada (adelante, por defecto) que daña a ese espacio y los 4 espacios al rededor (incluido tú).
151
+ bomb_deadly_explosion: detona una bomba %1 creando una explosión mortal.
152
+ ticking_explosive: es alcanzado por las llamas lo cual detona el explosivo que trae consigo
153
+ form:
154
+ description: Forma un golem en la dirección dada tomando la mitad de la salud del que lo invocó. El bloque pasado es ejecutado en cada turno del golem.
155
+ golem_gives_health: forma un golem %1 y da la mitad de su salud (%2)
156
+ fails: falla al formar el golem porque algo está bloqueando el camino.
157
+ tip: tip
158
+ hp: de salud
159
+ when_you_are_done_run_rubywarrior: Cuando hayas terminado de editar player.rb ejecuta rubywarrior de nuevo.
160
+ add_your_code_here: añade tu código aquí
161
+ towers:
162
+ beginner:
163
+ level_001:
164
+ description: Ves delante de ti un largo pasillo con escaleras al final. No hay nada en el camino.
165
+ tip: Usa warrior.walk! (dentro del método 'play_turn' de la clase Player) para caminar hacia adelante.
166
+ level_002:
167
+ description: Está muy oscuro y no se puede ver nada, pero sientes que un monstruo anda cerca.
168
+ tip: Usa warrior.feel.empty? para saber si hay alguien frente a ti y warrior.attack! para pelar. Recuerda, sólo puedes realizar una acción por turno (terminan en !).
169
+ clue: Añade una condición if/else usando warrior.feel.empty? para decidir cuándo atacar (warrior.attack!) o caminar (warrior.walk!).
170
+ level_003:
171
+ description: El aire se siente más pesado que antes. Debe haber una horda de monstruos.
172
+ tip: Cuídate mucho para no morir! Usa warrior.health para ver el nivel de tu salud y descansa usando warrior.rest! para recuperar 10% de tu salud.
173
+ clue: Cuando no hay enemigos frente a ti descansa usando warrior.rest! hasta que tu salud se haya recuperado antes de seguir avanzando.
174
+ level_004:
175
+ description: Puedes escuchar las cuerdas de los arcos tensándose.
176
+ tip: No tienes nuevas habilidades esta vez, pero debes tener cuidado de no descansar cuando estés siendo atacado. Usa una variable de instancia @health y compárala en cada turno para ver si alguien te está atacando.
177
+ clue: Guarda tu nivel actual de salud en @health al final de cada turno. Si ésta es mayor que tu nivel de salud en el siguiente turno sabrás que estás siendo atacado y no deberías descansar en dado caso.
178
+ level_005:
179
+ description: Escuchas sollozos y gritos de ayuda. Los rehenes necesitan ser rescatados.
180
+ tip: Usa warrior.feel.captive? para saber si hay un rehen y warrior.rescue! para rescatarlo. No ataques a los rehenes.
181
+ clue: No olvides revisar constantemente si estás siendo atacado, si no, descansa hasta que tu salud se recupere.
182
+ level_006:
183
+ description: La pared que está detrás de ti se siente un poco más lejana en este cuarto y escuchas más sollozos y gritos de ayuda.
184
+ tip: Puedes caminar hacia atrás pasando ':backward' como argumento al método walk!. Lo mismo para feel, rescue! y attack!. Los arqueros tiene una distancia de ataque limitada.
185
+ clue: Camina hacia atrás si estás siendo atacado desde lejos y no tienes suficiente salud para atacar. También puedes considerar caminar hacia atrás hasta que ya no puedas hacerlo más, usa warrior.feel(:backward).wall?.
186
+ level_007:
187
+ description: Ves una pared justo delante de ti y una puerta detrás.
188
+ tip: No eres tan efectivo atacando hacia atrás. Usa warrior.feel.wall? y warrior.pivot! para darte la vuelta.
189
+ level_008:
190
+ description: Escuchas el murmullo de los magos. Ten cuidado de sus mortales varitas mágicas! Lo bueno es que has encontrado un arco.
191
+ tip: Usa warrior.look para saber qué tienes a tu alrededor y warrior.shoot! para disparar una flecha.
192
+ clue: Los Magos son mortales pero tiene poca salud. Mátalos antes de que tengan tiempo de atacar.
193
+ level_009:
194
+ description: Es tiempo de afinar tus habilidades y aplicar todo lo que has aprendido.
195
+ tip: Mira detrás de ti.
196
+ clue: No te mantengas disparando el arco mientras te están atacandopor detrás.
197
+ intermediate:
198
+ level_001:
199
+ description: Silencio. El cuarto parece grande, pero vacío. Afortunadamente tienes un mapa de esta torre para poder encontrar las escaleras.
200
+ tip: Usa warrior.direction_of_stairs para determinar en qué dirección están ubicadas las escaleras. Pasa el resultado a warrior.walk! para caminar en esa dirección.
201
+ level_002:
202
+ description: Otro cuarto grande, pero con varios enemigos bloqueando el camino hacia las escaleras.
203
+ tip: "Justo como caminar, puedes atacar y percibir en múltiples direcciones: adelante, izquierda, derecha, atrás (:forward, :left, :right, :backward)."
204
+ clue: Llama warrior.feel(direction).enemy? en cada dirección para estar seguro de que no hay enemigos cerca (ataca si los hay). Usa warrior.rest! para descansar para recuperar salud cuando no haya enemigos alrededor.
205
+ level_003:
206
+ description: Sientes cosas viscosas por todos lados, estás rodeado!
207
+ tip: Llama warrior.bind!(dirección) para paralizar a un enemigo y así evitar que te ataque. Los enemigos paralizados se ven justo como rehenes.
208
+ clue: Cuenta el número de enemigos alrededor tuyo. Paraliza a un enemigo si hay dos o más.
209
+ level_004:
210
+ description: Tus oidos se hacen más sensibles, escucha para encontrar enemigos y rehenes!
211
+ tip: Usa warrior.listen para encontrar los espacios donde hay alguien y warrior.direction_of para determinar en qué dirección están.
212
+ clue: Camina hacia el enemigo o rehen con warrior.walk!(warrior.direction_of(warrior.listen.first)) hasta que no haya nadie y después dirígete a las escaleras.
213
+ level_005:
214
+ description: Puedes sentir las escaleras justo a un lado tuyo, pero estás seguro de querer subirlas inmediatamente?
215
+ tip: Conseguirás más puntos por despejar el nivel primero. Usa warrior.feel.stairs? y warrior.feel.empty? para determinar a dónde ir.
216
+ clue: Si la dirección hacia donde está una unidad es la misma que la de las escaleras, intenta moverte hacia un espacio vacío hasta que puedas moverte con seguridad hacia los enemigos.
217
+ level_006:
218
+ description: Qué es ese tic tac? Algunos rehenes tienen una bomba de tiempo en sus pies!
219
+ tip: Apresúrate y rescata primero a los rehenes que tienen su bomba a punto de explotar, para saberlo usa space.ticking?, se irán rápido!
220
+ clue: Evita pelear con tus enemigos al principio. Usa warrior.listen y space.ticking? y rápidamente rescata a ese rehenes.
221
+ level_007:
222
+ description: Otro sonido de tic tac, pero un monstruo está bloqueando el camino.
223
+ tip: Rápidamente mata al monstruo y rescata al rehen antes de que la bomba explote. No puedes simplemente esquivarlos yéndote por una lado de ellos.
224
+ clue: Determina la dirección del rehen con la bomba a punto de explotar y mata a los enemigos que estén bloqueando tu camino. Probablemente necesites paralizar enemigos que estén alrededor.
225
+ level_008:
226
+ description: Descubres una bolsa con bombas que te ayudarán cuando te enfrentes a un multitud de enemigos.
227
+ tip: Detona una bomba cuando veas a un par de enemigos delante de ti (warrior.look). También revisa tu salud.
228
+ clue: Llamando warrior.look regresará una lista de espacios (Spaces). Si los primeros dos tienen enemigos, detona una bomba con warrior.detonate!.
229
+ level_009:
230
+ description: Nunca antes habías visto un cuarto con tantos monstruos. Que empiecen los fuegos artificiales!
231
+ tip: Ten cuidado de no dejar que un rehen con una bomba quede atrapado entre las llamas. Usa warrior.distance_of para evitar a los rehenes.
232
+ clue: Asegúrate de paralizar a los enemigos que haya alrededor antes de pelear. Revisa tu salud antes de detonar explosivos.
233
+
@@ -0,0 +1,53 @@
1
+ $: << File.dirname(__FILE__)
2
+
3
+ require 'r18n-desktop'
4
+
5
+ R18n.from_env(File.expand_path("#{File.dirname(__FILE__)}/../i18n/"), ENV['LANG'])
6
+
7
+ require 'set'
8
+
9
+ require 'ruby_warrior/version'
10
+
11
+ require 'ruby_warrior/core_additions'
12
+
13
+ require 'ruby_warrior/runner'
14
+ require 'ruby_warrior/game'
15
+ require 'ruby_warrior/profile'
16
+ require 'ruby_warrior/ui'
17
+ require 'ruby_warrior/config'
18
+ require 'ruby_warrior/player_generator'
19
+ require 'ruby_warrior/level_loader'
20
+ require 'ruby_warrior/tower'
21
+ require 'ruby_warrior/level'
22
+ require 'ruby_warrior/turn'
23
+ require 'ruby_warrior/floor'
24
+ require 'ruby_warrior/space'
25
+ require 'ruby_warrior/position'
26
+
27
+ require 'ruby_warrior/units/base'
28
+ require 'ruby_warrior/units/warrior'
29
+ require 'ruby_warrior/units/sludge'
30
+ require 'ruby_warrior/units/archer'
31
+ require 'ruby_warrior/units/thick_sludge'
32
+ require 'ruby_warrior/units/captive'
33
+ require 'ruby_warrior/units/wizard'
34
+ require 'ruby_warrior/units/golem'
35
+
36
+ require 'ruby_warrior/abilities/base'
37
+ require 'ruby_warrior/abilities/walk'
38
+ require 'ruby_warrior/abilities/attack'
39
+ require 'ruby_warrior/abilities/feel'
40
+ require 'ruby_warrior/abilities/rest'
41
+ require 'ruby_warrior/abilities/health'
42
+ require 'ruby_warrior/abilities/look'
43
+ require 'ruby_warrior/abilities/shoot'
44
+ require 'ruby_warrior/abilities/rescue'
45
+ require 'ruby_warrior/abilities/pivot'
46
+ require 'ruby_warrior/abilities/distance_of'
47
+ require 'ruby_warrior/abilities/bind'
48
+ require 'ruby_warrior/abilities/listen'
49
+ require 'ruby_warrior/abilities/direction_of_stairs'
50
+ require 'ruby_warrior/abilities/direction_of'
51
+ require 'ruby_warrior/abilities/explode'
52
+ require 'ruby_warrior/abilities/detonate'
53
+ require 'ruby_warrior/abilities/form'
@@ -0,0 +1,25 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class Attack < Base
4
+ def description
5
+ "#{R18n.t.attack.in_given_direction}"
6
+ end
7
+
8
+ def perform(direction = :forward)
9
+ verify_direction(direction)
10
+ receiver = unit(direction)
11
+ if receiver
12
+ @unit.say R18n.t.attack.and_hits(R18n.t.direction[direction], "#{receiver}")
13
+ if direction == :backward
14
+ power = (@unit.attack_power/2.0).ceil
15
+ else
16
+ power = @unit.attack_power
17
+ end
18
+ damage(receiver, power)
19
+ else
20
+ @unit.say "#{R18n.t.attack.and_hits_nothing(R18n.t.direction[direction])}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,44 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class Base
4
+ def initialize(unit)
5
+ @unit = unit
6
+ end
7
+
8
+ def offset(direction, forward = 1, right = 0)
9
+ case direction
10
+ when :forward then [forward, -right]
11
+ when :backward then [-forward, right]
12
+ when :right then [right, forward]
13
+ when :left then [-right, -forward]
14
+ end
15
+ end
16
+
17
+ def space(direction, forward = 1, right = 0)
18
+ @unit.position.relative_space(*offset(direction, forward, right))
19
+ end
20
+
21
+ def unit(direction, forward = 1, right = 0)
22
+ space(direction, forward, right).unit
23
+ end
24
+
25
+ def damage(receiver, amount)
26
+ receiver.take_damage(amount)
27
+ @unit.earn_points(receiver.max_health) unless receiver.alive?
28
+ end
29
+
30
+ def description
31
+ end
32
+
33
+ def pass_turn
34
+ # callback which is triggered every turn
35
+ end
36
+
37
+ def verify_direction(direction)
38
+ unless Position::RELATIVE_DIRECTIONS.include? direction
39
+ raise R18n.t.direction.unknown(direction.inspect)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class Bind < Base
4
+ def description
5
+ "#{R18n.t.bind.description}"
6
+ end
7
+
8
+ def perform(direction = :forward)
9
+ verify_direction(direction)
10
+ receiver = unit(direction)
11
+ if receiver
12
+ @unit.say R18n.t.bind.and_restricts(R18n.t.direction[direction], "#{receiver}")
13
+ receiver.bind
14
+ else
15
+ @unit.say "#{R18n.t.bind.and_restricts_nothing(R18n.t.direction[direction])}"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class Detonate < Base
4
+ def description
5
+ "#{R18n.t.detonate.description}"
6
+ end
7
+
8
+ def perform(direction = :forward)
9
+ verify_direction(direction)
10
+ if @unit.position
11
+ @unit.say "#{R18n.t.detonate.bomb_deadly_explosion(R18n.t.direction[direction])}"
12
+ bomb(direction, 1, 0, 8)
13
+ [[1, 1], [1, -1], [2, 0], [0, 0]].each do |x, y|
14
+ bomb(direction, x, y, 4)
15
+ end
16
+ end
17
+ end
18
+
19
+ def bomb(direction, x, y, damage_amount)
20
+ if @unit.position
21
+ receiver = space(direction, x, y).unit
22
+ if receiver
23
+ if receiver.abilities[:explode!]
24
+ receiver.say "#{R18n.t.detonate.ticking_explosive}"
25
+ receiver.abilities[:explode!].perform
26
+ else
27
+ damage(receiver, damage_amount)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class DirectionOf < Base
4
+ def description
5
+ "#{R18n.t.direction_of.description}"
6
+ end
7
+
8
+ def perform(space)
9
+ @unit.position.relative_direction_of(space)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class DirectionOfStairs < Base
4
+ def description
5
+ "#{R18n.t.direction_of_stairs.description}"
6
+ end
7
+
8
+ def perform
9
+ @unit.position.relative_direction_of_stairs
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module RubyWarrior
2
+ module Abilities
3
+ class DistanceOf < Base
4
+ def description
5
+ "#{R18n.t.distance_of.description}"
6
+ end
7
+
8
+ def perform(space)
9
+ @unit.position.distance_of(space)
10
+ end
11
+ end
12
+ end
13
+ end