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

11.2. Как сделать так, чтобы действие появлялось только при определённом условии?

В: Как сделать так, чтобы действие появлялось только при определённом условии?

О:

Всё достаточно просто. Необходимо завести отдельную переменную, которая будет определять возможность выполнения действия. Самый простой пример — отслеживаем подъём предмета через переменную-маркер:

! открываем условие
if ключ_взял=0:
! если ключ не взят — переменная маркер равна нулю
    
! можно вывести какой-то сопроводительный текст
    *pl "На столе лежит ключ"
    
! добавляем действие
    act "Взять ключ":
    
! код действия
        
! добавить предмет ключ
        addobj "Ключ"
        
! переменной маркер присваиваем значение 1
        ключ_взял=1
        
! перезаходим на локацию
        goto $curloc
    
! закрыли действие
    end
!закрыли условие
end

Более сложный пример:

if кувшин_полон=0:
! если кувшин пуст
    act "Наполнить кувшин из фонтана":
        кувшин_полон=1
        
! другой код
        goto $curloc
    end
else
! иначе кувшин полон
    act "Вылить воду из кувшина":
        кувшин_полон=0
        
! другой код
        goto $curloc
    end
end

Сложный пример с последовательностью действий:

if хомяк=0: 
! если хомяка в руках нет
    
! сопроводительный текст
    *pl "На земле сидит хомяк"

    act 'Поднять хомяка': 
    
! начало действия поднять хомяка 
        
! выставляем маркер, чтобы знать, что хомяк в руках 
        хомяк=1 
        
! возвращаемся на текущую локацию 
        goto $curloc 
    
! конец действия поднять хомяка 
    end 
elseif хомяк=1: 
! в противном случае, если хомяк в руках 
    
! выводим сопроводительный текст в основное описание 
    *pl 'Вы взяли хомяка на руки, но он стал отчаянно вырываться.' 
    act 'Отпустить хомяка': 
    
! начало действия отпустить хомяка 
        
! выставляем маркер, чтобы знать, что хомяк отпущен 
        хомяк=2 
        
! возвращаемся на текущую локацию 
        goto $curloc 
    
! конец действия отпустить хомяка 
    end 
elseif хомяк=2: 
! в противном случае, если хомяк убежал
    
! выводим сопроводительный текст в основное описание 
    *pl 'Вы отпустили хомяка, и он тут же исчез в кустах.'  
    act 'Догнать хомяка': 
    
! начало действия догнать хомяка 
        
! выставляем маркер, чтобы знать, что хомяк полетел
        хомяк=3 
        
! возвращаемся на текущую локацию 
        goto $curloc 
    
! конец действия поднять хомяка 
    end
elseif хомяк=3:
! в противном случае, если хомяк улетел
    
! выводим сопроводительный текст в основное описание 
    *pl 'Вы догнали хомяка и отвесили ему пендель. Хомяк расправил крылья и полетел.' 
! конец многострочной конструкции условия 
end

Иногда можно обойтись без переменной-маркера. Например, в случае, если вам нужно проверить наличие предмета в инвентаре:

if (obj "Пустой кувшин"):
    act "Наполнить кувшин":
        delobj "Пустой кувшин"
        addobj "Полный кувшин"
        goto $curloc
    end
elseif (obj "Полный кувшин"):
    act "Опустошить кувшин":
        addobj "Пустой кувшин"
        delobj "Полный кувшин"
        goto $curloc
    end
end