Объять не объятное

Пытался сделать все сразу, но не получается – решил вот на выходных расписать, что именно и как нужно сделать.
Задача. Сделать на странице города вход в тестовый лабиринт – для сбора, скажем тестовых очков – и выходе из лабиринта при нахождении оного.
Что уже есть. Есть страница логина и страничка города (пока пустая). В ней поставить ссылку типа /maze?mazeid=new_test_arena&type=enter – нефиг делать. А дальше нужно:
А) сделать редирект на /maze в него передать сгенерированный mazeid, userid и сессию – для загрузки флэша
Т.е. при переходе по ссылке mazeid=new_arena с типом(type)=0, генерим новый замкнутый лабиринт, получаем его id и возвращаем с редиректом на /maze
Б) Во флэш принимаем параметры, грузим карту – и тут пока пусто, что делать.
Это было на бумаге, а вот что пришлось делать реально.

Сгенирировать новый лабиринт это легко, теперь нужно дать понять, что игрок находиться в этом лабиринте. Для глобального перемещение в структуре TUser есть wx и wy (worldX,worldY) – а по карте world_mazeid – можно определить в городе мы или лабиринте, но для внутренних лабиринтов города, а также турниров координаты будут совпадать с координатами города, поэтому пришлось вводить новую переменную mazeid – которая отличная от нуля показывала, что игрок в лабиринте.
Далее нам необходимо показать, что лабиринт активный – для этого сделаем глобальный массив для хранения id активных лабиринтов - vector activeMaze. Это нужно для того, чтобы при пересчете ходов нам не нужно было пробегать все лабиринты – достаточно только этот список (думаю заменить vector на set).
Т.к. пост пишу онлайн с разработкой, то в новой правке сделал set и расширил переменные в структуре TMapMaze.
if (!strcmp(params->Branch("type")->Char(),"enter"))
{
int mazeid=0;
if (userList[userid].mazeid)
{
mazeid = userList[userid].mazeid;
}
else
{
if (!strcmp(params->Branch("mazeid")->Char(),"new_test_arena"))
{
char data[7];
makeMaze(STD_LABIRINT_WIDTH,STD_LABIRINT_HEIGHT,&mazeid,NULL,-1,-1,data);
mazeList[mazeid].lastTime = time(0);
mazeList[mazeid].currentId = -1;
TMazeCreature c;
c.Type = 0;
c.Id = userid;
c.x = data[2];
c.y = data[3];
c.HP=1; //параметры, потому будем копировать
mazeList[mazeid].creatures.push_back(c);
}
else mazeid=params->Branch("mazeid")->Integer();

activeMaze.insert(mazeid);
}
char buffer[128];
sprintf(buffer,"/maze?mazeid=%d",mazeid);
out=buffer;
userList[userid].mazeid = mazeid;
}
else /*грузим страничку с Flash – передавая параметры mazeid&userid*/