Устанавливаем ловушки и мелкие правки

Сократил массив city_mazeid[] который указывал на города на карте мира, теперь
и города и лабиринты хранятся в структуре world_mazeid, но города имеют id меньше чем MAX_CITYID,
а лабиринты больше. Зачем придумывал два массива мне сейчас и непонятно.

Связи с изменениями слегка поправился код в int makeMaze(int width,int height,int *id,char *data,int wx,int wy,char *dmap)

Также поправил код makeAction(TMazeMap *m,int creatureid,int what,int *ap),
теперь после хода существа (действия ACT_STEP_*) вызывается checkForObject(TMazeCreature *c,TMazeMap *m) - т.е.
проверяем на что наступило существо. Ну пока из объектов только яма с кольями :)

Код процедуры очень тривиален:for(unsigned int i=0;i<m->objects.size();i++)
if (m->objects[i].visible)
if (m->objects[i].x == c->x && m->objects[i].y == c->y)
{
switch (m->objects[i].type)
{
case MAZE_OBJ_TRAPHOLE:
strikeCreature(c,m,100000,MAZE_OBJ_TRAPHOLE,false);
break;

}//switch
break;
}

Т.е проверяем (перебираем объекты) если это яма - то выполняем удар.

Функция void strikeCreature(TMazeCreature *c,TMazeMap *m,int attack,int what,bool calcdefense)

Параметры - указатель на существо, указатель на лабиринты, количество атаки(ущерба), тип атаки и calcdefense - расчитывать(учитывать) броню существа или нет.

В случае ямы-ловушки не учитываем, просто ударяем 100000HP - думаю сдохнет любой ;)

c->params.HP-=damage;
if (c->params.HP == 0)
{
c->Live=false;
c->actionPoint=0;
createNewAction(m,ACT_CR_DEAD,c->Id,what,damage);
}
else
createNewAction(m,ACT_CR_DAMAGED,c->Id,what,damage,c->params.HP);

Т.е. снимаем хп - если стало ноль - говорим что существо не живое (попрошу не путать с мертвое - зомби например изначально мертвые),
для пущей убедительности снимаем очки движения и генерим событие ACT_CR_DEAD если же существо выжило генерим событие ACT_CR_DAMAGED.

В параметрах передаем отчего (откого) нам такой подарочек, сколько он "весит". Если недобили передаем сколько жизни осталось (для обновления на клиенте информации).

Собственно на клиенте - установил новую табличку которая открывается при получении события ACT_CR_DEAD, на нем пишется от чего погиб наш герой и предлагается сгенерить событие
ACT_LEAVE_MAZE - путем клика на кнопочку. А можно не кликать и смотреть как жизнь проходит мимо.

Пока предполагается, что в лабиринте при смерти игрок будет возвращатся в родной город, с потерей всего что у него было при себе, HP игрока станет равно 0 и будет медлено восстанавливаться. Будут и исключения, например артефакт "последний шанс" - который будет возвращать игрока в родной город с HP=1 и с сохранением всего често (или нечестно) набытого непосильным трудом.

Естественно теперь учет удаления лабиринта из активных, не по живым (!Live) как раньше, а по наличию в лабиринте.

Ну и когда писал текст нашел маленький баг. В функции strikeCreature добавил одну незначительную деталь if (m->currentId == c->Id) nextTurn(m);