Перейти к основному содержимому

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'ом.

Так или иначе вам приходится помещать все пункты меню в массив1:

$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

Таким образом через глобальные переменные мы можем передавать некоторые данные локациям-пунктам меню.


Footnotes

  1. Запись $меню_предмет[]= означает, что данные будут записаны в следующую ячейку после последней. Это аналог записи $меню_предмет[arrsize('$меню_предмет')]=. См. Как сделать контекстное меню