m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/rooms.rb
diff options
context:
space:
mode:
Diffstat (limited to 'rooms.rb')
-rw-r--r--rooms.rb340
1 files changed, 340 insertions, 0 deletions
diff --git a/rooms.rb b/rooms.rb
new file mode 100644
index 0000000..ff71507
--- /dev/null
+++ b/rooms.rb
@@ -0,0 +1,340 @@
+module Rooms
+ class Room
+ def initialize engine
+ @engine = engine
+ end
+
+ def resolve command
+ @command = command
+ if @engine.state == 'invalid'
+ @engine.state = 'play'
+ end
+
+ if @engine.state == 'play'
+ _do_resolve
+ end
+ end
+
+ def check_death
+ if @engine.health <= 0
+ @engine.state = 'dead'
+ elsif @engine.endurance <= 0
+ @engine.state = 'dead'
+ end
+ end
+
+ def _do_resolve
+ do_resolve
+ check_death
+ if !instant_resolve
+ puts "Adding message: #{resolve_message}"
+ @engine.add_message resolve_message
+ end
+ end
+
+ # TODO: limit weapon/armor levels
+ def do_resolve
+ case @command
+ when 'c'
+ when 'w'
+ if @engine.xp >= 50
+ @engine.xp -= 50
+ @engine.magic_weapon += 1
+ @engine.add_message "You've upgraded your magic weapon!"
+ else
+ @engine.add_message 'Not enough XP to upgrade...'
+ end
+ when 'a'
+ if @engine.xp >= 50
+ @engine.xp -= 50
+ @engine.magic_armor += 1
+ @engine.add_message "You've upgraded your magic armor!"
+ else
+ @engine.add_message 'Not enough XP to upgrade...'
+ end
+ else
+ do_invalid
+ end
+ end
+
+ def do_invalid
+ @engine.state = 'invalid'
+ @engine.add_message "Invalid command: #{@command}"
+ enter
+ end
+
+ def resolve_message
+ if @engine.state == 'dead'
+ if @engine.health <= 0
+ death_message
+ elsif @engine.endurance <= 0
+ exhaust_message
+ end
+ else
+ success_message
+ end
+ end
+
+ def enter_message
+ ''
+ end
+
+ def death_message
+ 'You die'
+ end
+
+ def exhaust_message
+ 'You fall over exhausted'
+ end
+
+ def success_message
+ ''
+ end
+
+ def options
+ [
+ 'continue',
+ ]
+ end
+
+ def enter
+ @engine.add_message enter_message
+ if instant_resolve
+ do_instant_resolve
+ @engine.add_message resolve_message
+ end
+
+ options.each do |option|
+ @engine.add_message ">[#{option[0]}]#{option[1..]}"
+ end
+ end
+ end
+
+ class Store < Room
+ def instant_resolve
+ false
+ end
+
+ def enter_message
+ 'You have enough XP to upgrade your equipment!'
+ end
+
+ def options
+ [
+ 'weapon upgrade',
+ 'armor upgrade'
+ ]
+ end
+
+ def do_resolve
+ case @command
+ when 'a'
+ @engine.xp -= 50
+ @engine.magic_armor += 1
+ @engine.add_message "You've upgraded your magic armor!"
+ when 'w'
+ @engine.xp -= 50
+ @engine.magic_weapon += 1
+ @engine.add_message "You've upgraded your magic weapon!"
+ else
+ do_invalid
+ end
+ end
+
+ end
+
+ class Empty < Room
+ def instant_resolve
+ false
+ end
+
+ def do_resolve
+ case @command
+ when 'r'
+ @engine.update_hex 1, 3, 0
+ when 's'
+ @engine.update_hex 3, -1, 0
+ when 'm'
+ else
+ do_invalid
+ end
+ end
+
+ def enter_message
+ 'You enter an empty room. Nothing dangerous or interesting happening here.'
+ end
+
+ def success_message
+ case @command
+ when 'r'
+ 'You rest for a bit. You feel refreshed!'
+ when 's'
+ 'After a while, you find some dried meat. It looks good to eat'
+ when 'm'
+ "You decide there's no time to waste. You continue down the corridor."
+ end
+ end
+
+ def options
+ [
+ 'rest (+1 H, +3 E)',
+ 'scavenge for food (+3 H, -1 E)'
+ ]
+ end
+ end
+
+ class Trap < Room
+ def instant_resolve
+ false
+ end
+
+ def do_resolve
+ case @command
+ when 't'
+ @engine.update_hex -@engine.level, 0, 0
+ when 'd'
+ @engine.update_hex 0, -@engine.level, 0
+ else
+ do_invalid
+ end
+ end
+
+ def success_message
+ case @command
+ when 't'
+ 'Ouch!'
+ when 'd'
+ 'Very carefully, you manage to disable the trap.'
+ end
+ end
+
+ def enter_message
+ 'You stop yourself short. Your foot was about to brush a tripwire!'
+ end
+
+ def options
+ [
+ "trigger trap (-#{@engine.level} H)",
+ "disable trap (-#{@engine.level} E)"
+ ]
+ end
+ end
+
+ class Monster < Room
+ def instant_resolve
+ false
+ end
+
+ def do_resolve
+ case @command
+ when 'r'
+ when 'f'
+ @engine.update_hex -@engine.level, -@engine.level, @engine.level
+ else
+ do_invalid
+ end
+ end
+
+ def enter_message
+ 'You turn the corner and see an ugly monster!'
+ end
+
+ def success_message
+ case @command
+ when 'r'
+ 'You book it from there, heart beating fast. But you manage to lose the monster.'
+ when 'f'
+ 'The monster is defeated, your clothes still wet with blood, its and yours.'
+ end
+ end
+
+ def options
+ [
+ "run away",
+ "fight (-#{@engine.level} H, -#{@engine.level} E, #{@engine.level} X)"
+ ]
+ end
+ end
+
+ class Treasure < Room
+ def instant_resolve
+ true
+ end
+
+ def do_instant_resolve
+ roll = 1 + rand(6)
+ case roll + @engine.level
+ when 1..3
+ @found = 'key'
+ @engine.keys += 1
+ else
+ @found = 'gold'
+ @engine.update_hex 0, 0, @engine.level
+ end
+ end
+
+ def enter_message
+ 'You enter a dusty room. Something shiny on the ground catches your eye.'
+ end
+
+ def success_message
+ case @found
+ when 'key'
+ 'You find a key!'
+ when 'gold'
+ "You found some gold! (+#{@engine.level} X)"
+ end
+ end
+ end
+
+ class Stairs < Room
+ def instant_resolve
+ true
+ end
+
+ def do_instant_resolve
+ p 'increasing level'
+ @engine.level += 1
+ end
+
+ def enter_message
+ 'You come across a set of cracked stairs.'
+ end
+
+ def success_message
+ 'You journey downwards.'
+ end
+ end
+
+ class Boss < Room
+ def instant_resolve
+ true
+ end
+
+ def do_instant_resolve
+ @engine.update_hex -2 * @engine.level, -2 * @engine.level, 2 * @engine.level
+ end
+
+ def enter_message
+ "You encounter a giant boss monster. There's no escape routes, it's live or die!"
+ end
+
+ def success_message
+ 'You defeat the fiend!'
+ end
+ end
+
+ class Exit < Room
+ def instant_resolve
+ true
+ end
+
+ def do_instant_resolve
+ @engine.state = 'win'
+ end
+
+ def success_message
+ 'You won! Congratulations!'
+ end
+ end
+end