gemwarrior 0.4.1 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
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