» TeamX (Архив Форума)«


Форум TeamX » Тех. поддержка » Скрипты (Все вопросы по скриптингу - сюда)

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения

 
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
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com