# File lib/core/account.rb, line 148
  def parse_messages(msg)
    case @mode
    when :initialize
      # ignore everything until negotiation done
    when :name
      publish("[clearline]") if @terminal =~ /^vt|xterm/
      @login_name = msg.proper_name
      if options['guest_accounts'] && @login_name =~ /Guest/i
        self.name = "Guest#{id}"
        @character = new_char
        put_object(self)
        world.all_accounts << id
        # make the account non-swappable so we dont lose connection
        Engine.instance.db.makenoswap(id)
        @conn.set(:color, color)
        welcome
        @mode = :playing
      elsif @login_name.empty?
        sendmsg(append_echo("login> "))
        @mode = :name
      else
        acctid = world.all_accounts.find {|a|
          @login_name == get_object(a).name
        }
        @account = get_object(acctid)
        sendmsg(append_echo("password> "))
        @conn.set(:hide, true)
        @mode = :password
      end
    when :password
      @login_passwd = msg
      @conn.set(:hide, false)
      if @account.nil?  # new account
        sendmsg(append_echo("Create new user?\n'Y/y' to create, Hit enter to retry login> "))
        @mode = :newacct
      else
        if @login_passwd.is_passwd?(@account.passwd)  # good login
          # deregister all observers here and on connection
          unsubscribe_all
          @conn.unsubscribe_all
          # reregister all observers to @account
          @conn.subscribe(@account.id)
          # make the account non-swappable so we dont lose connection
          Engine.instance.db.makenoswap(@account.id)
          @conn.set(:color, @account.color)
          switch_acct(@account)
          # Check if this account already logged in
          reconnect = false
          if @account.subscriber_count > 0
            @account.publish(:reconnecting)
            @account.unsubscribe_all
            reconnect = true
          end
          @account.subscribe(@conn)
          if options['account_system']
            @account.sendmsg(append_echo(login_menu))
            @account.mode = :menu
          else
            @character = get_object(@account.characters.first)
            # make the character non-swappable so we dont lose references
            Engine.instance.db.makenoswap(@character.id)
            world.connected_characters << @character.id
            @character.account = @account
            @account.character = @character
            welcome(reconnect)
            @account.mode = :playing
          end
        else  # bad login
          @checked -= 1
          sendmsg(append_echo("Sorry wrong password."))
          if @checked < 1
            disconnect
          else
            @mode = :name
            sendmsg(append_echo("login> "))
          end
        end
      end
    when :newacct
      if msg =~ /^y/i
        self.name = @login_name
        self.passwd = @login_passwd.encrypt
        put_object(self)
        # make the account non-swappable so we dont lose connection
        Engine.instance.db.makenoswap(id)
        world.all_accounts << id
        @conn.set(:color, color)
        if options['account_system']
          sendmsg(append_echo(login_menu))
          @mode = :menu
        else
          @character = new_char
          welcome
          @mode = :playing
        end
      else
        @mode = :name
        sendmsg(append_echo("login> "))
      end
    when :menu, :menucr, :menupl
      parse_menu(msg)
    when :playing
      @character.parse(msg)
    else
      log.error "Account#parse_messages unknown :mode - #{@mode.inspect}"
    end
  end