Beispiel #1
0
Exec_stat MCWait::exec(MCExecPoint &ep)
{
	while (True)
	{
		MCU_play();
		if (duration == NULL)
		{
			if (MCscreen->wait(MCmaxwait, messages, messages) || MCabortscript)
			{
				MCeerror->add(EE_WAIT_ABORT, line, pos);
				return ES_ERROR;
			}
			break;
		}
		else
		{
			if (duration->eval(ep) != ES_NORMAL)
			{
				MCeerror->add(EE_WAIT_BADEXP, line, pos);
				return ES_ERROR;
			}
			switch (condition)
			{
			case RF_FOR:
				real8 delay;
				if (ep.getreal8(delay, line, pos, EE_WAIT_NAN) != ES_NORMAL)
					return ES_ERROR;
				switch (units)
				{
				case F_MILLISECS:
					delay /= 1000.0;
					break;
				case F_TICKS:
					delay /= 60.0;
					break;
				default:
					break;
				}
				if (MCscreen->wait(delay, messages, False))
				{
					MCeerror->add(EE_WAIT_ABORT, line, pos);
					return ES_ERROR;
				}
				return ES_NORMAL;
			case RF_UNTIL:
				if (ep.getsvalue() == MCtruemcstring)
					return ES_NORMAL;
				if (MCscreen->wait(WAIT_INTERVAL, messages, True))
				{
					MCeerror->add(EE_WAIT_ABORT, line, pos);
					return ES_ERROR;
				}
				break;
			case RF_WHILE:
				if (ep.getsvalue() == MCfalsemcstring)
					return ES_NORMAL;
				if (MCscreen->wait(WAIT_INTERVAL, messages, True))
				{
					MCeerror->add(EE_WAIT_ABORT, line, pos);
					return ES_ERROR;
				}
				break;
			default:
				return ES_ERROR;
			}
		}
	}
	return ES_NORMAL;
}