Инвентарь, продолжение

инвентарь,7maze
С инвентарем получилось как-то с одной стороны проще, а с другой - сложнее.
Провозился в целом, а онлайн для подрузки описаний и параметров вещей и вовсе не потребовался.
В Flash нарисовал картинку - силуэт человека и квадраты куда можно понавесить вещей (оригинально, правда? :).
Создаю два массива:

var itemsList = new Array;
var nameList = new Array;

Один - для вещей инвентаря, другой для описания их, кстати тут и ответ - если мы знаем набор вещей, то почему не передавать и их параметры/описания при загрузке.

var param = 'inv|0180001|art|I180001,A10,NНож,RРжавый нож используется шушерой,*,|';

Параметры приходят такими - секция inv - инвентарь, art - описания. Про инвентарь, я уже написал в прошлый раз - повторю лишь что тут указано, что в рюкзаке (первый байт - 0), лежит что-то с ид = 180001 (по битам можно определить, что это нечто может быть на слотах левой 0x1000 и правой 0x800 руках).
Парситься такая строка элементарно, что даже писать не стоит:

var a = sitems.substr(i,1);
var b = sitems.substr(i+1,6);
var id = parseInt('0x'+b);
var zitems:Object = new Object();
zitems.fplace = parseInt(a);
zitems.place = -1;
zitems.id = id;
zitems.name = id+'-'+i;
itemsList.push(zitems);

Примерно так-же парсим и информационую секцию :

var i=0;
var tname:Object = new Object();

while (vp.indexOf(",") >= 0)
{
var n = vp.substr(0, vp.indexOf(","));
vp = vp.substr(vp.indexOf(",") + 1);
var a = n.substr(0,1);
var k = n.substr(1);
if (a=='I') tname.id = parseInt('0x'+k);
if (a=='s') tname.stamina = parseInt('0x'+k);
if (a=='S') tname.stength = parseInt('0x'+k);
if (a=='D') tname.dexterity = parseInt('0x'+k);
if (a=='Q') tname.intellect = parseInt('0x'+k);
if (a=='A') tname.damage = parseInt('0x'+k);
if (a=='Z') tname.defense = parseInt('0x'+k);
if (a=='N') tname.name = k;
if (a=='R') tname.descreption = k;
if (a == '*')
{
nameList.push(tname);
tname = new Object();
}
}
if (tname.id > 0) nameList.push(tname);

Прикольно, что буква 'D' оказалась самой востребованной, почти все параметры на нее начинаются, хотя S тоже присутствует два раза: Strength и Stamina.
Также досталось Intellect - I как ID уже была использована, пошла буква Q из слова IQ.
Damage & Defense = Ataka и Zashita :)
Далее просто вещи определялись по своим местам:

for(var i=0;i<itemsList.length;i++)
{
var off= 10000+i;
var s='undefined';
if (itemsList[i].id == 0x180001) s='knife';
if (itemsList[i].id == 0x800002) s='shapka';
attachMovie(s,itemsList[i].name,off);
place_item(i,itemsList[i].fplace);
}

Тут использовались (для тестов) статичные клипы и поэтому attachMovie, а реально будет просто loadMovie(itemsList[i].id);
Функция place_item - помещает вещь на указанный слот.

function place_item(it,place)
{

itemsList[it].place = place;
if (place == 1) //head
{
_root [ itemsList[it].name]._x = 77 + 25;
_root [ itemsList[it].name]._y = 23 + 25;
}
:.

При нажатие на любую вещь (обработчик onClick с прогоном по всем вещам и связанных с ними клипами с проверкой _x,_y,_width,_height) - вызываем функцию clickItem

function clickItem(it)
{
var place = itemsList[it].place;
if (place == 0) //bag
{
var t= int(itemsList[it].id / 256);
if ( t & 0x800 || t & 0x1000)
{
if (!checkAndMove(it,4))
checkAndMove(it,5);
}
if ( t & 0x8000) checkAndMove(it,1);
if ( t & 0x4000) checkAndMove(it,2);
if ( t & 0x2000) checkAndMove(it,3);
if ( t & 0x100) checkAndMove(it,6);
}
else checkAndMove(it,0);
}

Ее глобальный смысл понять куда и откуда одевается/снимается вещь и вызывает функцию checkAndMovie, которая собственно и перемещает вещь.

function checkAndMove(it,place)
{
//trace('it ='+it+', place='+place);
if (place)
{

for(var i=0;i<itemsList.length;i++)
if (itemsList[i].place == place) return 0;
place_item(it,place);
}
else //bag
{
//проверяем сумку на "не резиноваю"
//потом....
place_item(it,place);
}
return 1;
}

Собственно все, кода не очень много, осталось сделать обратную отправку состояния инвентаря на сервер, чем и занимаюсь