Программируем телепорты

Вернее сказать телепорты - это первые "объекты", с которыми можно взаимодействовать (не ландшафт). Для начала пришлось создать отдельную структуру
typedef struct
{
bool visible;
short type,x,y;
int data[6];
} TMazeObject;

visible будет определять существует ли объект или нет, ну и естественно type - тип и координаты объекта x,y.

Для телепортов застолбим тип равный 0x10, а также для других различных телепортов (например в тестовом лабиринте входящий и исходящий телепорт разные) - 0x11,0x12,0x13
Иными словами:
#define MAZE_OBJ_TELEPORT 0x10 //0x10,0x11,0x12,0x13
#define COUNT_TYPE_TELEPORT 4

Ну и венец мысли - расширим структуру лабиринта TMazeMap, еще и vector<TMazeObject> objects;

Для упрощения создания объектов лабиринта пришлось сделать отдельную функцию: void addMazeObject(TMazeMap *m,int x,int y,short type,int _a=0,int _b=0,int _c=0,int _d=0,int _e=0,int _f=0); ее внутряк - обычный push_back. Но думаю сделать проверки на невозможность создания объекта на сущствующем объекте + возможность создания объекта рядом, если место занято и указан соотвествующий флаг.

Также пришлось написать функцию:
TMazeObject *getMazeObject(TMazeMap *m,int x,int y)
{
for(int i=m->objects.size()-1;i>=0;i--)
if (m->objects[i].visible)
if (m->objects[i].x==x && m->objects[i].y==y)
return &m->objects[i];

return NULL;
}

При создании тестового лабиринта добавились строчки

//Начало
addMazeObject(&mazeList[mazeid],data[2],data[3],MAZE_OBJ_TELEPORT+0,0,userList[userid].wx,userList[userid].wy,0);
//Конец
addMazeObject(&mazeList[mazeid],data[4],data[5],MAZE_OBJ_TELEPORT+1,0,userList[userid].wx,userList[userid].wy,1);

data[2],data[3] - координаты входа, data[4],data[5] - координаты выхода, далее указываем в какой лабиринт перемещаемся (0 - ни в какой), и на какие координаты - текущие (город), последний параметр - пойдет ли в зачет успешных лабиринтов данный телепорт (0 - нет, 1 -да).

Для активации телепорта с клиента должен прийти сигнал ACT_ACTIVATE_TELEPORT, который "стоит" 0 очков AP.
Для его обработки естественно, пришлось дописать bool makeAction(TMazeMap *m,int creatureid,int what,int *ap)
case ACT_ACTIVATE_TELEPORT:
{
for(unsigned int i=0;i<m->objects.size();i++)
if (m->objects[i].visible)
if (m->objects[i].type>=MAZE_OBJ_TELEPORT && m->objects[i].type<MAZE_OBJ_TELEPORT+COUNT_TYPE_TELEPORT)
if (m->objects[i].x == c->x && m->objects[i].y == c->y)
{
int mazeid = m->objects[i].data[0];
int nwx = m->objects[i].data[1];
int nwy = m->objects[i].data[2];

if (creatureid>1000)//players
{

userList[creatureid].mazeid=mazeid;
userList[creatureid].wx=nwx;
userList[creatureid].wy=nwy;

createNewAction(m,ACT_LEAVE_MAZE,creatureid,ACT_ACTIVATE_TELEPORT);

m->creatures.erase(c); //bye-bye
}

}

break;
}

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

Осталось за малым - получить этот сигнал от клиента :)