Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su
4.4. Как передавать локациям-пунктам меню аргументы?
В: Как передавать локациям-пунктам меню аргументы?
О:
При выполнении кода локации, соответствующей пункту меню, непосредственно в массив args передаётся только номер пункта.
Если у вас фиксированные меню, то Вы можете получить номер пункта из нулевой ячейки массива args и таким образом выполнение любого пункта меню можно разместить на одной локации:
$меню_отвёртка[1]='Использовать:screw_menu'
$меню_отвёртка[2]='Выбросить:screw_menu'
! локация "screw_menu"
if args[0]=1:
! если передано число 1
! это пункт меню "Осмотреть"
clr
pl "Обыкновенная крестовая отвёртка. Подойдёт для регулирования громкости"
end
if args[0]=2:
! если передано число 2
! это пункт "Использовать"
громкость=громкость-50
*nl "Вы сунули отвёртку в ухо и звуки стали тише."
end
if args[0]=3:
! если передано число 3
! это пункт "Выбросить"
clr
pl "Вы выбросили отвёртку"
delobj "Отвёртка"
end
Этот вариант не будет работать, если меню формируется динамически, т.е. пункты в него добавляются или удаляются по мере прохождения игры, или в зависимости от условий. Тем не менее вы можете узнать, какой именно пункт меню вызвал данную локацию, используя простое решение, предложенное `Werewolf`ом.
Так или иначе вам приходится помещать все пункты меню в массив*:
$menu_stone[]='Укусить:menu_stone'
$menu_stone[]='Выбросить:menu_stone'
Таким образом на локации-обработчике пункта меню, используя значение в `args[0]`, можно получить содержимое ячейки массива, относящейся к данному пункту меню:
! пункты меню нумеруются с 1, поэтому номер ячейки вычисляем так:
local i=args[0]-1
! а дальше проделываем то же, что и для предыдущего варианта,
! но с небольшими отличиями
if $menu_stone[i]='Осмотреть:menu_stone':
! это пункт меню "Осмотреть"
clr
pl "Обыкновенный камень. Подойдёт для изготовления молний Индры."
end
if $menu_stone[i]='Укусить:menu_stone':
! это пункт "Укусить"
*nl "Вы вонзили зубы в твёрдую плоть камня. Камень оказался прочнее."
end
if $menu_stone[i]='Выбросить:menu_stone':
! это пункт "Выбросить"
clr
pl "Вы выбросили камень."
delobj "Камень"
end
Лично я рекомендую заводить на каждый пункт меню отдельную локацию, просто делать сами пункты меню более универсальными:
Формируем меню для предметов, например на самой первой локации в игре:
$меню_предмет[]="Осмотреть:info"
$меню_предмет[]="Использовать:use"
$меню_предмет[]="Выбросить:put"
На локации-обработчике выделения предмета ($onobjsel) код может быть такой:
! записываем название выделенного предмета в переменую
$object=$selobj
! сразу можно снять выделение
unselect
if $object="Отвёртка" or $object="Апельсин":
! если это нужный нам предмет
! вызываем меню
menu "$меню_предмет"
end
На локациях-пунктах меню предметов используем условия, и по значению переменной `$object` определяем, какой предмет был выделен:
! для примера локация "info"
if $object="Отвёртка":
! если мы "запомнили" предмет "Отвёртка" после выделения
! выводим описание отвёртки
clr
pl "Обыкновенная крестовая отвёртка. Подойдёт для регулирования громкости"
end
if $object="Апельсин":
! если мы "запомнили" предмет "Апельсин" после выделения
! выводим описание апельсина
clr
pl "Рыжий сладкий апельсин. Много нас, а он один."
end
Таким образом через глобальные переменные мы можем передавать некоторые данные локациям-пунктам меню.
↑ Запись `$меню_предмет]=` означает, что данные будут записаны в следующую ячейку после последней. Это аналог записи `$меню_предмет[arrsize('$меню_предмет')]=`. См. [Как сделать контекстное меню