есть два варианта решения проблемы, первая, наиболее легкая
смотрим файл act_move.c функция move_char line ~1153 (по оригинальным исходникам SMAUG 1.4a)
dtxt = rev_exit(door);
после нее идут строки
if ( ch->mount )
{
sprintf( buf, "$n %s from %s upon $N.", txt, dtxt );
act( AT_ACTION, buf, ch, NULL, ch->mount, TO_ROOM );
}
else
{
sprintf( buf, "$n %s from %s.", txt, dtxt );
act( AT_ACTION, buf, ch, NULL, NULL, TO_ROOM );
}
итак, решение первое,
если из комнаты, куда заходит персонаж нет прохода по направлению door, то просто указываем "непонятно откуда-то"
вариант второй, мой
вместо строки
dtxt = rev_exit(door);
пишем:
EXIT_DATA *is_exit;
for ( is_exit = to_room->first_exit; is_exit; is_exit = is_exit->next )
{
if ( is_exit->to_room && is_exit->to_room == from_room )
{
dtxt = dir_name[is_exit->vdir];
break;
}
}
пояснения, from_room и to_room задан ранее как
in_room = ch->in_room;
from_room = in_room;
to_room = pexit->to_room
вместо массива dir_name я бы ввел другую, например dir_name2 где прописал бы русские названия как то севера,востока и т.д.
патч я еще не проверял, пока другие задачи стоят, но по теории должно работать
во всяком случае где надо исправлять и фиксить, я указал
p.s. все равно не исправят
(Добавление)
ошибка кроется не столько в рандоме комнат, сколько в неправильной логике обработки
а именно, указывая, откуда пришел персонаж, делается реверс хода по отношению той комнаты, где он был, а надо по отношению той комнаты, куда он пришел