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; }
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; } } }