Реализация заявок

Собственно реализация - получение списка текущих заявок, добавление заявок и хранение их где-то.

Структура заявок - TMazeDemand
typedef struct
{
bool close; //close?
int id;
int type; //type
int place; //location
time_t stime; //start time
time_t etime; //end time
vector<int> victim; //players
} TMazeDemand;

Ну все кажется понятным, кроме close - что заявка уже закрыта (пока не знаю для чего это нужно, но кажется нужно).

В структуре map<int,TMazeDemand> mazeDemands храняться все заявки (но думаю это временно, а потом будет некая функция, которая по ид достает заявку)
А в структуре vector<int> activeDemands - только активные-текущие.

Для городской арены, думаю не выводить заявки, т.к. есть только одна открытая или нет ни одной ;)

А при нажатии учавствывать на арене вызываем функцию addDemand(TUser *u,int _type), с типом арены TP_ARENA_ARENA_CITY (а других типов пока нет)
Далее определяется по u->id его местоположение через функцию inCity(u->wx,u->wy), которая возвращает id города или 0, если не в городе (тогда нет арены)
По типу арены определяем максимальное количество участников.
Далее перебираем все активные заявки (activeDemands), не закрытые (!md->close) и у которых местонахождение и тип совпадает с входящими параметрами.
Если такой нашли проверяем сколько в нем уже игроков (md->victim.size()) и если их меньше чем максимальное, то присоединяемся в арену. (Тут думаю нужно ставить блокировки, что игрок в заявке - наверное нужно ввести флаг у TUser)
При наборе максимальном количестве участников - вызываем processDemand, которая создает арену-лабиринт и помещает туда игроков.
Если не нашли свободной заявки - то создаем новую и ждем.

Функция processDemand создает лабиринт (с типом связанным с типом арены, для арены TP_ARENA_ARENA_CITY, тип лабиринта TP_MAZE_LAST_ONE - писал про типы лабиринтов тут) и помещает всех игроков.
С расстановкой участников написал следующий код:
typedef struct {float dx,dy;} float_off;
float_off global_pos[10][10] =
{
/*0*/{{0.0,0.0}},
/*1*/{{0.5,0.5}},
/*2*/{{0.0,0.0},{1.0,1.0}},
/*3*/{{0.5,1.0},{0.0,1.0},{1.0,1.0}},
/*4*/{{0.0,0.0},{1.0,0.0},{0.0,1.0},{1.0,1.0}},
/*5*/{{0.0,0.0},{1.0,0.0},{0.0,1.0},{1.0,1.0},{0.5,0.5}},
/*6*/{{0.0,0.1},{0.5,0.0},{1.0,0.1},{0.9,1.0},{0.5,1.0},{1.0,0.9}},
/*7*/{{0.0,0.1},{0.5,0.0},{1.0,0.1},{0.9,1.0},{0.5,1.0},{1.0,0.9},{0.5,0.5}},
/*8*/{{0.0,0.0},{0.5,0.0},{1.0,0.0},{0.0,0.5},{0.0,1.0},{0.5,1.0},{1.0,1.0},{1.0,0.5}},
/*9*/{{0.0,0.0},{0.5,0.0},{1.0,0.0},{0.0,0.5},{0.0,1.0},{0.5,1.0},{1.0,1.0},{1.0,0.5},{0.5,0.5}},
};

При добавлении i-участника, его координаты:
xx= int((float)wm*global_pos[md->vitim.size()][i].dx);
yy= int((float)hm*global_pos[md->vitim.size()][i].dy);
findFreeSquare(m,&xx,&yy);

(wm,hm - размеры лабиринта, md - указатель на заявку)
Фукнция findFreeSquare ищет ближайшее свободное место от xx,yy