From e3afffc91d678301fcf7660db541cacc8b7a4e8d Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sat, 17 Aug 2019 23:31:13 -0700 Subject: Initial commit --- rooms.rb | 340 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 rooms.rb (limited to 'rooms.rb') 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 -- cgit v1.2.3