Инвентарь в двоичном массиве.

Insallah

Schutzstaffel Gruppenführer
Старейшина
Репутация
Есть динамический двумерный массив.
Есть база итемов.
Итем может занимать произвольное количество ячеек массива.

У итема есть параметр [координаты], где указаны координаты ячейки, где находится левый-верхний угол итема и дополнительно указаны его длинна и высота.
1328805174_scr828.jpg


В данном случае: [crossbow:2-2:2:4].

Для переноса итема юзается drag-n-drop. НО, так как в базе инвентаря фактически итем находится в координатах одной клетки, то итемы элементарно накладываются один на другой.

А если итем приходит извне, то инвентарь вообще не генерируется: система проверяет записи координат, делает поправки x+width, y+height и вставляет итем в пустое место, если оно есть. Но такие проверки очень монструозны и затратны, так как все поправки должны упасть во временное хранилище занятых клеток и не учитываться при проверке на их свободность.

Можно подперетё костылём с другой стороны: при каждоё операции с инвентарём отсылать в базу новую версию маски занятых секторов в массиве, но тесты показали, что 4 человека усиленно переставляя итемы в инвентаре ложат нахрен всю базу и выедают непростительно много памяти.


Кто-то разрабатывал подобные системы? Решал подобные проблемы? Каким макаром такое можно оптимизировать? Или может я не замечаю какой нить более простой подход к теме?
 
Задумка интересная, но массив получается большим в плане хранения в бд, такую вещь думаю удобно будет хранить в файлах на сервере и работать через ajax.
 
Задумка интересная, но массив получается большим в плане хранения в бд, такую вещь думаю удобно будет хранить в файлах на сервере и работать через ajax.
а поподробнее?

что именно хранить в файлах на сервере? :)
 
А зачем весь массив хранить? Фактически запись про инвентарь - это два числа в базе. А если он статический, то даже в коде.
Сама вещичка - 4 числа в базе. Координаты и размер. При отображении инвентаря он перегенерируется. Для гурманов - это можно кэшировать и обновлять кэш при взаимодействии с инвентарём, но не думаю что это критично.

Вместе с этим ковыряется кукла героя. Но там коленца поинтереснее:
- Как совместить уникальный внешний вид (для монетизации) с итемами на кукле?
- Как прорисовывать итемы: двум картинками иконка-кукла или только кукла. Во втором случае итемы будут визуально шаблонными.
- Как позиционировать заведомо разные по размеру итемы в одинаковых слотах (ножик и цвайхандер например).

При этом не хочется использовать флешь как в Двароподобных играх. Всё сильнее появляется желание не заниматься куклой вообще.
 
Вот с этим - уже можно работать.
Код:
function moveItemInMatrix( $item /* x, y, w, h */ ) {
  $invWidth = 10;
  $invHeight = 5;
  $result = array();
  if ($item->x + $item->w > $invWidth or $item->y + $item->h > $invHeight)
    return false; // сюда ставить нельзя
  for ($i = 1; $i <= $invWidth; $i++) {
    $result[$i] = array();
    for ($j = 1; $j <= $invHeight; $j++)
      $result[$i][$j] = ($i >= $item->x and $i <= $item->x + $item->w and $j >= $item->y and $j <= $item->y + $item->w ) ? 1 : 0;
  }
  return $result;
}
 
Генерим двумерный массив:
$matrix[1][1] = true;
...
$matrix[10][6] = true;

Берем список вещей, которые уже лежат в инвентаре и прогоняя через цикл помечаем ячейки в массиве, которые заняты вещами.
На выходе будет массив:
$matrix[1][1] = true;
..
$matrix[2][2] = false;
...
$matrix[3][5] = false;
...
$matrix[10][6] = true;

И кладя новую вещь надо смотреть, чтобы она не пересекалась с false ячейками массива.
Изначально все делается на стороне клиента через js, а затем раскладка проверяется на сервере.
 
Это лишние итерации. Не имеет смысла опрашивать клетки с которыми не собираешься взаимодействовать вообще.
 
Сверху