// This method is called from the scheduler once every five
// minutes.  It will generate random new creatures.
int Creature::CREGEN()
{
	// Update Task's next_time
	scheduler.TCBLND[Scheduler::TID_CRTREGEN].next_time = 
		scheduler.curTime +
		scheduler.TCBLND[Scheduler::TID_CRTREGEN].frequency;

	int X = CMXPTR;
	dodBYTE B = CTYPES - 1;
	dodBYTE A = 0;
	do
	{
		A += CMXLND[X + B];
		--B;
	} while (B != 255);
	if (A < 32)
	{
		A = rng.RANDOM();
		if (g_cheats&CHEAT_REGEN_SCALING) {
			switch (game.LEVEL) {
			case 0:
				A %= 4; 
				break;
			case 1:
				A %= 5; 
				A += 1;
				break;
			case 2:
				A %= 6; 
				A += 1;
				break;
			case 3:
				A %= 7; 
				A += 2;
				break;
			case 4:
				A %= 7; 
				A += 3;
				break;
			}
		}
		else {
			A &= 7;
			A += 2;
		}
		++CMXLND[X + A];
	}
	return 0;
}
// Creates a new creature and places it in the maze
void Creature::CBIRTH(dodBYTE typ)
{
	int			u, maz_idx;
	RowCol		rndcell;
	dodBYTE		rw, cl;
	int			TCBindex;

	u = -1;
	do
	{
		++u;
	} while (CCBLND[u].P_CCUSE != 0);
	--CCBLND[u].P_CCUSE;

	CCBLND[u].creature_id = typ;
	CCBLND[u].P_CCPOW = CDBTAB[typ].P_CDPOW;
	CCBLND[u].P_CCMGO = CDBTAB[typ].P_CDMGO;
	CCBLND[u].P_CCMGD = CDBTAB[typ].P_CDMGD;
	CCBLND[u].P_CCPHO = CDBTAB[typ].P_CDPHO;
	CCBLND[u].P_CCPHD = CDBTAB[typ].P_CDPHD;
	CCBLND[u].P_CCTMV = CDBTAB[typ].P_CDTMV;
	CCBLND[u].P_CCTAT = CDBTAB[typ].P_CDTAT;

	do
	{
		do
		{
			cl = (rng.RANDOM() & 31);
			rw = (rng.RANDOM() & 31);
			//printf("          %02X, %02X = %02X\n", rw, cl, dungeon.MAZLND[dungeon.RC2IDX(rw, cl)]);
			rndcell.setRC(rw, cl);
			maz_idx = dungeon.RC2IDX(rw, cl);
		} while (dungeon.MAZLND[maz_idx] == 0xFF);
	} while (CFIND(rw, cl) == false);
	
	//printf("----- %02X: %02X, %02X -----\n", typ, rw, cl);
	CCBLND[u].P_CCROW = rw;
	CCBLND[u].P_CCCOL = cl;

	TCBindex = scheduler.GETTCB();
	scheduler.TCBLND[TCBindex].data = u;
	scheduler.TCBLND[TCBindex].type = Scheduler::TID_CRTMOVE;
	scheduler.TCBLND[TCBindex].frequency = CCBLND[u].P_CCTMV;
}