И тут пришел паук

Почти как в фильме, паука нарисовал не я – а неплохой художник ForEveR aka Сергей, причем совершено добровольно, за это ему респект и уважуха.

И собственно было решено паучка протестить его и запустили в маленький лабиринт с игроком. Тут возникла проблема номер №1, для тестовой арены генерился маленький лабиринтик 10x10, и он не сгенерился, загружая проц на 90-100% комп задумался.
Проблема нашлась быстро, при генерации лабиринта ранее проверялось условие, что количество клеток между входом и выходом должно быть больше или равно полупериоду лабиринта (иными словами w*h/2).
Так вот в таком маленьком лабиринте – это условие не срабатывала, пришлось на скорую руку писать новый алгоритм генерации лабиринтов.

Далее серверная часть – по началу все просто – обрабатываем action = enter_maze, для тестового лабиринта старейшины у нас было mazeid = new_test_arena, а для боя с пауком - new_test_spider.
Код для генерации тот же, за исключением размеров (вместо STD_LABIRINT_WIDTH & STD_LABIRINT_HEIGHT просто 10x10) и маленького кусочка кода:
for(int i=0;i if (i!= c.y*wm+c.x)
if (m->data[i]==0)
{
TMazeCreature spider;
createCreature(TP_CREATURE_SPIDER,&mazeList[mazeid],&spider);
spider.x = i % wm;
spider.y = i / wm;
mazeList[mazeid].creatures.push_back(spider);
createNewAction(&mazeList[mazeid],ACT_INS_CREATURE,spider.Id,spider.x,spider.y);
break;
}

Собственно createCreature и есть главное отличие – оно создает существо по образу и подобию, всмысле по типу и указателю лабиринта.

Указатель на лабиринт нужен для присвоение нужного id существу, а тип – для определения его параметров, которые берутся из структурок (думаю перейти на внешнее хранение, но пока задумки – но было бы неплохо – ввод новых существ без перекомпиляции серверной части).
>extern TCreatureParams basicCreatureParams[TP_CREATURE_LAST + 1];
extern char *creaturesNames[TP_CREATURE_LAST + 1];

Стоит ли говорить что #define TP_CREATURE_SPIDER 0x1.

Для паука пока выбрал аналогичные значения параметров как у человека, кроме силы ее увеличил в два раза (20 вместо 10).

Далее пришлось дописать функцию nextTurn, которая вызывалась автоматически при исходе таймера либо при вызове события endTurn от текущего игрока.
В ней добавилась строчка:
if (players && m->currentId<MAX_ID_CREATURES_INMAZE)
computerTurnCreature(m,m->currentId);

Т.е. если в лабиринте есть игроки-люди и текущий ход – компьютерного персонажа (у людей напомню id больше MAX_ID_CREATURES_INMAZE) то вызывается функция хода для существ под управлением компа.

Пока функция примитивна и вызывает только:
randomizeTurn(m,&(*c));
nextTurn(m);

Т.е. вызывает функцию рандомного перемещения и пропускает ход.
С функцией randomizeTurn я особо не заморачивался:bool randomizeTurn(TMazeMap *m,TMazeCreature *c)
{
int mv[] = {ACT_STEP_WEST,ACT_STEP_NORTH,ACT_STEP_EAST,ACT_STEP_WN,ACT_STEP_EN,ACT_STEP_WS,ACT_STEP_ES};
int ap=c->actionPoint;
for(int i=0;i&lgt;ap*100 && ap>0;i++) {
int what= mv[rand()%8];
makeAction(m,c->Id,what,&ap);}

return ap==0;
}
Потому как она временная и скоро исчезнет.
7 лабиринтов – арена с пауком
Завтра опишу мучения на Flash – это было гораздо сложнее