bool Player::HUMAN(dodBYTE c)
{
	int		res;
	dodBYTE	A, B;

	// Check if we are displaying the map
	if (HEARTF == 0)
	{
		game.INIVU();
		viewer.PROMPT();
	}
	if (c == parser.I_CR)
	{
carriage_return:
		viewer.OUTCHR(parser.I_SP);
		parser.LINBUF[parser.LINPTR] = Parser::I_NULL;
		parser.LINBUF[parser.LINPTR+1] = Parser::I_NULL;
		parser.LINPTR = 0;

		if (!PreTranslateCommand(&parser.LINBUF[0]))
		{
			game.AUTFLG = true;
			game.demoRestart = true;
			return false;
		}

		// dispatch to proper routine
		res = parser.PARSER(&parser.CMDTAB[0], A, B, true);
		if (res == 1)
		{
			// dispatch
			switch (A)
			{
			case Parser::CMD_ATTACK:
				PATTK();
				break;
			case Parser::CMD_CLIMB:
				PCLIMB();
				break;
			case Parser::CMD_DROP:
				PDROP();
				break;
			case Parser::CMD_EXAMINE:
				PEXAM();
				break;
			case Parser::CMD_GET:
				PGET();
				break;
			case Parser::CMD_INCANT:
				PINCAN();
				break;
			case Parser::CMD_LOOK:
				PLOOK();
				break;
			case Parser::CMD_MOVE:
				PMOVE();
				break;
			case Parser::CMD_PULL:
				PPULL();
				break;
			case Parser::CMD_REVEAL:
				PREVEA();
				break;
			case Parser::CMD_STOW:
				PSTOW();
				break;
			case Parser::CMD_TURN:
				PTURN();
				break;
			case Parser::CMD_USE:
				PUSE();
				break;
			case Parser::CMD_ZLOAD:
				PZLOAD();
				break;
			case Parser::CMD_ZSAVE:
				PZSAVE();
				break;
			}
		}
		if (res == -1)
		{
			parser.CMDERR();
		}

		if ((HEARTF != 0) && (FAINT == 0))
		{
			viewer.PROMPT();
		}

		parser.LINPTR = 0;
		return true;
	}
	if (c == parser.I_BS)
	{
		if (parser.LINPTR == 0)
		{
			return true;
		}
		--parser.LINPTR;
		viewer.OUTSTR(parser.M_ERAS);
		return true;
	}
	// Buffer normal characters
	viewer.OUTCHR(c);
	parser.LINBUF[parser.LINPTR] = c;
	++parser.LINPTR;
	viewer.OUTSTR(parser.M_CURS);
	if (parser.LINPTR >= 32)
	{
		goto carriage_return;
	}
	return true;
}