|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
Ребята, тут вопрос по скриптам возник. Ситуация такая. Избранный разговаривает с неким персонажем, и предлагает ему отойти в более спокойное местечко, чтобы там продолжить, так сказать, разговор. В идеале это должно выглядеть: диалоговое окно закрывается, экран темнеет, а когда картинка вновь проясняется, то видно, что персонажи стоят в другом месте. И, когда игрок осознает это, начинается (возобновляется) диалог. Как сделать это примерно понятно. Из диалоговой ноды вызывается процедура, в которой гасится свет(gfade_out), криттеры перемещаются на новые места(critter_attempt_placement), далее свет включается и вызывается нужная диалоговая нода. Но на деле это выглядит кошмарно! Диалоговое окно во время перемещения вообще не отключается. И то, что Избранный куда-то переместился, игрок понимает только когда все диалоги уже отбарабанены и окно закрыто. Кстати, именно так это выглядит в оригинальной игре. Сходите в Дэн и попробуйте заняться сексом с Джоем или Мецгером. Все же я эту проблему решил, но немного через задницу. У меня прерсонаж проявляется на определенном тайле, но разговор не начинается, пока он не дойдет до другого тайла. Вот он и успевает сделать пару шагов, пока игрок сообразит что к чему. Но мне думается, что это не есть хороший стиль програмирования. По идее, я должен был сначал закрыть диалог. Но просто так он не закрывается. Отсюда вопросы: Почему Node999 - пустая процедура, и почему talk_p_proc расценивает это как сигнал к закрытию диалога? И почему диалог не заканчивается, на процедуре перемещения, где сначала идет куча операторов не имеющая к диалогу отношения, а в конце стоит start_dialog_at_node(NodeХХХ)? Может быть в этой процедуре следовало сначала написать gSay_End; end_dialogue; А затем перемещать? И еще вопрос, общего плана, но вытекающий из вышесказанного. В скриптовом языке существует такое понятие, как подпрограммы? Я склонен думать, что да, видел даже на форуме кусочек кода,содержащий оператор return. Но в каком именно случае возможна ситуация, когда процедура_1 вызывает процедуру_2, и, кога та отрабатывается, управление возвращается процедуре_1? И как это реализовывать? Для меня почему-то выражение call proc_XXX, это все равно что goto XXX. Если исходить из диалоговых нод. Товарищи просветители и скриптоманьяки, просветите пожалуйста.
|
Отправлено: 6:23 - 11 Дек., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Ребята, тут вопрос по скриптам возник. Не могу проверить, но должно быть что-то типа: ------------------------------------- variable move; variable already_moved; <...> procedure talk_p_proc begin Start_gdialog(...); gsay_start; if not already_moved then call NodeStart; else call NodeStart2; gsa_end; end_dialogue; if move then begin gfade_out(60); move_to(self_obj,HEX,ELEV); critter_attempt_placement(dude_obj,HEX,ELEV); already_moved:=1; gfade_in(60); call talk_p_proc end end <...> procedure Node_SomeNode begin <...> move:=1; call NodeExit end procedure NodeExit begin end ------------------------------------- Т.е. первый диалог идёт как обычно, затем делается выход, экран фэйдится, НПС и игрок перемещаются в нужную точку, устанавливается флаг "Перемещён" и диалог начинается заново (но - с другого нода - NodeStart2). >>Почему Node999 - пустая процедура, и почему talk_p_proc расценивает это как сигнал к закрытию диалога? Команде gsay_option необходима процедура-обработчик варианта ответа как обязательный параметр. Если эта процедура будет пустой, то произойдёт выход из цепочки call-ов, идущих от первого call между gsay_* в talk_p_proc, что приводит к выводу из диалогового режима. На словах объяснить сложно, но идея проста. Node999 (общепринятое, но не обязательное имя для процедуры выхода) может быть и не пустой. Главное, чтобы не было *Reply и *Option. >>Для меня почему-то выражение call proc_XXX, это все равно что goto XXX. call - это и есть вызов подпроцедуры. У подпроцедур своё пространство имён. Подпроцедуры принимают и возвращают значения (return). Как видишь, на goto не похоже даже близко.
|
Отправлено: 13:39 - 11 Дек., 2004
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
to Raven Спасибо. Надо будет попробовать. И небольшое уточнение. Что ты понимаешь под ПОДПРОЦЕДУРОЙ? Диалонговые ноды? Но их же, по большому счету можно записать в виде: ==================== procrdure Node1 begin Reply(XXX) [option_1]; goto Node2 [option_2]; goto Node999 end procrdure Node2 begin [option_1]; goto Node999 end procrdure Node999 begin end ========================= То есть, от Node1 управление переходит к Node2, а вовсе не Node1 вызывает Node2 Или это нифига процедурами не считается? про терминалогии WG вся кие там critter_p_proc b talk_p_proc называются обработчиками., а всё остальное - процедуры. Надеюсь, я внятно высказался?
|
Отправлено: 14:30 - 11 Дек., 2004
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
---------------------------------------- procedure start begin end procedure hi begin display_msg("Hi"); end procedure talk_p_proc begin variable i; while i<10 do begin call hi; i+=1; end end ---------------------------------------- Ну и причём здесь goto? gsay_option работает по другому. Процедура-параметр не вызывается call-ом, просто ей передаётся управление (без возврата по окончанию в вызывавшую процедуру). А по её окончанию, если она не содержит option-ссылки на другие процедуры (т.е. по вызову пустой процедуры) происходит выход из диалога (возврат в talk_p_proc). В общем, диалоговый режим просто работает немного иначе, чем обычные вызовы. Но это не гоуту, в любом случае - адресное пространство, помнишь? Но по действию немного похоже. Про терминологию: есть обработчики, есть (движковые) команды, есть макросы на базе этих команд, есть пользовательские процедуры. Ноды - это последнее.
|
Отправлено: 6:45 - 12 Дек., 2004
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Доброе время суток. Столкнулся с проблемой. Ставлю девченку на artemple.map, пришиваю скрипт dura.int. Начинаю новую игру. И прыгаю вокруг нее и скачу. Не работает ни description ни look_at ни talk. Что делац?
|
Отправлено: 23:29 - 6 Янв., 2005
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
rtfm......
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 11:49 - 7 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Легко сказать rtfm. Вот именно изрыскал все что можно. Кстати еще вопросец: Если не использовать define & include то можно обойтись без предпроцессора а компилить напрямую BIS'овским компилятором? (Добавление от 14:02 - 7 Янв., 2005.) Как работать с mstr. Пишет underfined symbol. Никаких объявлений, ничего нет в других скриптах, а сразу юзают mstr.
|
Отправлено: 12:18 - 7 Янв., 2005
|
|
izuken
Адский Хомяк
Откуда: mSk Регистрация: Янв. 2004
Всего: 125 сообщений
|
Если не использовать define & include то можно обойтись без предпроцессора а компилить напрямую BIS'овским компилятором? да Как работать с mstr. Пишет underfined symbol. если мне не изменяет память, mstr - макрос. толи в command.h, то ли в define.h а насчёт ртфм....я когда зздесь появился тоже подобные вопросы задавал. привыкай, что отвечать на них никто не станет, скорее всего. кроме того, хочешь получить ответ - пиши проблемный код.....
----- эхо москвы маздай. save the planet - kill self.
|
Отправлено: 15:17 - 7 Янв., 2005
|
|
Net
Пользователь
Откуда: Samara Регистрация: Дек. 2004
Всего: 8 сообщений
|
Artemple.h ************* #define MVAR_kill_dude (0) ************* script.ssl ************* procedure node6 begin set_map_var(MVAR_kill_dude,1); end procedure critter_p_proc begin if map_var(MVAR_kill_dude)==1 then attack(dude_obj); end ************* Не атакует и все тут. Где ошибка? (Отредактировал(а) Net - 23:06 - 7 Янв., 2005)
|
Отправлено: 16:16 - 7 Янв., 2005
|
|
Sokil
Пользователь
Откуда: Омск Регистрация: Март 2004
Всего: 120 сообщений
|
to Net ====== А зачем так сложно? Если ты не очень хорошо разбираешься в скриптах, возьми исходник скрипта(.ssl) того парнишки, который стоит у входа в храм, разберись, как у него что работает, затем вноси свои изменения, компиллируй и замечай разницу. При работе со скриптами хорошо помогает прога FSE (Fallout Script Editor). Вообще - побольше исходников смотри. И rtfm!
|
Отправлено: 20:01 - 8 Янв., 2005
|
|
|
|