gemwarrior 0.4.1 → 0.5

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/bin/gemwarrior +0 -0
  3. data/lib/gemwarrior/entities/creature.rb +13 -18
  4. data/lib/gemwarrior/entities/entity.rb +3 -9
  5. data/lib/gemwarrior/entities/item.rb +6 -13
  6. data/lib/gemwarrior/entities/items/bed.rb +19 -0
  7. data/lib/gemwarrior/entities/items/feather.rb +19 -0
  8. data/lib/gemwarrior/entities/items/gun.rb +19 -0
  9. data/lib/gemwarrior/entities/items/stalactite.rb +19 -0
  10. data/lib/gemwarrior/entities/items/stone.rb +19 -0
  11. data/lib/gemwarrior/entities/items/tree.rb +19 -0
  12. data/lib/gemwarrior/entities/location.rb +38 -74
  13. data/lib/gemwarrior/entities/monster.rb +12 -35
  14. data/lib/gemwarrior/entities/monsters/alexandrat.rb +30 -0
  15. data/lib/gemwarrior/entities/monsters/amberoo.rb +30 -0
  16. data/lib/gemwarrior/entities/monsters/amethystle.rb +30 -0
  17. data/lib/gemwarrior/entities/monsters/apatiger.rb +30 -0
  18. data/lib/gemwarrior/entities/monsters/aquamarine.rb +30 -0
  19. data/lib/gemwarrior/entities/monsters/bloodstorm.rb +30 -0
  20. data/lib/gemwarrior/entities/monsters/citrinaga.rb +30 -0
  21. data/lib/gemwarrior/entities/monsters/coraliz.rb +30 -0
  22. data/lib/gemwarrior/entities/monsters/cubicat.rb +30 -0
  23. data/lib/gemwarrior/entities/monsters/diaman.rb +30 -0
  24. data/lib/gemwarrior/entities/player.rb +117 -154
  25. data/lib/gemwarrior/evaluator.rb +31 -16
  26. data/lib/gemwarrior/game.rb +28 -26
  27. data/lib/gemwarrior/inventory.rb +14 -16
  28. data/lib/gemwarrior/misc/version.rb +1 -1
  29. data/lib/gemwarrior/misc/wordlist.rb +7 -1
  30. data/lib/gemwarrior/repl.rb +2 -2
  31. data/lib/gemwarrior/world.rb +130 -298
  32. metadata +20 -7
  33. data/lib/gemwarrior/defaults.rb +0 -137
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/alexandrat.rb
2
+ # Alexandrat monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Alexandrat < Monster
8
+ def initialize
9
+ self.name = 'alexandrat'
10
+ self.description = 'Tiny, but fierce, color-changing rodent.'
11
+ self.face = 'ugly'
12
+ self.hands = 'gnarled'
13
+ self.mood = 'unsurprisingly unchipper'
14
+
15
+ self.level = rand(1..2)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 1.5).floor)
19
+ self.atk_hi = rand((level * 1.5).floor..(level * 2))
20
+ self.defense = rand(level..(level * 1.5).floor)
21
+ self.dexterity = rand(1..3)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'Bitey, bitey!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/amberoo.rb
2
+ # Amberoo monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Amberoo < Monster
8
+ def initialize
9
+ self.name = 'amberoo'
10
+ self.description = 'Fossilized and jumping around like an adorably dangerous threat from the past.'
11
+ self.face = 'punchy'
12
+ self.hands = 'balled'
13
+ self.mood = 'jumpy'
14
+
15
+ self.level = rand(1..2)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 2))
19
+ self.atk_hi = rand((level * 2)..(level * 2.5).floor)
20
+ self.defense = rand((level * 2)..(level * 2.5).floor)
21
+ self.dexterity = rand(3..4)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'I\'m hoppin\' mad!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/amethystle.rb
2
+ # Amethystle monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Amethystle < Monster
8
+ def initialize
9
+ self.name = 'amethystle'
10
+ self.description = 'Sober and contemplative, it moves with purplish tentacles swaying in the breeze.'
11
+ self.face = 'sharp'
12
+ self.hands = 'loose'
13
+ self.mood = 'mesmerizing'
14
+
15
+ self.level = rand(2..3)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 1.5).floor)
19
+ self.atk_hi = rand((level * 1.5).floor..(level * 2.5).floor)
20
+ self.defense = rand(2..4)
21
+ self.dexterity = rand(1..2)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'You\'ve found yourself in quite the thorny issue!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/apatiger.rb
2
+ # Apatiger monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Apatiger < Monster
8
+ def initialize
9
+ self.name = 'apatiger'
10
+ self.description = 'Apathetic about most everything as it lazes around, save for eating you.'
11
+ self.face = 'calloused'
12
+ self.hands = 'soft'
13
+ self.mood = 'apathetic'
14
+
15
+ self.level = rand(4..5)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 1.5).floor)
19
+ self.atk_hi = rand((level * 1.5).floor..(level * 2.5).floor)
20
+ self.defense = rand(4..7)
21
+ self.dexterity = rand(3..7)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'Gggggggggrrrrrrrrrrrrrrrrooooooooooowwwwwwwwwwwwlllllllll!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/aquamarine.rb
2
+ # Aquamarine monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Aquamarine < Monster
8
+ def initialize
9
+ self.name = 'aquamarine'
10
+ self.description = 'It is but one of the few, the proud, the underwater.'
11
+ self.face = 'strained'
12
+ self.hands = 'hairy'
13
+ self.mood = 'tempered'
14
+
15
+ self.level = rand(3..4)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 1.5).floor)
19
+ self.atk_hi = rand((level * 1.5).floor..(level * 2.5).floor)
20
+ self.defense = rand(3..5)
21
+ self.dexterity = rand(4..6)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'Attention! You are about to get smashed!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/bloodstorm.rb
2
+ # Bloodstorm monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Bloodstorm < Monster
8
+ def initialize
9
+ self.name = 'bloodstorm'
10
+ self.description = 'A literal swirling, maniacal vortex of human hemoglobin.'
11
+ self.face = 'bloody'
12
+ self.hands = 'bloody'
13
+ self.mood = 'boiling'
14
+
15
+ self.level = rand(5..6)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 1.5).floor)
19
+ self.atk_hi = rand((level * 1.5).floor..(level * 3).floor)
20
+ self.defense = rand(6..7)
21
+ self.dexterity = rand(5..7)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = '/swirls'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/citrinaga.rb
2
+ # Citrinaga monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Citrinaga < Monster
8
+ def initialize
9
+ self.name = 'citrinaga'
10
+ self.description = 'Refreshing in its shiny, gleaming effectiveness at ending your life.'
11
+ self.face = 'shiny'
12
+ self.hands = 'glistening'
13
+ self.mood = 'staid'
14
+
15
+ self.level = rand(5..7)
16
+ self.hp_cur = rand((level * 2)..(level*3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level*1.5).floor)
19
+ self.atk_hi = rand((level*1.5).floor..(level*3).floor)
20
+ self.defense = rand(7..9)
21
+ self.dexterity = rand(6..7)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 3))
26
+
27
+ self.battlecry = 'Slice and dice so nice!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/coraliz.rb
2
+ # Coraliz monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Coraliz < Monster
8
+ def initialize
9
+ self.name = 'coraliz'
10
+ self.description = 'Small blue lizard that slithers around, nipping at your ankles.'
11
+ self.face = 'spotted'
12
+ self.hands = 'slippery'
13
+ self.mood = 'emotionless'
14
+
15
+ self.level = rand(5..8)
16
+ self.hp_cur = rand((level * 2)..(level*3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 3).floor)
19
+ self.atk_hi = rand((level * 3).floor..(level * 3).floor)
20
+ self.defense = rand(4..6)
21
+ self.dexterity = rand(7..9)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 3))
26
+
27
+ self.battlecry = 'Where am I? You\'ll never guess!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/cubicat.rb
2
+ # Cubicat monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Cubicat < Monster
8
+ def initialize
9
+ self.name = 'cubicat'
10
+ self.description = 'Perfectly geometrically cubed feline, fresh from its woven enclosure, claws at the ready.'
11
+ self.face = 'striking'
12
+ self.hands = 'grippy'
13
+ self.mood = 'salacious'
14
+
15
+ self.level = rand(6..8)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 2).floor)
19
+ self.atk_hi = rand((level * 2).floor..(level * 3).floor)
20
+ self.defense = rand(5..7)
21
+ self.dexterity = rand(8..10)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'I don\'t really care, as long as you die!'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # lib/gemwarrior/entities/monsters/diaman.rb
2
+ # Diaman monster
3
+
4
+ require_relative '../monster'
5
+
6
+ module Gemwarrior
7
+ class Diaman < Monster
8
+ def initialize
9
+ self.name = 'diaman'
10
+ self.description = 'Crystalline structure in the form of a man, lumbering toward you, with outstretched, edged pincers.'
11
+ self.face = 'bright'
12
+ self.hands = 'jagged'
13
+ self.mood = 'adamant'
14
+
15
+ self.level = rand(8..10)
16
+ self.hp_cur = rand((level * 2)..(level * 3))
17
+ self.hp_max = hp_cur
18
+ self.atk_lo = rand(level..(level * 2.5).floor)
19
+ self.atk_hi = rand((level * 2.5).floor..(level * 3).floor)
20
+ self.defense = rand(5..7)
21
+ self.dexterity = rand(8..10)
22
+
23
+ self.inventory = Inventory.new
24
+ self.rox = rand((level * 2)..(level * 3))
25
+ self.xp = rand(level..(level * 2))
26
+
27
+ self.battlecry = 'Precious human, prepare to be lost to the annals of time!'
28
+ end
29
+ end
30
+ end
@@ -6,53 +6,50 @@ require_relative 'creature'
6
6
  module Gemwarrior
7
7
  class Player < Creature
8
8
  # CONSTANTS
9
- ## ATTRIBUTE POOLS
10
- CHAR_UPPER_POOL = (65..90).map{ |i| i.chr }
11
- CHAR_LOWER_POOL = (97..122).map{ |i| i.chr }
9
+ ## CHARACTER ATTRIBUTES
10
+ CHAR_UPPER_POOL = (65..90).map{ |i| i.chr }
11
+ CHAR_LOWER_POOL = (97..122).map{ |i| i.chr }
12
12
  CHAR_LOWER_VOWEL_POOL = ['a','e','i','o','u','y']
13
-
14
- FACE_DESC = ['smooth', 'tired', 'ruddy', 'moist', 'shocked', 'handsome', '5 o\'clock-shadowed']
15
- HANDS_DESC = ['worn', 'balled into fists', 'relaxed', 'cracked', 'tingly', 'mom\'s spaghetti']
16
- MOOD_DESC = ['calm', 'excited', 'depressed', 'tense', 'lackadaisical', 'angry', 'positive']
17
-
18
- ## PLAYER DEFAULTS
19
- PLYR_DESC_DEFAULT = 'Picked to do battle against a wizened madman for a shiny something or other for world-saving purposes, you\'re actually fairly able, as long as you\'ve had breakfast first.'
20
13
 
14
+ FACE_DESC = ['smooth', 'tired', 'ruddy', 'moist', 'shocked', 'handsome', '5 o\'clock-shadowed']
15
+ HANDS_DESC = ['worn', 'balled into fists', 'relaxed', 'cracked', 'tingly', 'mom\'s spaghetti']
16
+ MOOD_DESC = ['calm', 'excited', 'depressed', 'tense', 'lackadaisical', 'angry', 'positive']
17
+
21
18
  ## ERRORS
22
- ERROR_GO_PARAM_INVALID = 'The place in that direction is far, far, FAR too dangerous. You should try a different way.'
23
- ERROR_ATTACK_PARAM_INVALID = 'That monster doesn\'t exist here or can\'t be attacked.'
24
- ERROR_ATTACK_OPTION_INVALID = 'That won\'t do anything against the monster.'
19
+ ERROR_ATTACK_OPTION_INVALID = 'That will not do anything against the monster.'
25
20
 
26
- attr_accessor :xp, :stam_cur, :stam_max, :atk_hi, :atk_lo,
27
- :defense, :dexterity, :rox, :cur_loc,
28
- :god_mode
21
+ attr_accessor :stam_cur, :stam_max, :cur_coords, :god_mode
29
22
 
30
23
  def initialize(options)
31
- generate_player_identity
32
-
33
- self.level = options[:level]
34
- self.xp = options[:xp]
24
+ self.name = generate_name
25
+ self.description = options.fetch(:description)
35
26
 
36
- self.hp_cur = options[:hp_cur]
37
- self.hp_max = options[:hp_max]
38
- self.stam_cur = options[:stam_cur]
39
- self.stam_max = options[:stam_max]
27
+ self.face = generate_face
28
+ self.hands = generate_hands
29
+ self.mood = generate_mood
40
30
 
41
- self.atk_lo = options[:atk_lo]
42
- self.atk_hi = options[:atk_hi]
43
- self.defense = options[:defense]
44
- self.dexterity = options[:dexterity]
31
+ self.level = options.fetch(:level)
32
+ self.xp = options.fetch(:xp)
33
+ self.hp_cur = options.fetch(:hp_cur)
34
+ self.hp_max = options.fetch(:hp_max)
35
+ self.atk_lo = options.fetch(:atk_lo)
36
+ self.atk_hi = options.fetch(:atk_hi)
45
37
 
46
- self.inventory = options[:inventory]
47
- self.rox = options[:rox]
38
+ self.defense = options.fetch(:defense)
39
+ self.dexterity = options.fetch(:dexterity)
48
40
 
49
- self.cur_loc = options[:cur_loc]
50
-
51
- self.god_mode = false
41
+ self.inventory = Inventory.new
42
+ self.rox = options.fetch(:rox)
43
+
44
+ self.stam_cur = options.fetch(:stam_cur)
45
+ self.stam_max = options.fetch(:stam_max)
46
+ self.cur_coords = options.fetch(:cur_coords)
47
+
48
+ self.god_mode = false
52
49
  end
53
50
 
54
51
  def check_self(show_pic = true)
55
- if show_pic
52
+ unless show_pic == false
56
53
  print_char_pic
57
54
  end
58
55
 
@@ -71,10 +68,13 @@ module Gemwarrior
71
68
  self_text << "XP : #{xp}\n"
72
69
  self_text << "HP : #{hp_cur}|#{hp_max}\n"
73
70
  self_text << "ATK : #{atk_lo}-#{atk_hi}\n"
74
- self_text << "DEF : #{defense}\n"
75
71
  self_text << "DEX : #{dexterity}\n"
72
+ self_text << "DEF : #{defense}\n"
76
73
  self_text << "GOD : #{god_mode}\n\n"
77
- self_text << "You check yourself. Currently breathing, wearing clothing, and with a few other specific characteristics: face is #{face}, hands are #{hands}, and general mood is #{mood}.\n"
74
+
75
+ self_text << "#{description}\n\n"
76
+
77
+ self_text << "Current status - breathing, wearing clothing, and with a few other specific characteristics: face is #{face}, hands are #{hands}, and general mood is #{mood}.\n"
78
78
  end
79
79
 
80
80
  def rest
@@ -86,11 +86,13 @@ module Gemwarrior
86
86
  mins_text = minutes == 1 ? "minute" : "minutes"
87
87
  secs_text = seconds == 1 ? "second" : "seconds"
88
88
 
89
+ self.hp_cur = hp_max
90
+
89
91
  return "You lie down somewhere quasi-flat and after a few moments, due to extreme exhaustion, you fall into a deep slumber. Approximately #{hours} #{hours_text}, #{minutes} #{mins_text}, and #{seconds} #{secs_text} later, you wake up with a start, look around you, notice nothing in particular, and get back up, ready to go again."
90
92
  end
91
93
 
92
94
  def stamina_dec
93
- stam_cur = stam_cur - 1
95
+ self.stam_cur = stam_cur - 1
94
96
  end
95
97
 
96
98
  def modify_name
@@ -111,113 +113,86 @@ module Gemwarrior
111
113
  def list_inventory
112
114
  inventory.list_contents
113
115
  end
114
-
115
- def loc_by_id(locations, id)
116
- locations.each do |loc|
117
- if loc.id.to_i.equal? id
118
- return loc
119
- end
120
- end
121
- return nil
122
- end
123
-
124
- def can_move?(direction)
125
- cur_loc.has_loc_to_the?(direction)
126
- end
127
-
116
+
128
117
  def go(locations, direction)
129
118
  case direction
130
- when "n"
131
- direction = "north"
132
- when "e"
133
- direction = "east"
134
- when "s"
135
- direction = "south"
136
- when "w"
137
- direction = "west"
138
- end
139
- unless direction.nil?
140
- if can_move?(direction)
141
- new_loc_id = cur_loc.locs_connected[direction.to_sym]
142
- self.cur_loc = loc_by_id(locations, new_loc_id)
143
- print_traveling_text
144
- self.cur_loc.checked_for_monsters = false
145
- self.cur_loc.describe
146
- else
147
- ERROR_GO_PARAM_INVALID
148
- end
119
+ when 'north', 'n'
120
+ self.cur_coords = {:x => cur_coords[:x], :y => cur_coords[:y]+1}
121
+ when 'east', 'e'
122
+ self.cur_coords = {:x => cur_coords[:x]+1, :y => cur_coords[:y]}
123
+ when 'south', 's'
124
+ self.cur_coords = {:x => cur_coords[:x], :y => cur_coords[:y]-1}
125
+ when 'west', 'w'
126
+ self.cur_coords = {:x => cur_coords[:x]-1, :y => cur_coords[:y]}
149
127
  end
128
+ print_traveling_text
150
129
  end
151
130
 
152
- def attack(monster_name)
153
- if cur_loc.has_monster_to_attack?(monster_name)
154
- print_battle_line
155
- puts "You decide to attack the #{monster_name}!"
156
- monster = cur_loc.monster_by_name(monster_name)
157
- puts "#{monster.name} cries out: #{monster.battlecry}"
131
+ def attack(world, monster)
132
+ print_battle_line
133
+ puts "You decide to attack the #{monster.name}!"
134
+
135
+ puts "#{monster.name} cries out: #{monster.battlecry}"
158
136
 
159
- # first strike!
160
- if calculate_first_strike(monster)
161
- puts "#{monster.name} strikes first!"
162
- player_attacked_by(monster)
137
+ # first strike!
138
+ if calculate_first_strike(monster)
139
+ puts "#{monster.name} strikes first!"
140
+ player_attacked_by(monster)
141
+ end
142
+
143
+ # main battle loop
144
+ loop do
145
+ if (monster.hp_cur <= 0)
146
+ monster_death(world, monster)
147
+ return
148
+ elsif (hp_cur <= 0 && !god_mode)
149
+ player_death(monster)
163
150
  end
164
-
165
- # main battle loop
166
- loop do
167
- if (monster.hp_cur <= 0)
168
- monster_death(monster)
169
- return
170
- elsif (hp_cur <= 0 && !god_mode)
171
- player_death(monster)
172
- end
173
151
 
174
- puts
175
- puts "[Fight/Attack][Look][Run]"
176
- puts "P :: #{hp_cur} HP\n"
177
- puts "M :: #{monster.hp_cur} HP\n"
178
-
179
- if ((monster.hp_cur.to_f / monster.hp_max.to_f) < 0.10)
180
- puts "#{monster.name} is almost dead!\n"
181
- end
182
-
183
- puts 'What do you do?'
184
- cmd = gets.chomp.downcase
185
-
186
- # player action
187
- case cmd
188
- when 'fight', 'f', 'attack', 'a'
189
- puts "You attack #{monster.name}#{cur_weapon_name}!"
190
- dmg = calculate_mob_damage
191
- if dmg > 0
192
- puts "You wound it for #{dmg} point(s)!"
193
- monster.take_damage(dmg)
194
- if (monster.hp_cur <= 0)
195
- monster_death(monster)
196
- return
197
- end
198
- else
199
- puts "You miss entirely!"
200
- end
201
- when 'look', 'l'
202
- puts "#{monster.name}: #{monster.description}"
203
- puts "Its got some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
204
- when 'run', 'r'
205
- if player_escape?(monster)
206
- monster.hp_cur = monster.hp_max
207
- puts "You successfully elude #{monster.name}!"
152
+ puts
153
+ puts "[Fight/Attack][Look][Run]"
154
+ puts "P :: #{hp_cur} HP\n"
155
+ puts "M :: #{monster.hp_cur} HP\n"
156
+
157
+ if ((monster.hp_cur.to_f / monster.hp_max.to_f) < 0.10)
158
+ puts "#{monster.name} is almost dead!\n"
159
+ end
160
+
161
+ puts 'What do you do?'
162
+ cmd = gets.chomp.downcase
163
+
164
+ # player action
165
+ case cmd
166
+ when 'fight', 'f', 'attack', 'a'
167
+ puts "You attack #{monster.name}#{cur_weapon_name}!"
168
+ dmg = calculate_mob_damage
169
+ if dmg > 0
170
+ puts "You wound it for #{dmg} point(s)!"
171
+ monster.take_damage(dmg)
172
+ if (monster.hp_cur <= 0)
173
+ monster_death(world, monster)
208
174
  return
209
- else
210
- puts "You were not able to run away! :-("
211
175
  end
212
176
  else
213
- puts ERROR_ATTACK_OPTION_INVALID
177
+ puts "You miss entirely!"
214
178
  end
215
-
216
- # monster action
217
- player_attacked_by(monster)
179
+ when 'look', 'l'
180
+ puts "#{monster.name}: #{monster.description}"
181
+ puts "Its got some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
182
+ when 'run', 'r'
183
+ if player_escape?(monster)
184
+ monster.hp_cur = monster.hp_max
185
+ puts "You successfully elude #{monster.name}!"
186
+ return
187
+ else
188
+ puts "You were not able to run away! :-("
189
+ end
190
+ else
191
+ puts ERROR_ATTACK_OPTION_INVALID
218
192
  end
219
- else
220
- ERROR_ATTACK_PARAM_INVALID
193
+
194
+ # monster action
195
+ player_attacked_by(monster)
221
196
  end
222
197
  end
223
198
 
@@ -225,17 +200,17 @@ module Gemwarrior
225
200
 
226
201
  # COMBAT
227
202
  def update_player_stats(monster)
228
- self.xp = xp + monster.xp_to_give
229
- self.rox = rox + monster.rox_to_give
203
+ self.xp = xp + monster.xp
204
+ self.rox = rox + monster.rox
230
205
  end
231
206
 
232
- def monster_death(monster)
207
+ def monster_death(world, monster)
233
208
  puts "You have defeated #{monster.name}!"
234
- puts "You have received #{monster.xp_to_give} XP!"
235
- puts "You have found #{monster.rox_to_give} barterable rox on your slain opponent!"
209
+ puts "You have received #{monster.xp} XP!"
210
+ puts "You have found #{monster.rox} barterable rox on your slain opponent!"
236
211
  print_battle_line
237
212
  update_player_stats(monster)
238
- cur_loc.remove_monster(monster.name)
213
+ world.location_by_coords(cur_coords).remove_monster(monster.name)
239
214
  end
240
215
 
241
216
  def player_death(monster)
@@ -319,7 +294,7 @@ module Gemwarrior
319
294
  print "#{Matrext::process({ :phrase => ">>>", :sl => true })}"
320
295
  print " *\n"
321
296
  end
322
- loc.join
297
+ return loc.join
323
298
  end
324
299
 
325
300
  # CHARACTER
@@ -335,6 +310,10 @@ module Gemwarrior
335
310
  puts char_pic
336
311
  end
337
312
 
313
+ def print_battle_line
314
+ puts '**************************************'
315
+ end
316
+
338
317
  # INIT
339
318
  def generate_name
340
319
  name = []
@@ -347,10 +326,6 @@ module Gemwarrior
347
326
  return name.join
348
327
  end
349
328
 
350
- def generate_desc
351
- PLYR_DESC_DEFAULT
352
- end
353
-
354
329
  def generate_face
355
330
  FACE_DESC[rand(0..FACE_DESC.length-1)]
356
331
  end
@@ -362,17 +337,5 @@ module Gemwarrior
362
337
  def generate_mood
363
338
  MOOD_DESC[rand(0..MOOD_DESC.length-1)]
364
339
  end
365
-
366
- def generate_player_identity
367
- self.name = generate_name
368
- self.description = generate_desc
369
- self.face = generate_face
370
- self.hands = generate_hands
371
- self.mood = generate_mood
372
- end
373
-
374
- def print_battle_line
375
- puts '**************************************'
376
- end
377
340
  end
378
341
  end