Атака паука

Собственно не только паука, а любого враждебного существа.
Для ее реализации переписываем функцию bool computerTurnCreature(TMazeMap *m,int creatureid)
{
logaccess(16,"computerTurnCreature(%d)",creatureid);
TMazeCreature *c = getCreature(m,creatureid);
if (!c) return false;
vector<TMazeCreature *> crt;
if (findCreature(m,c,&crt)) {
float iam = Fast_Distance( c->x,c->y);
float min;
int index=0;
for(int i=0;i<(int)crt.size();i++) {
float tmp=Fast_Distance(crt[i]->x,crt[i]->y) - iam;
if (tmp<0) tmp*=-1.0;
if (i==0) min=tmp;
if (tmp
Теперь кроме канонического randomizeTurn() кроважадные существа смотря есть ли в пределах их видимость существо (причем любое) функцией findCreature, далее отыскивается ближайшее и атакуется функцией attackCreature.
Тут наверное более интересна функция поиска существ:
bool findCreature(TMazeMap *m,TMazeCreature *c,vector<TMazeCreature *> *lst)
{
lst->clear();
char *sign = new char[m->w*m->h];
makeSignMap(c->x,c->y,sign,m,getSeeRadius(c));
for(int i=0;i<m->w*m->h;i++)
if (sign[i]) {
for(int j=0;j< (int)m->creatures.size();j++)
if (m->creatures[j].Live)
if (&m->creatures[j]!=c)
if (m->creatures[j].x == i%m->w)
if (m->creatures[j].y == i/m->w)
lst->push_back(&m->creatures[j]);
}
delete [] sign;
return lst->size()>0;
}

Но в ней ничего сложного нет – вызывается makeSignMap которая помечает видимые участки карты байтом с кодом 1 (алгоритм).
Затем смотрим, есть ли существо на каждом открытом квадрате и запоминаем его в векторе.

Функция attackCreature(TMazeMap *m,TMazeCreature *c,TMazeCreature *dest) делает две вещи во-первых подходит на расстояние удара (для пауков это в соседнюю клетку) и атакует.
{
int ap=c->actionPoint;
for(int i=0;i<ap;i++) {
int dx = c->x - dest->x;
int dy = c->y - dest->y;
if (dx<0) dx=-dx;
if (dy<0) dy=-dy;
if (dx<=1 && dy<=1) //mu-ha-ha(!!!)
{
while(ap)
if (!makeAction(m,c->Id,ACT_CR_ATTACK,&ap,dest->Id)) break;
}
else
gotoCreature(m,c,dest->x,dest->y);
}
return true;
}

Код тоже примитивен и мне не нравится (из-за внешнего цикла, тут либо цикл тупой либо проверка, написал быстро – потом перепишу).
Определяем что существо рядом и атакуем или если оно далеко идем к нему.
Резюме – наш герой теперь может погибнуть уже двумя способами (прыгнуть в яму с кольями) или погибнуть в неравной схватке с пауком. В неравной это потому, что сам он отбиваться пока не умеет. А удар паука ~ 13HP. Так что два удара и моменто море.
Планирую вынести существ и их характеристики во внешний файлик, т.к. сильно не нравится такой код:
int getTypeAttack(TMazeCreature *from,TMazeCreature *to) {
if (from->Type==0)
return TP_ATTACK_MELEE_FIST;
if (from->Type==TP_CREATURE_SPIDER)
return TP_ATTACK_MELEE_CLAW;
return TP_ATTACK_MELEE;
}

Ну и естественно прикрутить анимацию атаки паука, сделать возможность ударять героем и его анимацию.
Надеюсь все успеть за новогодние каникулы. С наступившим!