Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

4.4. Как передавать локациям-пунктам меню аргументы?

В: Как передавать локациям-пунктам меню аргументы?

О:

При выполнении кода локации, соответствующей пункту меню, непосредственно в массив args передаётся только номер пункта.

Если у вас фиксированные меню, то Вы можете получить номер пункта из нулевой ячейки массива args и таким образом выполнение любого пункта меню можно разместить на одной локации:

$меню_отвёртка[0]='Осмотреть:screw_menu'
$меню_отвёртка[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'
$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('$меню_предмет')]=`. См. [Как сделать контекстное меню