gemwarrior 0.10.8 → 0.11.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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/bin/gemwarrior +0 -0
  3. data/data/default_world.yaml +282 -436
  4. data/gemwarrior.gemspec +1 -1
  5. data/lib/gemwarrior/arena.rb +17 -17
  6. data/lib/gemwarrior/battle.rb +146 -77
  7. data/lib/gemwarrior/entities/armor.rb +34 -0
  8. data/lib/gemwarrior/entities/armor/iron_helmet.rb +17 -0
  9. data/lib/gemwarrior/entities/creature.rb +81 -4
  10. data/lib/gemwarrior/entities/creatures/cow.rb +24 -0
  11. data/lib/gemwarrior/entities/{items → creatures}/goat.rb +9 -11
  12. data/lib/gemwarrior/entities/creatures/pig.rb +24 -0
  13. data/lib/gemwarrior/entities/entity.rb +59 -5
  14. data/lib/gemwarrior/entities/item.rb +10 -22
  15. data/lib/gemwarrior/entities/items/apple.rb +2 -5
  16. data/lib/gemwarrior/entities/items/arena_door.rb +2 -6
  17. data/lib/gemwarrior/entities/items/bed.rb +7 -11
  18. data/lib/gemwarrior/entities/items/bookcase.rb +57 -0
  19. data/lib/gemwarrior/entities/items/bullet.rb +25 -0
  20. data/lib/gemwarrior/entities/items/couch.rb +6 -10
  21. data/lib/gemwarrior/entities/items/cup.rb +2 -5
  22. data/lib/gemwarrior/entities/items/dehumidifier.rb +3 -6
  23. data/lib/gemwarrior/entities/items/feather.rb +2 -5
  24. data/lib/gemwarrior/entities/items/floor_tile.rb +6 -10
  25. data/lib/gemwarrior/entities/items/flower.rb +1 -4
  26. data/lib/gemwarrior/entities/items/herb.rb +12 -13
  27. data/lib/gemwarrior/entities/items/keystone.rb +2 -5
  28. data/lib/gemwarrior/entities/items/ladder.rb +7 -11
  29. data/lib/gemwarrior/entities/items/letter.rb +20 -23
  30. data/lib/gemwarrior/entities/items/map.rb +3 -6
  31. data/lib/gemwarrior/entities/items/massive_door.rb +3 -7
  32. data/lib/gemwarrior/entities/items/pedestal.rb +6 -10
  33. data/lib/gemwarrior/entities/items/pond.rb +4 -8
  34. data/lib/gemwarrior/entities/items/rope.rb +4 -8
  35. data/lib/gemwarrior/entities/items/small_hole.rb +15 -77
  36. data/lib/gemwarrior/entities/items/snowman.rb +5 -9
  37. data/lib/gemwarrior/entities/items/sparkly_thing.rb +3 -7
  38. data/lib/gemwarrior/entities/items/stonemite.rb +2 -6
  39. data/lib/gemwarrior/entities/items/tent.rb +3 -6
  40. data/lib/gemwarrior/entities/items/throne.rb +7 -6
  41. data/lib/gemwarrior/entities/items/tree.rb +2 -6
  42. data/lib/gemwarrior/entities/items/waterfall.rb +9 -8
  43. data/lib/gemwarrior/entities/location.rb +49 -43
  44. data/lib/gemwarrior/entities/monster.rb +34 -28
  45. data/lib/gemwarrior/entities/monsters/alexandrat.rb +3 -3
  46. data/lib/gemwarrior/entities/monsters/amberoo.rb +3 -3
  47. data/lib/gemwarrior/entities/monsters/amethystle.rb +3 -3
  48. data/lib/gemwarrior/entities/monsters/apatiger.rb +3 -3
  49. data/lib/gemwarrior/entities/monsters/aquamarine.rb +3 -3
  50. data/lib/gemwarrior/entities/monsters/bloodstorm.rb +3 -3
  51. data/lib/gemwarrior/entities/monsters/bosses/emerald.rb +12 -27
  52. data/lib/gemwarrior/entities/monsters/bosses/garynetty.rb +17 -5
  53. data/lib/gemwarrior/entities/monsters/bosses/jaspern.rb +66 -0
  54. data/lib/gemwarrior/entities/monsters/citrinaga.rb +3 -3
  55. data/lib/gemwarrior/entities/monsters/coraliz.rb +3 -3
  56. data/lib/gemwarrior/entities/monsters/cubicat.rb +3 -3
  57. data/lib/gemwarrior/entities/monsters/diaman.rb +3 -3
  58. data/lib/gemwarrior/entities/{items → people}/arena_master.rb +8 -13
  59. data/lib/gemwarrior/entities/{items → people}/drunk_man.rb +14 -35
  60. data/lib/gemwarrior/entities/people/queen_ruby.rb +71 -0
  61. data/lib/gemwarrior/entities/people/rockney.rb +132 -0
  62. data/lib/gemwarrior/entities/{items → people}/shifty_woman.rb +7 -12
  63. data/lib/gemwarrior/entities/{items → people}/thin_man.rb +9 -14
  64. data/lib/gemwarrior/entities/people/ware_hawker.rb +153 -0
  65. data/lib/gemwarrior/entities/person.rb +20 -0
  66. data/lib/gemwarrior/entities/player.rb +102 -60
  67. data/lib/gemwarrior/entities/weapon.rb +38 -0
  68. data/lib/gemwarrior/entities/{items → weapons}/dagger.rb +5 -7
  69. data/lib/gemwarrior/entities/{items → weapons}/gun.rb +8 -10
  70. data/lib/gemwarrior/entities/{items → weapons}/mace.rb +6 -9
  71. data/lib/gemwarrior/entities/{items → weapons}/opalaser.rb +5 -7
  72. data/lib/gemwarrior/entities/weapons/spear.rb +23 -0
  73. data/lib/gemwarrior/entities/{items → weapons}/stalactite.rb +5 -7
  74. data/lib/gemwarrior/entities/weapons/stone.rb +23 -0
  75. data/lib/gemwarrior/evaluator.rb +111 -107
  76. data/lib/gemwarrior/game.rb +61 -29
  77. data/lib/gemwarrior/game_assets.rb +76 -0
  78. data/lib/gemwarrior/inventory.rb +77 -43
  79. data/lib/gemwarrior/misc/animation.rb +17 -13
  80. data/lib/gemwarrior/misc/{music.rb → audio.rb} +15 -7
  81. data/lib/gemwarrior/misc/audio_cues.rb +133 -0
  82. data/lib/gemwarrior/misc/formatting.rb +9 -9
  83. data/lib/gemwarrior/misc/player_levels.rb +21 -0
  84. data/lib/gemwarrior/repl.rb +32 -31
  85. data/lib/gemwarrior/version.rb +1 -1
  86. data/lib/gemwarrior/world.rb +155 -134
  87. metadata +34 -22
  88. data/lib/gemwarrior/entities/items/cow.rb +0 -26
  89. data/lib/gemwarrior/entities/items/pig.rb +0 -26
  90. data/lib/gemwarrior/entities/items/queen_ruby.rb +0 -62
  91. data/lib/gemwarrior/entities/items/spear.rb +0 -26
  92. data/lib/gemwarrior/entities/items/stone.rb +0 -25
  93. data/lib/gemwarrior/entities/items/ware_hawker.rb +0 -93
@@ -0,0 +1,38 @@
1
+ # lib/gemwarrior/entities/weapon.rb
2
+ # Entity::Item::Weapon base class
3
+
4
+ require_relative 'item'
5
+
6
+ module Gemwarrior
7
+ class Weapon < Item
8
+ attr_accessor :atk_lo,
9
+ :atk_hi,
10
+ :is_weapon
11
+
12
+ def initialize
13
+ super
14
+
15
+ self.atk_lo = 0
16
+ self.atk_hi = 0
17
+ self.takeable = true
18
+ self.equippable = true
19
+ self.is_weapon = true
20
+ end
21
+
22
+ def use(world)
23
+ 'Save the using of your weapon for battle.'
24
+ end
25
+
26
+ def describe_detailed
27
+ desc_text = "\"#{name_display}\"\n".colorize(:yellow)
28
+ desc_text << "(#{name})\n".colorize(:green)
29
+ desc_text << "#{description}\n".colorize(:white)
30
+ desc_text << "ATTACK_RANGE: #{atk_lo}-#{atk_hi}\n".colorize(:white)
31
+ desc_text << "TAKEABLE? #{takeable}\n".colorize(:white)
32
+ desc_text << "USEABLE? #{useable}\n".colorize(:white)
33
+ desc_text << "EQUIPPABLE? #{equippable}\n".colorize(:white)
34
+ desc_text << "EQUIPPED? #{equipped}\n".colorize(:white)
35
+ desc_text
36
+ end
37
+ end
38
+ end
@@ -1,20 +1,18 @@
1
- # lib/gemwarrior/entities/items/dagger.rb
2
- # Item::Dagger
1
+ # lib/gemwarrior/entities/weapons/dagger.rb
2
+ # Entity::Item::Weapon::Dagger
3
3
 
4
- require_relative '../item'
4
+ require_relative '../weapon'
5
5
 
6
6
  module Gemwarrior
7
- class Dagger < Item
7
+ class Dagger < Weapon
8
8
  def initialize
9
9
  super
10
10
 
11
11
  self.name = 'dagger'
12
+ self.name_display = 'Dagger'
12
13
  self.description = 'Flint that has been sharpened to a point, attached to a block of smooth granite by thin rope. Truly a work of art.'
13
14
  self.atk_lo = 1
14
15
  self.atk_hi = 3
15
- self.takeable = true
16
- self.useable = false
17
- self.equippable = true
18
16
  end
19
17
  end
20
18
  end
@@ -1,23 +1,21 @@
1
- # lib/gemwarrior/entities/items/gun.rb
2
- # Item::Gun
1
+ # lib/gemwarrior/entities/weapons/gun.rb
2
+ # Entity::Item::Weapon::Gun
3
3
 
4
- require_relative '../item'
4
+ require_relative '../weapon'
5
5
 
6
6
  module Gemwarrior
7
- class Gun < Item
7
+ class Gun < Weapon
8
8
  def initialize
9
9
  super
10
10
 
11
11
  self.name = 'gun'
12
- self.description = 'Pew pew goes this firearm, you suspect.'
12
+ self.name_display = 'Gun'
13
+ self.description = 'Pew pew goes this firearm, you suspect (if it has bullets).'
13
14
  self.atk_lo = 2
14
- self.atk_hi = 4
15
- self.takeable = true
16
- self.useable = true
17
- self.equippable = true
15
+ self.atk_hi = 6
18
16
  end
19
17
 
20
- def use(player = nil)
18
+ def use(world)
21
19
  puts 'You pull the trigger on the gun, but it does not fire. An inscription on the barrel reads: "Only shoots when pointed at a monster." How safe!'
22
20
  { type: nil, data: nil }
23
21
  end
@@ -1,24 +1,21 @@
1
- # lib/gemwarrior/entities/items/mace.rb
2
- # Item::Mace
1
+ # lib/gemwarrior/entities/weapons/mace.rb
2
+ # Entity::Item::Weapon::Mace
3
3
 
4
- require_relative '../item'
4
+ require_relative '../weapon'
5
5
 
6
6
  module Gemwarrior
7
- class Mace < Item
7
+ class Mace < Weapon
8
8
  def initialize
9
9
  super
10
10
 
11
11
  self.name = 'mace'
12
+ self.name_display = 'Mace'
12
13
  self.description = 'Sharp spikes atop a steel ball, affixed to a sturdy wooden handle. You could do damage with this.'
13
14
  self.atk_lo = 4
14
15
  self.atk_hi = 6
15
- self.takeable = true
16
- self.useable = true
17
- self.consumable = false
18
- self.equippable = true
19
16
  end
20
17
 
21
- def use(player = nil)
18
+ def use(world)
22
19
  puts 'You swing the mace around a few times, really testing out its smashability.'
23
20
  { type: nil, data: nil }
24
21
  end
@@ -1,23 +1,21 @@
1
- # lib/gemwarrior/entities/items/opalaser.rb
2
- # Item::Opalaser
1
+ # lib/gemwarrior/entities/weapons/opalaser.rb
2
+ # Entity::Item::Weapon::Opalaser
3
3
 
4
4
  require_relative '../item'
5
5
 
6
6
  module Gemwarrior
7
- class Opalaser < Item
7
+ class Opalaser < Weapon
8
8
  def initialize
9
9
  super
10
10
 
11
11
  self.name = 'opalaser'
12
+ self.name_display = 'Opalaser'
12
13
  self.description = 'Gleaming with supernatural light, this object feels alien, yet familiar.'
13
14
  self.atk_lo = 9
14
15
  self.atk_hi = 11
15
- self.takeable = true
16
- self.useable = true
17
- self.equippable = true
18
16
  end
19
17
 
20
- def use(player = nil)
18
+ def use(world)
21
19
  puts 'You pull the "trigger" on the opalaser, but nothing happens.'
22
20
  { type: nil, data: nil }
23
21
  end
@@ -0,0 +1,23 @@
1
+ # lib/gemwarrior/entities/weapons/spear.rb
2
+ # Entity::Item::Weapon::Spear
3
+
4
+ require_relative '../weapon'
5
+
6
+ module Gemwarrior
7
+ class Spear < Weapon
8
+ def initialize
9
+ super
10
+
11
+ self.name = 'spear'
12
+ self.name_display = 'Spear'
13
+ self.description = 'About six feet in length and razor-sharp at the point, this spear requires two hands, but only one good stab.'
14
+ self.atk_lo = 3
15
+ self.atk_hi = 7
16
+ end
17
+
18
+ def use(world)
19
+ puts 'This spear does, indeed, appear to strike fear upon that which is near.'
20
+ { type: nil, data: nil }
21
+ end
22
+ end
23
+ end
@@ -1,20 +1,18 @@
1
- # lib/gemwarrior/entities/items/stalactite.rb
2
- # Item::Stalactite
1
+ # lib/gemwarrior/entities/weapons/stalactite.rb
2
+ # Entity::Item::Weapon::Stalactite
3
3
 
4
- require_relative '../item'
4
+ require_relative '../weapon'
5
5
 
6
6
  module Gemwarrior
7
- class Stalactite < Item
7
+ class Stalactite < Weapon
8
8
  def initialize
9
9
  super
10
10
 
11
11
  self.name = 'stalactite'
12
+ self.name_display = 'Stalactite'
12
13
  self.description = 'Long protrusion of cave adornment, broken off and fallen to the ground, where the stalagmites sneer at it from.'
13
14
  self.atk_lo = 2
14
15
  self.atk_hi = 3
15
- self.takeable = true
16
- self.useable = false
17
- self.equippable = true
18
16
  end
19
17
  end
20
18
  end
@@ -0,0 +1,23 @@
1
+ # lib/gemwarrior/entities/weapons/stone.rb
2
+ # Entity::Item::Weapon::Stone
3
+
4
+ require_relative '../weapon'
5
+
6
+ module Gemwarrior
7
+ class Stone < Weapon
8
+ def initialize
9
+ super
10
+
11
+ self.name = 'stone'
12
+ self.name_display = 'Stone'
13
+ self.description = 'A small, yet quite sharp, sedimentary pebble, suitable for tossing in amusement, and perhaps combat.'
14
+ self.atk_lo = 1
15
+ self.atk_hi = 2
16
+ end
17
+
18
+ def use(world)
19
+ puts 'You toss the stone a few feet into the air, and then it falls back into your palm. The experience was truly thrilling.'
20
+ { type: nil, data: nil }
21
+ end
22
+ end
23
+ end
@@ -2,6 +2,7 @@
2
2
  # Evaluates prompt input
3
3
 
4
4
  require_relative 'arena'
5
+ require_relative 'game_assets'
5
6
  require_relative 'game_options'
6
7
 
7
8
  module Gemwarrior
@@ -13,7 +14,7 @@ module Gemwarrior
13
14
 
14
15
  GO_PARAMS = 'Options: north, east, south, west'
15
16
  CHANGE_PARAMS = 'Options: name'
16
- DEBUG_LIST_PARAMS = 'Options: monsters, items, locations'
17
+ DEBUG_LIST_PARAMS = 'Options: players, creatures, items, locations, monsters, weapons'
17
18
  DEBUG_STAT_PARAMS = 'Options: hp_cur, atk_lo, atk_hi, experience, rox, strength, dexterity, defense, inventory'
18
19
 
19
20
  ERROR_COMMAND_INVALID = 'That is not something the game yet understands.'
@@ -39,20 +40,27 @@ module Gemwarrior
39
40
  ERROR_LIST_PARAM_INVALID = 'You cannot list that...yet.'
40
41
  ERROR_DEBUG_STAT_PARAM_MISSING = 'You cannot just "change stats". You gotta choose a stat to change.'
41
42
  ERROR_DEBUG_STAT_PARAM_INVALID = 'You cannot change that stat...yet.'
43
+ ERROR_DEBUG_STAT_INV_PARAM_INVALID = 'You cannot add that to your inventory...yet.'
42
44
  ERROR_DEBUG_TELEPORT_PARAMS_MISSING = 'You cannot just "teleport". You gotta specify an x AND y coordinate, at least.'
43
45
  ERROR_DEBUG_TELEPORT_PARAMS_NEEDED = 'You cannot just "teleport" to an x coordinate without a y coordinate.'
44
46
  ERROR_DEBUG_TELEPORT_PARAMS_INVALID = 'You cannot teleport there...yet.'
45
47
 
46
48
  attr_accessor :world,
47
- :commands, :aliases, :extras, :cmd_descriptions,
48
- :devcommands, :devaliases, :devextras, :devcmd_descriptions
49
+ :commands,
50
+ :aliases,
51
+ :extras,
52
+ :cmd_descriptions,
53
+ :devcommands,
54
+ :devaliases,
55
+ :devextras,
56
+ :devcmd_descriptions
49
57
 
50
58
  def initialize(world)
51
59
  self.world = world
52
60
 
53
- self.devcommands = %w(god beast list vars map stat teleport spawn levelbump restfight)
54
- self.devaliases = %w(gd bs ls vs m st tp sp lb rf)
55
- self.devextras = %w()
61
+ self.devcommands = %w(god beast list vars map stat teleport spawn levelbump restfight)
62
+ self.devaliases = %w(gd bs ls vs m st tp sp lb rf)
63
+ self.devextras = %w()
56
64
  self.devcmd_descriptions = [
57
65
  'Toggle god mode (i.e. invincible)',
58
66
  'Toggle beast mode (i.e. super strength)',
@@ -66,16 +74,16 @@ module Gemwarrior
66
74
  'Rest, but ensure battle for testing'
67
75
  ]
68
76
 
69
- self.commands = %w(character inventory rest look take talk use drop equip unequip go north east south west attack change version checkupdate help quit quit!)
70
- self.aliases = %w(c i r l t tk u d eq ue g n e s w a ch v cu h q qq)
71
- self.extras = %w(exit exit! x xx fight f ? ?? ???)
77
+ self.commands = %w(character look rest take talk inventory use drop equip unequip go north east south west attack change version checkupdate help quit quit!)
78
+ self.aliases = %w(c l r t tk i u d eq ue g n e s w a ch v cu h q qq)
79
+ self.extras = %w(exit exit! x xx fight f ? ?? ???)
72
80
  self.cmd_descriptions = [
73
81
  'Display character information',
74
- 'Look in your inventory',
75
- 'Take a load off and regain HP',
76
82
  'Look around your current location',
83
+ 'Take a load off and regain HP',
77
84
  'Take item',
78
85
  'Talk to person',
86
+ 'Look in your inventory',
79
87
  'Use item (in inventory or environment)',
80
88
  'Drop item',
81
89
  'Equip item',
@@ -86,7 +94,7 @@ module Gemwarrior
86
94
  'Go south (shortcut)',
87
95
  'Go west (shortcut)',
88
96
  'Attack a monster (also fight)',
89
- 'Change something',
97
+ 'Change attribute',
90
98
  'Display game version',
91
99
  'Check for newer game releases',
92
100
  'This help menu (also ?)',
@@ -95,24 +103,25 @@ module Gemwarrior
95
103
  ]
96
104
  end
97
105
 
98
- def evaluate(input)
106
+ def parse(input)
99
107
  case input
100
108
  # Ctrl-D or empty command
101
109
  when nil, ''
102
110
  return
103
111
  # real command
104
112
  else
105
- tokens = input.split
106
- unless input_valid?(input)
107
- return ERROR_COMMAND_INVALID
108
- end
113
+ return ERROR_COMMAND_INVALID.colorize(:red) unless input_valid?(input)
109
114
  end
110
115
 
116
+ tokens = input.split
111
117
  command = tokens.first.downcase
112
118
  param1 = tokens[1]
113
119
  param2 = tokens[2]
114
120
  param3 = tokens[3]
115
121
 
122
+ # helpful
123
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
124
+
116
125
  # dev commands
117
126
  if GameOptions.data['debug_mode']
118
127
  case command
@@ -123,7 +132,11 @@ module Gemwarrior
123
132
  GameOptions.data['beast_mode'] = !GameOptions.data['beast_mode']
124
133
  return "Beast mode set to #{GameOptions.data['beast_mode']}"
125
134
  when 'vars', 'vs'
126
- world.print_vars
135
+ if param1
136
+ world.print_vars(param1)
137
+ else
138
+ world.print_vars
139
+ end
127
140
  when 'list', 'ls'
128
141
  if param1.nil?
129
142
  puts ERROR_LIST_PARAM_MISSING
@@ -214,16 +227,23 @@ module Gemwarrior
214
227
  end
215
228
  when 'inventory', 'inv'
216
229
  unless param2.nil?
217
- world.player.inventory.items.push(eval(param2).new)
230
+ begin
231
+ item_const_name = Gemwarrior.const_get(Formatting.upstyle(param2))
232
+ item = item_const_name.new
233
+ world.player.inventory.items.push(item)
234
+ return "#{item.name} added to player inventory."
235
+ rescue
236
+ return ERROR_DEBUG_STAT_INV_PARAM_INVALID
237
+ end
218
238
  end
219
239
  else
220
240
  return ERROR_DEBUG_STAT_PARAM_INVALID
221
241
  end
222
242
  end
223
243
  when 'spawn', 'sp'
224
- cur_loc = world.location_by_coords(world.player.cur_coords)
225
- cur_loc.populate_monsters(world.monsters, true)
226
- return world.describe(cur_loc)
244
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
245
+ player_cur_location.populate_monsters(GameMonsters.data, spawn: true)
246
+ return world.describe(player_cur_location)
227
247
  when 'teleport', 'tp'
228
248
  if param1.nil?
229
249
  return ERROR_DEBUG_TELEPORT_PARAMS_MISSING
@@ -239,7 +259,7 @@ module Gemwarrior
239
259
 
240
260
  # check to make sure new location exists
241
261
  if world.location_by_coords(x: x_coord, y: y_coord, z: z_coord)
242
- world.player.cur_coords = {x: x_coord, y: y_coord, z: z_coord}
262
+ world.player.cur_coords = { x: x_coord, y: y_coord, z: z_coord }
243
263
  else
244
264
  return ERROR_DEBUG_TELEPORT_PARAMS_INVALID
245
265
  end
@@ -264,8 +284,9 @@ module Gemwarrior
264
284
  # stats
265
285
  world.player.movements_made += 1
266
286
 
267
- Animation::run(phrase: '** TELEPORT! **', speed: :insane)
268
- return world.describe(world.location_by_coords(world.player.cur_coords))
287
+ Animation.run(phrase: '** TELEPORT! **', speed: :insane)
288
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
289
+ return world.describe(player_cur_location)
269
290
  end
270
291
  when 'levelbump', 'lb'
271
292
  world.player.update_stats(reason: :level_bump, value: 1)
@@ -289,16 +310,29 @@ module Gemwarrior
289
310
  else
290
311
  world.player.list_inventory
291
312
  end
313
+ when 'look', 'l'
314
+ if param1
315
+ # convert 'look at' to 'look'
316
+ if param1.eql?('at')
317
+ if param2
318
+ param1 = param2
319
+ else
320
+ return ERROR_LOOK_AT_PARAM_MISSING
321
+ end
322
+ end
323
+ world.describe_entity(player_cur_location, param1)
324
+ else
325
+ world.describe(player_cur_location)
326
+ end
292
327
  when 'rest', 'r'
293
328
  tent_uses = 0
294
- player_inventory = world.player.inventory.items
295
- location_inventory = world.location_by_coords(world.player.cur_coords).items
329
+ player_inventory = world.player.inventory
296
330
 
297
- if player_inventory.map(&:name).include?('tent')
298
- player_inventory.each do |i|
331
+ if player_inventory.contains_item?('tent')
332
+ player_inventory.items.each do |i|
299
333
  if i.name.eql?('tent')
300
334
  if i.number_of_uses > 0
301
- result = i.use(world.player)
335
+ result = i.use(world)
302
336
  tent_uses = i.number_of_uses
303
337
  i.number_of_uses -= 1
304
338
 
@@ -306,11 +340,11 @@ module Gemwarrior
306
340
  end
307
341
  end
308
342
  end
309
- elsif location_inventory.map(&:name).include?('tent')
310
- location_inventory.each do |i|
343
+ elsif player_cur_location.contains_item?('tent')
344
+ player_cur_location.items.each do |i|
311
345
  if i.name.eql?('tent')
312
346
  if i.number_of_uses > 0
313
- result = i.use(world.player)
347
+ result = i.use(world)
314
348
  tent_uses = i.number_of_uses
315
349
  i.number_of_uses -= 1
316
350
 
@@ -327,24 +361,11 @@ module Gemwarrior
327
361
  else
328
362
  result
329
363
  end
330
- when 'look', 'l'
331
- if param1
332
- if param1.eql?('at')
333
- if param2
334
- param1 = param2
335
- else
336
- return ERROR_LOOK_AT_PARAM_MISSING
337
- end
338
- end
339
- world.describe_entity(world.location_by_coords(world.player.cur_coords), param1)
340
- else
341
- world.describe(world.location_by_coords(world.player.cur_coords))
342
- end
343
364
  when 'take', 't'
344
365
  if param1.nil?
345
366
  ERROR_TAKE_PARAM_MISSING
346
367
  else
347
- world.player.inventory.add_item(world.location_by_coords(world.player.cur_coords), param1, world.player)
368
+ world.player.inventory.add_item(param1, player_cur_location, world.player)
348
369
  end
349
370
  when 'talk', 'tk'
350
371
  if param1.nil?
@@ -356,52 +377,32 @@ module Gemwarrior
356
377
  return ERROR_TALK_TO_PARAM_MISSING
357
378
  end
358
379
  end
359
-
380
+
360
381
  person_name = param1
361
- result = nil
362
382
 
363
- player_inventory = world.player.inventory.items
364
- location = world.location_by_coords(world.player.cur_coords)
365
- location_inventory = location.items
383
+ player_inventory = world.player.inventory
366
384
 
367
- if player_inventory.map(&:name).include?(person_name)
368
- player_inventory.each do |person|
385
+ if player_inventory.contains_item?(person_name)
386
+ player_inventory.items.each do |person|
369
387
  if person.name.eql?(person_name)
370
388
  if person.talkable
371
- result = person.use(world.player)
389
+ return self.parse("use #{person_name}")
372
390
  else
373
391
  return ERROR_TALK_PARAM_UNTALKABLE
374
392
  end
375
393
  end
376
394
  end
377
- elsif location_inventory.map(&:name).include?(person_name)
378
- location_inventory.each do |person|
395
+ elsif player_cur_location.contains_item?(person_name)
396
+ player_cur_location.items.each do |person|
379
397
  if person.name.eql?(person_name)
380
398
  if person.talkable
381
- result = person.use(world.player)
399
+ return self.parse("use #{person_name}")
382
400
  else
383
401
  return ERROR_TALK_PARAM_UNTALKABLE
384
402
  end
385
403
  end
386
404
  end
387
405
  end
388
-
389
- return ERROR_TALK_PARAM_INVALID if result.nil?
390
-
391
- case result[:type]
392
- when 'arena'
393
- arena_result = Arena.new(world: world, player: world.player)
394
- arena_result = arena.start
395
-
396
- if arena_result.eql?('death')
397
- player_death_resurrection
398
- end
399
- when 'purchase'
400
- result[:data].each do |i|
401
- world.player.inventory.items.push(i)
402
- end
403
- return
404
- end
405
406
  when 'use', 'u'
406
407
  if param1.nil?
407
408
  ERROR_USE_PARAM_MISSING
@@ -409,50 +410,48 @@ module Gemwarrior
409
410
  item_name = param1
410
411
  result = nil
411
412
 
412
- player_inventory = world.player.inventory.items
413
- location = world.location_by_coords(world.player.cur_coords)
414
- location_inventory = location.items
413
+ player_inventory = world.player.inventory
415
414
 
416
- if player_inventory.map(&:name).include?(item_name)
417
- player_inventory.each do |i|
415
+ if player_inventory.contains_item?(item_name)
416
+ player_inventory.items.each do |i|
418
417
  if i.name.eql?(item_name)
419
418
  if i.useable
420
419
  if !i.number_of_uses.nil?
421
420
  if i.number_of_uses > 0
422
- result = i.use(world.player)
421
+ result = i.use(world)
423
422
  i.number_of_uses -= 1
424
423
  puts ">> #{i.name} can be used #{i.number_of_uses} more time(s)."
425
424
  else
426
425
  return ">> #{i.name} cannot be used anymore."
427
426
  end
428
427
  elsif i.consumable
429
- result = i.use(world.player)
428
+ result = i.use(world)
430
429
  world.player.inventory.remove_item(i.name)
431
430
  else
432
- result = i.use(world.player)
431
+ result = i.use(world)
433
432
  end
434
433
  else
435
434
  return ERROR_USE_PARAM_UNUSEABLE
436
435
  end
437
436
  end
438
437
  end
439
- elsif location_inventory.map(&:name).include?(item_name)
440
- location_inventory.each do |i|
438
+ elsif player_cur_location.contains_item?(item_name)
439
+ player_cur_location.items.each do |i|
441
440
  if i.name.eql?(item_name)
442
441
  if i.useable
443
442
  if !i.number_of_uses.nil?
444
443
  if i.number_of_uses > 0
445
- result = i.use(world.player)
444
+ result = i.use(world)
446
445
  i.number_of_uses -= 1
447
446
  puts ">> #{i.name} can be used #{i.number_of_uses} more time(s)."
448
447
  else
449
448
  return ">> #{i.name} cannot be used anymore."
450
449
  end
451
450
  elsif i.consumable
452
- result = i.use(world.player)
451
+ result = i.use(world)
453
452
  location.remove_item(i.name)
454
453
  else
455
- result = i.use(world.player)
454
+ result = i.use(world)
456
455
  end
457
456
  else
458
457
  return ERROR_USE_PARAM_UNUSEABLE
@@ -467,11 +466,16 @@ module Gemwarrior
467
466
  case result[:type]
468
467
  when 'move'
469
468
  world.player.cur_coords = world.location_coords_by_name(result[:data])
470
- world.describe(world.location_by_coords(world.player.cur_coords))
469
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
470
+ world.describe(player_cur_location)
471
471
  when 'move_dangerous'
472
- world.player.take_damage(rand(0..2))
472
+ dmg = rand(0..2)
473
+ puts ">> You lose #{dmg} hit point(s)." if dmg > 0
474
+ world.player.take_damage(dmg)
475
+
473
476
  world.player.cur_coords = world.location_coords_by_name(result[:data])
474
- world.describe(world.location_by_coords(world.player.cur_coords))
477
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
478
+ world.describe(player_cur_location)
475
479
  when 'dmg'
476
480
  world.player.take_damage(result[:data])
477
481
  return
@@ -496,7 +500,7 @@ module Gemwarrior
496
500
  player_death_resurrection
497
501
  end
498
502
  when 'item'
499
- world.location_by_coords(world.player.cur_coords).add_item(result[:data])
503
+ player_cur_location.add_item(result[:data])
500
504
  return
501
505
  when 'purchase'
502
506
  result[:data].each do |i|
@@ -564,11 +568,11 @@ module Gemwarrior
564
568
  else
565
569
  monster_name = param1
566
570
  if world.has_monster_to_attack?(monster_name)
567
- monster = world.location_by_coords(world.player.cur_coords).monster_by_name(monster_name)
571
+ monster = player_cur_location.monster_by_name(monster_name)
568
572
  result = world.player.attack(world, monster)
569
573
 
570
574
  if result.eql?('death')
571
- player_death_resurrection
575
+ return player_death_resurrection
572
576
  elsif result.eql?('exit')
573
577
  return 'exit'
574
578
  end
@@ -579,7 +583,8 @@ module Gemwarrior
579
583
  result[:data]
580
584
  when 'move'
581
585
  world.player.cur_coords = world.location_coords_by_name(result[:data])
582
- world.describe(world.location_by_coords(world.player.cur_coords))
586
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
587
+ world.describe(player_cur_location)
583
588
  end
584
589
  end
585
590
  else
@@ -606,8 +611,8 @@ module Gemwarrior
606
611
  'checkupdate'
607
612
  when 'quit', 'exit', 'q', 'x'
608
613
  print 'You sure you want to quit? (y/n) '
609
- response = gets.chomp.downcase
610
-
614
+ answer = gets.chomp.downcase
615
+
611
616
  case answer
612
617
  when 'y', 'yes'
613
618
  puts QUIT_MESSAGE
@@ -628,37 +633,36 @@ module Gemwarrior
628
633
  def try_to_move_player(direction)
629
634
  if world.can_move?(direction)
630
635
  world.player.go(world.locations, direction)
631
- world.location_by_coords(world.player.cur_coords).checked_for_monsters = false
632
- world.describe(world.location_by_coords(world.player.cur_coords))
636
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
637
+ player_cur_location.checked_for_monsters = false
638
+ world.describe(player_cur_location)
633
639
  else
634
640
  return ERROR_GO_PARAM_INVALID
635
641
  end
636
642
  end
637
643
 
638
644
  def player_death_resurrection
639
- Music::cue([
640
- { frequencies: 'D#5', duration: 100 },
641
- { frequencies: 'A4', duration: 150 },
642
- { frequencies: 'F#4', duration: 200 },
643
- { frequencies: 'F4', duration: 1000 }
644
- ])
645
+ Audio.play_synth(:player_resurrection)
645
646
 
646
647
  puts 'Somehow, though, your adventure does not end here!'.colorize(:yellow)
647
648
  puts 'Instead, you are whisked back home via some magical force.'.colorize(:yellow)
648
649
  puts 'A bit worse for the weary and somewhat poorer, but you are ALIVE!'.colorize(:yellow)
650
+ puts
651
+
649
652
  world.player.hp_cur = 1
650
653
  world.player.rox -= (world.player.rox * 0.1).to_i
651
654
  if world.player.rox < 0
652
655
  world.player.rox = 0
653
656
  end
654
657
  world.player.cur_coords = world.location_coords_by_name('Home')
655
- world.describe(world.location_by_coords(world.player.cur_coords))
658
+ player_cur_location = world.location_by_coords(world.player.cur_coords)
659
+ world.describe(player_cur_location)
656
660
  world.player.deaths += 1
657
661
  return
658
662
  end
659
663
 
660
664
  def print_separator
661
- puts "========================================================="
665
+ puts '========================================================='
662
666
  end
663
667
 
664
668
  def list_commands