@Dansken, небольшой вопрос по поводу отрывка из функции UpdateUnit():
зачем локальной переменной row обновлять свои данные, если последующий блок кода в котором упоминается row не выполнится из условия if-else, или это ради эстетики? Аналогичный отрывок и с X: column = int(pointerToUnitData->x);
Пардон, я там изначально как-то алгоритм с последующим использованием row и column строил, но потом упростил и забыл это убрать :))
Также по ходу разбора кода заметил, что блок "// Only monsters actions" в MoveToUnit() можно полностью убрать, если немного модернизировать блок "// Can not move cell left" и аналогичный "...right" в UpdateAI() -- ведь монстры отталкиваются от всего, кроме пустоты -- остается только добавить нанесение урона при встрече с героем: