Спойлер TRUE STORY:
МНОГО ЛЕТ НАЗАД (где-то года полтора):

Когда-то давно мне надо было написать функцию, которая двигала бы героя или событие по определенному маршруту. Тогда мне помог ДК, быстренько ее набросав. Правда для героя она не сильно помогала - после заданного маршрута он останавливался и не двигался. ДК тогда был занят, я разобраться не смог, в итоге благополучно на это забил.

НЕДАЛЕКОЕ ПРОШЛОЕ (несколько месяцев назад):

С тех пор прошло много времени, и вот пару месяцев назад снова потребовалось задавать маршрут, но чисто для событий. Я с этим благополучно справился, позабыв, что изобретаю велосипед, который мне состроил ДК еще полтора года назад.

НАШИ ДНИ (в промежутке с 23:00 до 01:00 следующего дня):

А вот дело опять коснулось маршрута героя, то поймал тот же баг. Тут-то я и вспомнил ту функцию ДК. Достав со старого диска запылившийся плагин от ДК, я решил покопаться в именно в нем, благо он был красивее и универсальнее моего.
Спустя часа два наконец понял, как исправить ту ошибку. Надо всего лишь добавить в конец маршрута команду "окончание маршрута"(ROUTE_END), которая делает параметр _moveRouteForcing равным "false" и позволяет герою дальше вершить свои дела:

PHP код:
route.list[amount] = {codegc.ROUTE_END}; 
Ну и добавил параметр, который скипает движение, если впереди непроходимый тайл или событие:

PHP код:
route.skippable true
Проблемы остались. Например, при присвоении маршрута событию свой прежний маршрут он забывает. В принципе не беда: сохраняем маршрут в переменную, а потом после завершения маневра опять присваиваем событию первоначальный маршрут. Хотя, может есть вариант элегантнее?


Итак, вызов плагина для задания маршрута событию,герою:

PHP код:
$gameMap.moveEvent(iddirectionamount); 
, где id - номер события (или 0, если нужен герой), direction - направление, amount - количество повторений (например шагов)

Сама функция:
PHP код:
Game_Map.prototype.moveEvent = function(iddirectionamount) {
    if (
id) {
        var 
event this.event(id);
    }else {
        var 
event $gamePlayer;
    };
    if (!
event) return;

    var 
gc Game_Character;
    var 
route = { list: [] };
    var 
code;

    switch(
direction){
        case 
0:{
            
code gc.ROUTE_END;
            break;
        }
        case 
2:{
            
code gc.ROUTE_MOVE_DOWN;
            break;
        }
        case 
4:{
            
code gc.ROUTE_MOVE_LEFT;
            break;
        }
        case 
6:{
            
code gc.ROUTE_MOVE_RIGHT;
            break;
        }
        case 
8:{
            
code gc.ROUTE_MOVE_UP;
            break;
        }
        case 
12:{
            
code gc.ROUTE_MOVE_FORWARD;
            break;
        }
    }
    
    for(var 
0code && amounti++){
        
route.list[i] = { codecode };    
    }

    
route.list[amount] = {codegc.ROUTE_END}; //Yuryol
    
route.skippable true//Yuryol

    
event.forceMoveRoute(route);

};