Esempio n. 1
0
int move_npc(Character *c)
{	
	int abil = character_getAbil(c);
	int cx, cy, pcx, pcy, mempcx, mempcy;

	character_getLocation( c, & cx, & cy);
	character_getLocation(pc, &pcx, &pcy);

	character_getMemPCLocation(c, &mempcx, &mempcy);

	// intelligence
	int smart = (1 & abil);
	// telepathy
	int tele = (2 & abil);
	// tunneling
	int tunnel = (4 & abil);
	// erratic
	int erratic = (8 & abil);

	// erractic desicion or no moving instruction
	if ((erratic && rand() % 2) || (!smart && !tele)) 
	{
		move_random(c, tunnel); // 4 & c->c gives tunneling
	}
	else if (smart && tele)
	{
		move_dijkstra(c, tunnel);
	}
	else if (smart)
	{
		if (dungeon_lineOfSight(cx, cy, pcx, pcy))
		{
			move_dijkstra(c, tunnel);
			character_setMemPCLocation(c, pcx, pcy);
		}
		else if (mempcx && mempcy) // has last seen PC
		{
			move_toward(c, mempcx, mempcy, tunnel);
		}
		else
			move_random(c, tunnel);
	}
	else if (tele)
	{
		move_toward(c, pcx, pcy, tunnel); 
	}
	else
	{
		move_random(c, tunnel);
	}
	return 0;
}
Esempio n. 2
0
void step() {
    for (int j = 0; j < 3; j++) {
        for (std::list<Powerup*>::iterator i = POWERUPS.begin(); i != POWERUPS.end(); ++i) {
            if (((*i)->pos - AV[j].pos).norm2() <= AV[j].radius * AV[j].radius) {
                (*i)->collect(&AV[j]);
                delete *i;
                std::list<Powerup*>::iterator k = i++;
                POWERUPS.erase(k);
            }
        }
    }

    for (std::list<Enemy>::iterator i = ENEMIES.begin(); i != ENEMIES.end();) {
        bool del = false;

        if (i->color == RED)   { move_toward(&*i, AV[1].pos, AV[2].pos); }
        if (i->color == GREEN) { move_toward(&*i, AV[2].pos, AV[0].pos); }
        if (i->color == BLUE)  { move_toward(&*i, AV[0].pos, AV[1].pos); }

        for (int j = 0; j < 3; j++) {
            if ((AV[j].pos - i->pos).norm2() < AV[j].range * AV[j].range && AV[j].color == i->color) {
                del = true;
                break;
            }

            if ((AV[j].pos - i->pos).norm2() < AV[j].radius * AV[j].radius) {
                SCORE--;
                FLASH = true;
                del = true;
                break;

            }
        }
        
        i->life -= DT;
        if (i->life < 0) del = true;

        if (del) {
            std::list<Enemy>::iterator j = i++;
            ENEMIES.erase(j);
        }
        else {
            ++i;
        }
    }


    {
        double powLeft  = (AXIS_STATE[2] + 32768.0) / 65536.0;
        double powRight = (AXIS_STATE[5] + 32768.0) / 65536.0;
        AV[0].theta += 6 * DT * (powLeft - powRight);
        AV[0].vel += 6 * DT * std::min(powLeft, powRight) * vec2(cos(AV[0].theta), sin(AV[0].theta));
    }
    step_avatar(AV[0]);
    
    AV[1].vel += 6 * DT * vec2(astate(4), astate(3));
    step_avatar(AV[1]);
    AV[2].vel += 6 * DT * vec2(astate(0), -astate(1));
    step_avatar(AV[2]);


    static double enemytimer = 0;
    static double enemytime = 10;
    enemytime *= pow(1 - 0.01, DT);
    enemytimer -= DT;
    while (enemytimer <= 0) {
        enemytimer += enemytime;
        Enemy e;
        e.color = Color(rand() % 3);
        e.life = 30;
        double theta = randrange(0,2*M_PI);
        e.pos = 20 * vec2(cos(theta), sin(theta));
        ENEMIES.push_back(e);
    }

    static double poweruptimer = 60;
    poweruptimer -= DT;
    while (poweruptimer <= 0) {
        poweruptimer += 30;
        switch (rand() % 3) {
            case 0: POWERUPS.push_back(new PowerupRange); break;
            case 1: POWERUPS.push_back(new PowerupRadius); break;
            case 2: POWERUPS.push_back(new PowerupLife); break;
        }
    }
}