Действие по условию, без DELACT
Использование DELACT, хоть и более интуитивно понятно новичку, ведет к запутанному, глючному коду.
Чтобы не пришлось использовать DELACT, делаем так:
1. Все действия, которые могут быть “отключены” по каким-либо условиям, переносим в область “Выполнить при посещении”
2. В конце каждого действия, в котором есть влияние на любое из этих условий, ставим “GOTO $CURLOC”.
3. Помещаем действия внутрь соотв. блоков IF, с проверками на условия.
4. При написании кода “Выполнить при посещении” локации учитываем, что код будет выполняться более одного раза.
Также внутрь блока IF удобно внести часть описания, относящуюся к показываемому действию.
Пример:
'Вы находитесь в пустой комнате.'
IF ключ=0:
'На полу лежит ключ.'
ACT 'Взять ключ'
ключ = 1
ADDOBJ 'ключ'
GOTO $CURLOC
END
END
Nex, ИМХО это бред. Код будет выполняться больше одного раза. Поэтому этот код в принципе бесполезен.
Dark[Ol(U23)leneri],
многолетняя практика оправдывает именно такой подход.
Все, что должно выполниться на локации только один раз, обрамляется в соответствующее условие:
IF был_здесь=0:
был_здесь=1
... операторы ...
END
Дарк, это не бред, если у тебя есть куски текста, которые должны исчезнуть, после выполнения действие. Это вполне нормально. Ты же не 20 раз собираешься локу перерисовывать.
А если у меня много вложенных действий? Например, диалог. Мне что после каждого был_здесь=1 весь текст заново писать?
Если тебе не нужно что-то перерисовывать на локе, то разумеется возврат будет лишним. Достаточно просто делэкта :)
По моему, delact - самый нормальный, каждый раз писать больше кода, чем требуется, это действительно бред.
Проблемы, которые возникают с использованием DELACT:
1. При явном указании имени удаляемого действия, часто возникает такая ошибка: автор переименовал действие, но забыл переименовать во всех операторах DELACT. Как результат, действие не удаляется, когда нужно.
2. Если на локацию можно зайти более одного раза, и на ней есть “удаляемые” действия, то в большинстве случаев, приходится писать DELACT не только в действиях, но и в коде локации, выполняя проверку на состояние условий.
П. 2 при использовании DELACT делает код локации более запутанным, чем без DELACT, при этом провоцирует на ошибки из п. 1.
Проблемы, которые возникают в твоем примере:
- Каждый раз заходит заново на одну и ту же локацию. Следовательно описание меняется на первоначальное, которое было, но могло измениться.
delact $selact чем не устраивает?
Вета,
DELACT $SELACT не всегда можно использовать.
Dark[Ol(U23)leneri],
если нам нужно, чтобы описание не менялось, ставим XGOTO вместо GOTO.
Короче, у меня уже голова пухнет. Вот я сейчас приведу пример из моего кода, а ты, Некс, скажи мне, правильно или нет.
if купить = 1:
act 'А можно у вас оружие купить?':
*P '
Кузнец отвечает вам: "Оружие можешь купить у моего подмастерья, а я занимаюсь персональными заказами."'
Подмастерье = 1
заказы = 1
купить = 0
delact 'А можно у вас оружие купить?'
end
end
А потом уже от этих переменных появляются другие акты(половые :)).
Вета:
delact $selact чем не устраивает?
Лично меня устраивает=) Это Некс лишние правила вводит.
Nex:
если нам нужно, чтобы описание не менялось, ставим XGOTO вместо GOTO.
А вот за это спасибо, и что? ХGOTO просто меняет действия или что?
Если навести на него курсор, то можно увидеть что, XGOTO - переход на локацию без очистки окна описания.
XGOTO - переход на локацию без очистки окна описания.
Совершенно верно.
Dark[Ol(U23)leneri],
я не ввожу правила. Как писать код - личное дело каждого автора. Я лишь обращаю ваше внимание на прием, который позволяет обойтись без DELACT.
Как я писал в самом первом сообщении, использование DELACT более интуитивно понятно новичку, именно по этой причине вам не верится в то, что без него код будет проще и надежней. Продолжайте писать игры на QSP, и тогда вы со временем убедитесь, что DELACT вреден. Через десяток-другой игр, возможно.
скажи мне, правильно или нет.
На первый взгляд, код вполне рабочий. “delact ‘А можно у вас оружие купить?’” лучше заменить на “DELACT $SELACT”, чтобы избежать проблемы, указанной в п.1.