06.05.2003, 18:55
Нам нужно полностью автоматизировать скрипт язык в ПЗ чтобы можно было сделать наш конструктор уровней с проверкой на целостность данных. Мы должны построить блок схему не на логических срипт блоках, а на объектах, указывая связи зависимостей от событий этих самых объектов. Например, объектом можно считать переменную квест и диалоги. У диалогов могут быть методы, в виде каких-то определенных действий, например: запуск окна диалога, блокировки повторного вызова диалога, выдача квеста, и так далее. Соответственно, раз это объект, то объект должен обладать свойствами. Например, объект Диалог, будет обладать следующими виртуальными свойствами: Уникальный номер, Имя, Принадлежность к Персонажу у которого должна проявляться гиперссылка для возможности запуска диалога, и так далее.. Мы должны самостоятельно внести некоторые ограничения в тепершней гибкости скрипта и добавить свои упрощения, которые в момент компиляции будут вставлять нужные блоки. Например, принять некий стандарт для логических условий. В нынешнем ПЗ-скрипте логическое ИЛИ эмулируется из нескольких И, используя временную глобальную переменную, или даже переменные заданий или диалогов. В таком случае, у нас получится релятивная база данных скрипта ПЗ, где сложные ветвления будут автоматически преобразовываться в вид ПЗ-скрипта. Вот, к примеру, нынешний кусок кода в ПЗ. Здесь «ИЛИ» построено при помощи переменной "ZT7", где эта де переменная является защитой от повторного вызова этого окна. Проблема в том, что это не закон и даже не правило. Так как Имя переменной взято в принципе из головы и в других подобных случаях ту же логику «ИЛИ» Дизайнер может сделать по иному.
Script VTriger#0#219
(
if
(
)
then
(
KillScript( )
Sleep( 22 )
"GSSetVar( 0, ""ZT6"", 1 )"
"SendStringEvent( 0, ""tutorial zt6"" )"
VCheck#0#221( this )
VCheck#0#222( this )
)
)
Script VCheck#0#221
(
if
(
WasLooted( LoneWolf )
"Not( IsEqual( GSGetVar( 0, ""ZT7"" ) , 1 ) )"
)
then
(
KillScript( )
VTriger#0#225( this )
)
)
Script VCheck#0#222
(
if
(
Every( i, Boars, IsDead( i ) )
"Not( IsEqual( GSGetVar( 0, ""ZT7"" ) , 1 ) )"
)
then
(
KillScript( )
VTriger#0#225( this )
)
)
Script VTriger#0#225
(
if
(
)
then
(
KillScript( )
"GSSetVar( 0, ""ZT7"", 1 )"
"SendStringEvent( 0, ""tutorial zt7"" )"
)
)
Мы можем выработать правило, чтобы подобные логические узлы всегда были в такой же канонической форме. Или сделать как-то иначе, например:
SS_TEXT
Script VTriger#0#219
(
if
(
)
then
(
KillScript( )
Sleep( 22 )
"GSSetVar( 0, ""ZT6"", 1 )"
"SendStringEvent( 0, ""tutorial zt6"" )"
VCheck#0#221( this )
)
)
Script VCheck#0#221
(
if
(
"IsLess( GSGetVar( 0, ""t.gz1g.zt7"" ) , 2 )"
)
then
(
KillScript( )
VCheck#0#222( this )
)
)
Script VCheck#0#222
(
if
(
IsGreater( add(WasLooted( LoneWolf ),Every( i, Boars, IsDead( i ) ))),0 )
)
then
(
KillScript( )
VTriger#0#225( this )
)
)
Script VTriger#0#225
(
if
(
)
then
(
KillScript( )
"GSSetVarMax( 0, ""t.gz1g.zt7"", 2 )"
"SendStringEvent( 0, ""tutorial zt7"" )"
)
)
логическое «ИЛИ» здесь реализовано на:
IsGreater( add(WasLooted( LoneWolf ),Every( i, Boars, IsDead( i ) ))),0 )
Можно сделать цепочку из вложенного «IF ELSE»:
SS_TEXT
VTriger#0#219( this )
)
)
Script VTriger#0#219
(
if
(
)
then
(
KillScript( )
Sleep( 22 )
"GSSetVar( 0, ""ZT6"", 1 )"
"SendStringEvent( 0, ""tutorial zt6"" )"
VCheck#0#221( this )
)
)
Script VCheck#0#221
(
if
(
"IsLess( GSGetVar( 0, ""t.gz1g.zt7"" ) , 2 )"
)
then
(
KillScript( )
VCheck#0#222( this )
)
)
Script VCheck#0#222
(
if
(
WasLooted( LoneWolf )
)
then
(
KillScript( )
VTriger#0#225( this )
")
if
("
Every( i, Boars, IsDead( i ) )
")
then
(
KillScript( )"
VTriger#0#225( this )
")
)"
Script VTriger#0#225
(
if
(
)
then
(
KillScript( )
"GSSetVarMax( 0, ""t.gz1g.zt7"", 2 )"
"SendStringEvent( 0, ""tutorial zt7"" )"
)
)
Script VTriger#0#219
(
if
(
)
then
(
KillScript( )
Sleep( 22 )
"GSSetVar( 0, ""ZT6"", 1 )"
"SendStringEvent( 0, ""tutorial zt6"" )"
VCheck#0#221( this )
VCheck#0#222( this )
)
)
Script VCheck#0#221
(
if
(
WasLooted( LoneWolf )
"Not( IsEqual( GSGetVar( 0, ""ZT7"" ) , 1 ) )"
)
then
(
KillScript( )
VTriger#0#225( this )
)
)
Script VCheck#0#222
(
if
(
Every( i, Boars, IsDead( i ) )
"Not( IsEqual( GSGetVar( 0, ""ZT7"" ) , 1 ) )"
)
then
(
KillScript( )
VTriger#0#225( this )
)
)
Script VTriger#0#225
(
if
(
)
then
(
KillScript( )
"GSSetVar( 0, ""ZT7"", 1 )"
"SendStringEvent( 0, ""tutorial zt7"" )"
)
)
Мы можем выработать правило, чтобы подобные логические узлы всегда были в такой же канонической форме. Или сделать как-то иначе, например:
SS_TEXT
Script VTriger#0#219
(
if
(
)
then
(
KillScript( )
Sleep( 22 )
"GSSetVar( 0, ""ZT6"", 1 )"
"SendStringEvent( 0, ""tutorial zt6"" )"
VCheck#0#221( this )
)
)
Script VCheck#0#221
(
if
(
"IsLess( GSGetVar( 0, ""t.gz1g.zt7"" ) , 2 )"
)
then
(
KillScript( )
VCheck#0#222( this )
)
)
Script VCheck#0#222
(
if
(
IsGreater( add(WasLooted( LoneWolf ),Every( i, Boars, IsDead( i ) ))),0 )
)
then
(
KillScript( )
VTriger#0#225( this )
)
)
Script VTriger#0#225
(
if
(
)
then
(
KillScript( )
"GSSetVarMax( 0, ""t.gz1g.zt7"", 2 )"
"SendStringEvent( 0, ""tutorial zt7"" )"
)
)
логическое «ИЛИ» здесь реализовано на:
IsGreater( add(WasLooted( LoneWolf ),Every( i, Boars, IsDead( i ) ))),0 )
Можно сделать цепочку из вложенного «IF ELSE»:
SS_TEXT
VTriger#0#219( this )
)
)
Script VTriger#0#219
(
if
(
)
then
(
KillScript( )
Sleep( 22 )
"GSSetVar( 0, ""ZT6"", 1 )"
"SendStringEvent( 0, ""tutorial zt6"" )"
VCheck#0#221( this )
)
)
Script VCheck#0#221
(
if
(
"IsLess( GSGetVar( 0, ""t.gz1g.zt7"" ) , 2 )"
)
then
(
KillScript( )
VCheck#0#222( this )
)
)
Script VCheck#0#222
(
if
(
WasLooted( LoneWolf )
)
then
(
KillScript( )
VTriger#0#225( this )
")
if
("
Every( i, Boars, IsDead( i ) )
")
then
(
KillScript( )"
VTriger#0#225( this )
")
)"
Script VTriger#0#225
(
if
(
)
then
(
KillScript( )
"GSSetVarMax( 0, ""t.gz1g.zt7"", 2 )"
"SendStringEvent( 0, ""tutorial zt7"" )"
)
)