RU

Действие по условию, без DELACT

Nex Moderator 08.04.2011 05:09 16 comments 13588 views

Использование DELACT, хоть и более интуитивно понятно новичку, ведет к запутанному, глючному коду.

Чтобы не пришлось использовать DELACT, делаем так:

1. Все действия, которые могут быть “отключены” по каким-либо условиям, переносим в область “Выполнить при посещении”
2. В конце каждого действия, в котором есть влияние на любое из этих условий, ставим “GOTO $CURLOC”.
3. Помещаем действия внутрь соотв. блоков IF, с проверками на условия.
4. При написании кода “Выполнить при посещении” локации учитываем, что код будет выполняться более одного раза.

Также внутрь блока IF удобно внести часть описания, относящуюся к показываемому действию.

Пример:

'Вы находитесь в пустой комнате.'
IF ключ=0:
    'На полу лежит ключ.'
    ACT 'Взять ключ'
        ключ = 1
        ADDOBJ 'ключ'
        GOTO $CURLOC
    END
END
Edited at 08.04.2011 09:05 (14 years ago)
Dark[Ol(U23)leneri] #34 08.04.2011 06:46 (14 years ago)

Nex, ИМХО это бред. Код будет выполняться больше одного раза. Поэтому этот код в принципе бесполезен.

Dark[Ol(U23)leneri],
многолетняя практика оправдывает именно такой подход.

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

IF был_здесь=0:
    был_здесь=1
    ... операторы ...
END

Дарк, это не бред, если у тебя есть куски текста, которые должны исчезнуть, после выполнения действие. Это вполне нормально. Ты же не 20 раз собираешься локу перерисовывать.

Dark[Ol(U23)leneri] #34 08.04.2011 08:55 (14 years ago)

А если у меня много вложенных действий? Например, диалог. Мне что после каждого был_здесь=1 весь текст заново писать?

Если тебе не нужно что-то перерисовывать на локе, то разумеется возврат будет лишним. Достаточно просто делэкта :)

По моему, delact - самый нормальный, каждый раз писать больше кода, чем требуется, это действительно бред.

Проблемы, которые возникают с использованием DELACT:
1. При явном указании имени удаляемого действия, часто возникает такая ошибка: автор переименовал действие, но забыл переименовать во всех операторах DELACT. Как результат, действие не удаляется, когда нужно.
2. Если на локацию можно зайти более одного раза, и на ней есть “удаляемые” действия, то в большинстве случаев, приходится писать DELACT не только в действиях, но и в коде локации, выполняя проверку на состояние условий.

П. 2 при использовании DELACT делает код локации более запутанным, чем без DELACT, при этом провоцирует на ошибки из п. 1.

Dark[Ol(U23)leneri] #34 08.04.2011 12:02 (14 years ago)

Проблемы, которые возникают в твоем примере:
- Каждый раз заходит заново на одну и ту же локацию. Следовательно описание меняется на первоначальное, которое было, но могло измениться.

delact $selact чем не устраивает?

Вета,
DELACT $SELACT не всегда можно использовать.

Dark[Ol(U23)leneri],
если нам нужно, чтобы описание не менялось, ставим XGOTO вместо GOTO.

Короче, у меня уже голова пухнет. Вот я сейчас приведу пример из моего кода, а ты, Некс, скажи мне, правильно или нет.

if купить = 1:
 act 'А можно у вас оружие купить?':
 *P '
 Кузнец отвечает вам: "Оружие можешь купить у моего подмастерья, а я занимаюсь персональными заказами."'
 Подмастерье = 1
 заказы = 1
 купить = 0
 delact 'А можно у вас оружие купить?'
 end
 end

А потом уже от этих переменных появляются другие акты(половые :)).

Dark[Ol(U23)leneri] #34 08.04.2011 13:40 (14 years ago)

Вета:

delact $selact чем не устраивает?

Лично меня устраивает=) Это Некс лишние правила вводит.

Nex:

если нам нужно, чтобы описание не менялось, ставим XGOTO вместо GOTO.

А вот за это спасибо, и что? ХGOTO просто меняет действия или что?

Если навести на него курсор, то можно увидеть что, XGOTO - переход на локацию без очистки окна описания.

XGOTO - переход на локацию без очистки окна описания.

Совершенно верно.

Dark[Ol(U23)leneri],
я не ввожу правила. Как писать код - личное дело каждого автора. Я лишь обращаю ваше внимание на прием, который позволяет обойтись без DELACT.
Как я писал в самом первом сообщении, использование DELACT более интуитивно понятно новичку, именно по этой причине вам не верится в то, что без него код будет проще и надежней. Продолжайте писать игры на QSP, и тогда вы со временем убедитесь, что DELACT вреден. Через десяток-другой игр, возможно.

скажи мне, правильно или нет.

На первый взгляд, код вполне рабочий. “delact ‘А можно у вас оружие купить?’” лучше заменить на “DELACT $SELACT”, чтобы избежать проблемы, указанной в п.1.

Log in or Register to post comments.