Инвентарь. Заключительная часть

В Flash передача оказалась (как и предполагалась) ерундовым делом:
Кнопка, на кнопке onPress.
on (press) {
btn_apply._visible = false;
var inv='';for(var i=0;i<_root.itemsList.length;i++) {
var tmp = itemsList[i].id.toString(16);
if (tmp.length<6) { var i=6-tmp.length; for(var j=0;j<i;j++) {tmp='0'+tmp;} }
inv+=itemsList[i].place.toString(16)+tmp;
}
loadVariablesNum(_root.host+"/maze?action=set_inv&inv="+inv+"&sessionid="+_root.session,0);
}

Ну да в Flash'ку пришлось передавать host, ну думаю может и не надо.

На стороне сервера :
if (!strcmp(params->Branch("action")->Char(),"set_inv"))
{
lockMutex(&gameMutex);
int mazeid = userList[userid].mazeid;
if (mazeid) {
unlockMutex(&gameMutex);
return makeFlashError(MAZE_ERR_CHAR_IN_MAZE);
}
int r=reorgInventory((unsigned char*)params->Branch("inv")->Char(),&userList[userid]);
unlockMutex(&gameMutex);
}

Ловим событие, смотрим в городе ли игрок (!в лабиринте) и вызываем reorgInventory, кстати g++ почему-то не хочет автоматически кастовать (char*) к (unsigned char*), а bcc – запросто.
С reorgInventory пришлось повозиться, т.к. нужно проверять на то, что вещи которые пришли уже были в инвентаре (дабы уберечь игроков от даров свыше), ну и данные приходят в hex'е.
Чтобы ускроить процесс, отказался от стандартной (stdlib) функции перевода и написал нехитрый код, перевод в int.
Запускаю – не работает, говорит нет вещи, которую хотим переложить , а код-примитив.
Короче 15 минут смотрел как баран на новые ворота, пока не заметил что четвертой стены нет одну глупость.
int place = inv[i];
unsigned int what = (unsigned int) inv[i+6] + (unsigned int) inv[i+5]*16 + (unsigned int) inv[i+4]*256 + (unsigned int) inv[i+3]*4096 + (unsigned int) inv[i+2]*65536 + (unsigned int) inv[i+1]*1048576;

А именно, не учел что данные – приходят как строка и их нужно еще преобразовать :)
int place = hex2dec(inv[i]);
unsigned int what = (unsigned int)hex2dec(inv[i+6]) + (unsigned int)hex2dec(inv[i+5])*16 + (unsigned int)hex2dec(inv[i+4])*256 + (unsigned int)hex2dec(inv[i+3])*4096 + (unsigned int)hex2dec(inv[i+2])*65536 + (unsigned int)hex2dec(inv[i+1])*1048576;

Почему я сделал умножение, а не сдвиг битов ( << 4)? Просто проверял себя на умножение, сдался после 65536 и то его помнил на память ;)

Короче – все получилось, теперь в бой на паука можно пойти не с голым задом голыми руками, а вооруженным.