вопросик один
#1
Если конечно можно... :unsure:

SendStringEvent - ее назначение не совсем понятно, Sun подскажи если знаешь более конкретно.

судя по всему выдает "текст" (в каком виде? только в виде диалога? или в виде обучающих экранов)

Код:
Script VTriger#0#477
(
 if
 (
 )
 then
 (
   KillScript(  )
   CreateFX( 62, 62, 3, 10, 30, "Scenar.wav" )
   Walk( GetObjectByName( "Hero" )  )
   MoveToPoint( GetObjectByName( "Hero" ) , 63, 66.8 )
   SleepUntilIdle( GetObjectByName( "Hero" )  )
   GSSetVar( 0, "StW", 1 )
   SendStringEvent( 0, "briefing s1" )
 )
)
вот тригер, который запускается при первом посещении поселка. Судя по всему ( Smile ) это происходит инициализация диалога, т.е безусловная(!) Очень нужно знать точно ли за запуск диалога отвечает SendStringEvent( 0, "briefing s1" ) Я в этом почти уверен, так как в briefing s1 содержится именно этот диалог....

можно спросить еще, что делает SendEvent( 0, 11224 )(это пример) ?

я могу рассказать (если нужно) чем отличается -
091 GSSetVar( nPlayer : float , Var : string , nVar : float )
от
092 GSSetVarMax( nPlayer : float , Var : string , nVar : float )
хотя применение этого отличия так никто и не придумал Big Grin
Кто не согласен – пусть первый кинет в свой монитор камнем!
Ответ
#2
Вот что у меня записано в описании этой команды.

SendStringEvent( nPlayer : FLOAT , say : STRING ) Вызывает определенные событие из игры описываемое строкой: say. (SendEvent – событие по ID). Известные события это: Реплики, старт диалогов на брифинг зоне, запуск обучающего текста на игровой зоне, обучающие указатели и так далее. В каждом случае форма построения строки события разные. Например, чтобы вызвать какой-то диалог из тела процедуры немедленно, то есть, обработать событие на брифинг зоне с каким-то условием, то в этой команде нужно написать следующую строку: SendStringEvent(0,"briefing m12"), где briefing – указатель типа вызываемого события, m12 - имя переменной, разделитель списка - пробел. Так же можно указать примечание в строке, например, так: @SendStringEvent(0,"briefing m12 smith"). Набрав эту команду из консоли на брифинге поселка, немедленно состоится разговор между Заком и Бабуром. То же самое событие можно реализовать при посещении брифинг зоны, например, проинициализировать переменную: GSSetVar(0,"b.bz1g.m12",1). В этом случае, для объекта брифинг зоны устанавливается событие событие: автостарт диалога при следующем посещении этой зоны. В данном случае при следующем посещении брифинг зоны Поселка автоматически стартует диалог с Бабуром. Ну и если непосредственно инициализировать переменную: GSSetVar(0,"b.smith.m12"),1), то у Персонажа Бабура появится строка диалога, само событие которого можно вызвать по выбору текста в меню этого персонажа. Макрос последовательности разговора, анимация прописана в файле m12, базы texts.res. Выбор локализации имени персонажа производится по уникальному NID коду. Если инициализировать имя переменной, которой нет, то будет пустая строка в списки диалогов имен Персонажа.


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

Вообще-то, я сегодня я закончил разбор диалогов, инициализируемый с скриптах мобов игры. Вот сидел и думал поднять вопросы на форуме по тому, как исправить всякие несоответствия в последовательности диалогов. Есть много всяких нестыковок в этом плане. Думаю, может, стоит пообсуждать…
Ответ
#3
Спасибо Sun !
помог :up:

Ну если вы знаете чем отличаются, тогда ладно Smile

Пообсуждать хорошо, главное что бы кто-нибудь понял и смог поучаствовать. Smile

В процессе работы с "редактором диалогов" (который в Аccess) заметил некоторые неточности, ну или просто я не с того конца подошел а работе.

Я так и не понял как создать просто, один диалог, и потом его сохранить. Приходится вбивать , а в следующий раз просто стирать и вбивать все снова. А потом при "сохранении" вроде должно было бы добавляться в texts.res но я не заметил там ничего, и пошел другим путем... просто подредактировал немного модуль - module1 что би он не удалял из временной папки файлы, и потом просто беру их там. Только опять странность в получившемся файлике отсутствует часть с перечислением всех участвующих:
#show Hero
#show Merc3
вот, например.

И еще не очень понятно назначение поля "Сорт" я предполагал что это будет переноситься в файл, #phrase Merc3 X вот сюда, но не обнаружил его там, да и вообще там этого нету.. Оно не обязательно да?

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

ой что то я разошелся прошу прощения...
Кто не согласен – пусть первый кинет в свой монитор камнем!
Ответ
#4
Мы ничего не отлаживали, и даже толком не проверяли - правильно ли экспортируется из «Акцесс» в формат Нивала. Вообще-то это как бы техзадание. В строке подсказки к полю sort написано: для сортировки. Это особенности Акцесс, уникальное поле в таблице диалогов типа Счетчик его нельзя изменять, а таблица диалогов , в принципе это список макрокоманд, соответственно последовательных. Чтобы можно было изменить последовательность выполнения команды для экспортирования в файл формата Нивала и нужно это поле. Впрочем, эту базу можно использовать для самообучения, что к чему, или чтобы сделать свой конструктор.

Спасибо что интересуешься и разбираешься с конструктором. Может у тебя получится сделать достойный и простой интерфейс конструктора/редактора диалогов. Мы с Джетом еще разбираемся с ресурсами ПЗ и систематизируем структуру данных. Я вот два месяца сижу над скриптами в мобах, в частности над диалогами и квестами. Вчера связал в таблицу все события инициализации диалогов. Очень юольшое кол-во мелких ошибочек и неточностей. Ошибки, как правило косвенные или нелогичные. Например, отдать голову белого вока можно либо Горту, либо Эрфару, любой из диалгов отменят другой. Я имею в виду, что если поговорить с Гортом, то будент отменен диалог с Эрфаром, и наоборот. Так вот, если гвоорить Эрфаром, то зак про себя произносит слова: Ишь ты, как повернул, хитрец! Придется и впрямь голову волка отдать, чтобы не оказалось, что у меня на словах одно, а на деле другое. Фраза: «…Придется и впрямь голову…» - выглядит, как если бы Зак, предварительно не отдал голову волка Горту, а тот об этом просил. А так же, задание выдал Эрфар и если подойти к Горту а не к Эрфару, то получается, что заку дали задиние а он и словом не обмолвился об этом…. Вообще, именно об таких моментах я и хотел поговорить, как исправить такие «нестыковочки» в диалогах. Я сделал так в этом случае. Эти два диалога инициализируется, как и в стандартной ПЗ, оба после выполнения задания: добыть Голову белого волка. После разговора с Гортом ничего не происходит, голова волка по-прежнему у Зака, а после разговора с Эрфаром удаляется с обоза Зака Голова волка и, если разговор с Гортом не состоялся, то этот диалог с Гортом отменяется.
Ну, вот такие вот изменения для сервиспакета могут быть сделаны. Мы постараемся сделать Интернет версию конструктора диалогов для ПЗ и показать что и как.
Ответ
#5
Ага, точно не состыковка. А можно как то усложнить создание таких ошибок? Smile А то создается такое ощущение, что есть реальный шанс наделать их намного больше чем Нивал...

Конструктором я, правда, интересуюсь, я сейчас работаю с ним, это намного (даже с учетом того, что я перечислял выше) удобнее, чем работать в текстовом редакторе!
Цитата:Может у тебя получится сделать достойный и простой интерфейс конструктора/редактора диалогов.
вроде как Самба занимался этим, ну а я же в свою очередь постараюсь ему помочь, по возможности.

Интернет версия конструктора диалогов - это будет аналог конструктора, который сейчас есть? Хм, идея интересная!
Кто не согласен – пусть первый кинет в свой монитор камнем!
Ответ
#6
Интернет версия задумывается не как аналог - это продолжение работы над ресурсами ПЗ как часть проекта «Энциклопедия о ПЗ». Мы делаем новую структуру и правила, исключающее множество возможных ошибок во время создания новых диалогов. Все данные (глобальные переменные) будут устанавливаться по одним правилам и в одной стройной структуре. Кстати говоря, не нужно будет переживать, и задумываться какую из команд использовать GSSetVar или GSSetVarMax… . Наш микрокод будет построен как объектно-ориентированный код. То есть каждый метод будет иметь свой объект или метод у объекта, или возвращать его свойства. Группы объектов будут унаследовать свойства и устанавливаться по логическим правилам для групп таких объектов. Сейчас код уже подготовлен на 100% для конверта в наш формат данных. Вот примерные замены и соответствия новых и старых команд в коде, встречающихся в моб-скриптах ПЗ:


<TABLE ALIGN=center BORDER=0 CELLPADDING=0> <TABLE BORDER=1 CELLPADDING=1>
<tr><td> Function </td><td> First-NewCOMMAND </td><td> First-COMMAND </td></tr>
<tr><td> AddLoot </td><td> AddLoot("HeroAlone","") </td><td> AddLoot(0,"HeroAlone","") </td></tr>
<tr><td> AddMob </td><td> AddMob("Zone3ObrVoev.mob") </td><td> AddMob("Zone3ObrVoev.mob") </td></tr>
<tr><td> AddRectToArea </td><td> AddRectToArea(1,47.6,156.9,93.7,210.5) </td><td> AddRectToArea(1,47.6,156.9,93.7,210.5) </td></tr>
<tr><td> AddRoundToArea </td><td> AddRoundToArea(1,230,220,15) </td><td> AddRoundToArea(1,230,220,15) </td></tr>
<tr><td> AddUnitToParty </td><td> AddUnitToParty("JunParty::JunBoy","Jun Male Hero") </td><td> AddUnitToParty(0,"JunParty::JunBoy","Jun Male Hero") </td></tr>
<tr><td> AttachParticles </td><td> AttachParticles(1,Hero) </td><td> AttachParticles( 1, GetObjectByName("Hero") ) </td></tr>
<tr><td> CastSpellPointObjFuture </td><td> CastSpellPointObjFuture("fireball",Heroes,3) </td><td> CastSpellPoint("fireball",GetFutureX(this,3),GetFutureY(this,3),GetFutureX(this,3),GetFutureY(this,3)) </td></tr>
<tr><td> CastSpellUnit </td><td> CastSpellUnit("invisibility{d2;d2;d2;d2;d2;d2;d2;d2}",50,50,Spirit) </td><td> CastSpellUnit("invisibility{d2;d2;d2;d2;d2;d2;d2;d2}",50,50,Spirit) </td></tr>
<tr><td> CastSpellUnitObj </td><td> CastSpellUnitObj("strength{d2;d2;d2;d2}",Healing02,Hero) </td><td> CastSpellUnit("strength{d2;d2;d2;d2}",GetX(Healing02),GetY(Healing02),GetObjectByName("Hero")) </td></tr>
<tr><td> CopyItems </td><td> CopyItems("Hero","JunParty::JunBoy") </td><td> CopyItems(0,"Hero","JunParty::JunBoy") </td></tr>
<tr><td> CopyLoot </td><td> CopyLoot("","JunParty") </td><td> CopyLoot(0,"","JunParty") </td></tr>
<tr><td> CopyStats </td><td> CopyStats("Hero","JunParty::JunBoy") </td><td> CopyStats(0,"Hero","JunParty::JunBoy") </td></tr>
<tr><td> CreateFX </td><td> CreateFX(62,62,3,10,30,"Scenar.wav") </td><td> CreateFX(62,62,3,10,30,"Scenar.wav") </td></tr>
<tr><td> CreateFXObj </td><td> CreateFXObj(Hero,2.5,15,30,"Toolsatzako01.wav") </td><td> CreateFX(GetX(GetObjectByName("Hero")),GetY(GetObjectByName("Hero")),2.5,15,30,"Toolsatzako01.wav") </td></tr>
<tr><td> CreateFXSource </td><td> CreateFXSource(-1,456,61,25,25,50,"Toolsteleport1.wav") </td><td> CreateFXSource(-1,456,61,25,25,50,"Toolsteleport1.wav") </td></tr>
<tr><td> CreateParticleSource </td><td> CreateParticleSource(1,0,0,0,2,"StartTrans") </td><td> CreateParticleSource( 1, 0,0,0, 2, "StartTrans" ) </td></tr>
<tr><td> CreateParticleSourceObj </td><td> CreateParticleSourceObj(2,Hero,-1,2,"TransForm") </td><td> CreateParticleSource( 2, GetX(GetObjectByName("Hero")),GetY(GetObjectByName("Hero")),-1, 2, "Transform" ) </td></tr>
<tr><td> CreateParty </td><td> CreateParty("JunParty") </td><td> CreateParty(0,"JunParty") </td></tr>
<tr><td> CreatePointLight </td><td> CreatePointLight(12,226.5,14.6,27,-20,100,255,0) </td><td> CreatePointLight(12,226.5,14.6,27,-20,100,255,0) </td></tr>
<tr><td> DeletePointLight </td><td> DeletePointLight(12) </td><td> DeletePointLight(12) </td></tr>
<tr><td> EnableObject </td><td> EnableObject(Hero,1) </td><td> BlockUnit(GetobjectByName("Hero"),1) </td></tr>
<tr><td> EraseQuestItem </td><td> EraseQuestItem(71) </td><td> EraseQuestItem(0,71) </td></tr>
<tr><td> FixItems </td><td> FixItems() </td><td> FixItems() </td></tr>
<tr><td> FixWorldTime </td><td> FixWorldTime(0) </td><td> FixWorldTime(0) </td></tr>
<tr><td> Follow </td><td> Follow(BodyGuard,Executive) </td><td> Follow (Bodyguard,Executive) </td></tr>
<tr><td> GiveDexterity </td><td> GiveDexterity(Hero,3) </td><td> GiveDexterity(GetObjectByName("Hero"),3) </td></tr>
<tr><td> GiveItem </td><td> GiveItem("prototype.firewall") </td><td> GiveItem(0,"prototype.firewall") </td></tr>
<tr><td> GiveMoney </td><td> GiveMoney(1000) </td><td> GiveMoney(0,1000) </td></tr>
<tr><td> GiveQuestItem </td><td> GiveQuestItem("SackofGold") </td><td> GiveQuestItem(0,"SackofGold") </td></tr>
<tr><td> GiveSkill </td><td> GiveSkill(Hero,"sense",10) </td><td> GiveSkill(GetObjectByName("Hero"),"sense",10) </td></tr>
<tr><td> GiveStrength </td><td> GiveStrength(Hero,3) </td><td> GiveStrength(GetObjectByName("Hero"),3) </td></tr>
<tr><td> GiveUnitQuestItem </td><td> GiveUnitQuestItem(ORunner,"Letter2Orcs00") </td><td> GiveUnitQuestItem(ORunner,"Letter2Orcs00") </td></tr>
<tr><td> GSCancelVar </td><td> GSCancelVar("Polymorph") </td><td> GSSetvar(0,"Polymorph",3) </td></tr>
<tr><td> GSDelVar </td><td> GSDelVar("PigCount") </td><td> GSSetVar(0,"PigCount",0) </td></tr>
<tr><td> GSDoneVar </td><td> GSDoneVar("q.bz1g.q26g_s25_1") </td><td> GSSetVarMax(0,"b.elder.s25_3",1) </td></tr>
<tr><td> GSIncVar </td><td> GSIncVar("goblinbodycount") </td><td> GSSetVar(0,"goblinbodycount",Add(GSGetVar(0,"goblinbodycount"),1)) </td></tr>
<tr><td> GSInitVar </td><td> GSInitVar("b.elder.s12_1") </td><td> GSSetVarMax(0,"b.elder.s12_1",1) </td></tr>
<tr><td> GSSetVar </td><td> GSSetVar("Polymorph",4) </td><td> GSSetvar(0,"Polymorph",4) </td></tr>
<tr><td> GSSetVarMax </td><td> GSSetVarMax("FLAG1",111) </td><td> GSSetVarMax(0,"FLAG1",111) </td></tr>
<tr><td> GSSetVarVar </td><td> GSSetVarVar("z.gz9g.a1","gtime") </td><td> GSSetVar(0,"z.gz9g.a1",GSGetVar(0,"gtime")) </td></tr>
<tr><td> Guard </td><td> Guard(YDragon,78,336,7) </td><td> Guard(YDragon,78,336,7) </td></tr>
<tr><td> GuardObj </td><td> GuardObj(ORunner,ORunner,5) </td><td> Guard(ORunner,GetX(ORunner),GetY(ORunner),5) </td></tr>
<tr><td> GuardRnd </td><td> GuardRnd(Wolfpack,40,20,238,5,5) </td><td> for(i,Wolfpack) (Guard(i,Add(40,Random(20)),Add(238,Random(5)),5)) </td></tr>
<tr><td> HaveItem </td><td> HaveItem(71) </td><td> HaveItem(0,71) </td></tr>
<tr><td> HideObject </td><td> HideObject(BGoblinC,0) </td><td> HideObject(BGoblinC,0) </td></tr>
<tr><td> Idle </td><td> Idle(Human1) </td><td> Idle(Human1) </td></tr>
<tr><td> InflictDamage </td><td> InflictDamage(Heroes,1000) </td><td> InflictDamage(this,1000) </td></tr>
<tr><td> InvokeAlarm </td><td> InvokeAlarm(1,0,0) </td><td> InvokeAlarm(1,0,0) </td></tr>
<tr><td> InvokeAlarmObj </td><td> InvokeAlarmObj(2,BShaman) </td><td> InvokeAlarm(2,GetX(BShaman),GetY(BShaman)) </td></tr>
<tr><td> isAbsence </td><td> isAbsence(Mercs) </td><td> IsEqual(GetMercsNumber(0),0) </td></tr>
<tr><td> IsAlarm </td><td> IsAlarm(3) </td><td> IsAlarm(3) </td></tr>
<tr><td> IsAlive </td><td> IsAlive(Borka) </td><td> IsAlive(Borka) </td></tr>
<tr><td> IsCancelOrDone </td><td> IsCancelOrDone("TelC") </td><td> IsGreater(GSGetVar(0,"TelC"),1) </td></tr>
<tr><td> IsDead </td><td> IsDead(OrcG) </td><td> Every(i,OrcG,IsDead(i)) </td></tr>
<tr><td> IsDelVar </td><td> IsDelVar("PM") </td><td> Not(IsEqual(GSGetVar(0,"PM"),1)) </td></tr>
<tr><td> IsDoneVar </td><td> IsDoneVar("b.smith.m12") </td><td> IsEqual(GSGetVar(0,"b.smith.m12"),2) </td></tr>
<tr><td> IsEnemy </td><td> IsEnemy(Peasans) </td><td> Any(i,Peasans,IsEnemy(i,0)) </td></tr>
<tr><td> IsEqual </td><td> IsEqual(F1,0) </td><td> IsEqual(F1,0) </td></tr>
<tr><td> IsFriend </td><td> IsFriend(Peasans) </td><td> Not(Any(i,Peasans,IsEnemy(i,0))) </td></tr>
<tr><td> IsGreaterDistanceUnitPoint </td><td> IsGreaterDistanceUnitPoint(Dkins,6,160,7) </td><td> Every(i,Dkins,IsLess(DistanceUnitPoint(i,6,160),7)) </td></tr>
<tr><td> IsGreaterDistanceUnitUnit </td><td> IsGreaterDistanceUnitUnit(Heroes,MainGates,15) </td><td> IsGreater(DistanceUnitUnit(this,MainGates),15) </td></tr>
<tr><td> IsGreaterGSGetVar </td><td> IsGreaterGSGetVar("PigCount",5) </td><td> IsGreater(GSGetVar(0,"PigCount"),5) </td></tr>
<tr><td> IsGreaterSub </td><td> IsGreaterSub("GTime","FrTime",72) </td><td> IsGreater(Sub(GSGetVar(0,"GTime"),GSGetVar(0,"FrTime")),72) </td></tr>
<tr><td> IsInAreaObj </td><td> IsInAreaObj(1,Borka) </td><td> IsInArea(1,GetX(Borka),GetY(Borka)) </td></tr>
<tr><td> IsInitOrDelVar </td><td> IsInitOrDelVar("q.gz3g.q23g") </td><td> IsLess(GSGetVar(0,"q.gz3g.q23g"),2) </td></tr>
<tr><td> IsInitVar </td><td> IsInitVar("Goblin") </td><td> IsEqual(GSGetVar(0,"Goblin"),1) </td></tr>
<tr><td> IsLessDistanceUnitPoint </td><td> IsLessDistanceUnitPoint(Junophile,280,45,5) </td><td> IsLess(DistanceUnitPoint(Junophile,280,45),5) </td></tr>
<tr><td> IsLessDistanceUnitUnit </td><td> IsLessDistanceUnitUnit(Heroes,BoarCage,7) </td><td> Any(i,Heroes,IsLess(DistanceUnitUnit(i,BoarCage),7)) </td></tr>
<tr><td> IsNotAlive </td><td> IsNotAlive(OhranaJunHouse) </td><td> Every(i,OhranaJunHouse,Not(IsAlive(i))) </td></tr>
<tr><td> IsNotCancelVar </td><td> IsNotCancelVar("q.gz9g.q12g") </td><td> Not(IsEqual(GSGetVar(0,"q.gz9g.q12g"),3)) </td></tr>
<tr><td> IsNotDelVar </td><td> IsNotDelVar("b.witch.z38") </td><td> IsGreater(GSGetVar(0,"b.witch.z38"),0) </td></tr>
<tr><td> IsNotUsedLever </td><td> IsNotUsedLever(BanditsChest) </td><td> IsEqual(GetLeverState(BanditsChest),0) </td></tr>
<tr><td> IsNotUsedObj </td><td> IsNotUsedObj(Hero) </td><td> IsUnitBlocked(GetObjectByName("Hero")) </td></tr>
<tr><td> IsObjectSee </td><td> IsObjectSee(Pleshivy,Heroes) </td><td> GroupSize(GroupCross(UnitSee(Pleshivy),Heroes)) </td></tr>
<tr><td> IsPlayerInSafety </td><td> IsPlayerInSafety() </td><td> Not(IsPlayerIndanger(0)) </td></tr>
<tr><td> IsPlayerSee </td><td> IsPlayerSee(Warlord) </td><td> GroupHas(PlayerSee(0),Warlord) </td></tr>
<tr><td> isPresent </td><td> isPresent(Mercs) </td><td> IsGreater(GroupSize(Heroes),1) </td></tr>
<tr><td> isSameObject </td><td> isSameObject(GetLeader,Try1) </td><td> IsEqual(GetObjectID(GetUnitOfPlayer(0,0)),GetObjectID(Try1)) </td></tr>
<tr><td> IsUsedLever </td><td> IsUsedLever(BanditsChest) </td><td> IsEqual(GetLeverState(BanditsChest),1) </td></tr>
<tr><td> KillUnit </td><td> KillUnit(Captain) </td><td> KillUnit(Captain) </td></tr>
<tr><td> LeaveToZone </td><td> LeaveToZone("bz4g",0) </td><td> LeaveToZone(0,"bz4g",0) </td></tr>
<tr><td> LocalSetObj </td><td> LocalSetObj(Try1,Heroes) </td><td> Try1=this </td></tr>
<tr><td> LocalSetVar </td><td> LocalSetVar(F1,0) </td><td> F1=0 </td></tr>
<tr><td> MoveToPoint </td><td> MoveToPoint(Hero,63,66.8) </td><td> MoveToPoint(GetObjectByName("Hero"),63,66.8) </td></tr>
<tr><td> PlayAnimation </td><td> PlayAnimation(HumanHighFigh,"uspecial10") </td><td> Playanimation(HumanHighFigh,"uspecial10") </td></tr>
<tr><td> PlayMovie </td><td> PlayMovie("teleprt4.bik") </td><td> PlayMovie("teleprt4.bik") </td></tr>
<tr><td> PlayMusic </td><td> PlayMusic("Nature") </td><td> PlayMusic(0,"Nature") </td></tr>
<tr><td> Portal1 </td><td> Portal1() </td><td> Portal1() </td></tr>
<tr><td> Portal2 </td><td> Portal2() </td><td> Portal2() </td></tr>
<tr><td> QFinish </td><td> QFinish() </td><td> QFinish() </td></tr>
<tr><td> QObjArea </td><td> QObjArea(1) </td><td> QObjArea(1) </td></tr>
<tr><td> QObjGetItem </td><td> QObjGetItem(17) </td><td> QObjGetItem(17) </td></tr>
<tr><td> QObjKill </td><td> QObjKill(1000324) </td><td> QObjKillUnit("GetObject(1000324)") </td></tr>
<tr><td> QObjSee </td><td> QObjSee(1000086) </td><td> QObjSeeObject("GetObject(1000086)") </td></tr>
<tr><td> QObjUse </td><td> QObjUse(4636,1) </td><td> QObjUse("GetObject(4636)",1) </td></tr>
<tr><td> QStart </td><td> QStart("z3q1") </td><td> QStart("z3q1") </td></tr>
<tr><td> QuestComplete </td><td> QuestComplete("z6q3") </td><td> QuestComplete(0,"z6q3") </td></tr>
<tr><td> RecalcMercBriefings </td><td> RecalcMercBriefings() </td><td> RecalcMercBriefings() </td></tr>
<tr><td> RedeployParty </td><td> RedeployParty() </td><td> RedeployParty(0) </td></tr>
<tr><td> RemoveObjectFromServer </td><td> RemoveObjectFromServer(Sheriff) </td><td> RemoveUnitFromServer(GetObjectByName("Sheriff")) </td></tr>
<tr><td> RemoveQuestItem </td><td> RemoveQuestItem(DGuardian,11) </td><td> RemoveQuestItem(DGuardian,11) </td></tr>
<tr><td> RemoveUnitFromParty </td><td> RemoveUnitFromParty("Merc1") </td><td> RemoveUnitFromParty(0,"merc1") </td></tr>
<tr><td> ResetTarget </td><td> ResetTarget(Cyclope) </td><td> ResetTarget(Cyclope) </td></tr>
<tr><td> RotateTo </td><td> RotateTo(Human1,56.3,74) </td><td> RotateTo(Human1,56.3,74) </td></tr>
<tr><td> Run </td><td> Run(BGoblinC) </td><td> Run(GetObjectByName("BGoblinC")) </td></tr>
<tr><td> RunWorldTime </td><td> RunWorldTime(12) </td><td> RunWorldTime(12) </td></tr>
<tr><td> SendEvent </td><td> SendEvent(11224) </td><td> SendEvent(0,11224) </td></tr>
<tr><td> SendStringEvent </td><td> SendStringEvent("briefing s1") </td><td> SendStringEvent(0,"briefing s1") </td></tr>
<tr><td> Sentry </td><td> Sentry(Lizards,5,155) </td><td> Sentry(this,5,155) </td></tr>
<tr><td> SentryObj </td><td> SentryObj(Bodyg1,Orc1SP) </td><td> Sentry(Bodyg1,GetX(Orc1SP),GetY(Orc1SP)) </td></tr>
<tr><td> SetCP </td><td> SetCP(Human1,56.5616,74.8637,0) </td><td> SetCP(Human1,56.5616,74.8637,0) </td></tr>
<tr><td> SetCPObj </td><td> SetCPObj(BBoard,13.55) </td><td> SetCP(BBoard,GetX(BBoard),GetY(BBoard),13.55) </td></tr>
<tr><td> SetCPRnd </td><td> SetCPRnd(Peasans,192,3,125,3,0) </td><td> SetCP(this,Add(192,Random(3)),Add(125,Random(3)),0) </td></tr>
<tr><td> SetCurrentParty </td><td> SetCurrentParty("JunParty") </td><td> SetCurrentParty(0,"JunParty") </td></tr>
<tr><td> SetDiplomacy </td><td> SetDiplomacy(4,5,-1) </td><td> SetDiplomacy(4,5,-1) </td></tr>
<tr><td> SetPlayer </td><td> SetPlayer(Borka,0) </td><td> SetPlayer(Borka,0) </td></tr>
<tr><td> SetScience </td><td> SetScience(Crypt,0,0,1,0,0,0) </td><td> SetScience(Crypt,0,0,1,0,0,0) </td></tr>
<tr><td> SetWaterLevel </td><td> SetWaterLevel(5,-2.3,100) </td><td> SetWaterLevel(5,-2.3,100) </td></tr>
<tr><td> Sleep </td><td> Sleep(50) </td><td> Sleep(50) </td></tr>
<tr><td> SleepGSGetVar </td><td> SleepGSGetVar("DefaultChaseDelay") </td><td> Sleep(GSGetVar(0,"DefaultChaseDelay")) </td></tr>
<tr><td> SleepRnd </td><td> SleepRnd(500,200) </td><td> Sleep(Add(500,Random(200))) </td></tr>
<tr><td> SleepUntilIdle </td><td> SleepUntilIdle(Human1) </td><td> SleepUntilIdle(Human1) </td></tr>
<tr><td> SleepUntilUnitPoint </td><td> SleepUntilUnitPoint(Human11,44,78,1) </td><td> SleepUntil(IsLess(DistanceUnitPoint(Human11,44,78),1) ) </td></tr>
<tr><td> SwitchLeverState </td><td> SwitchLeverState(HeroPrisonOpened,1) </td><td> SwitchLeverState(HeroPrisonOpened,1) </td></tr>
<tr><td> TimeLag </td><td> TimeLag(4,23) </td><td> IsLess(GetWorldTime(),23) </td></tr>
<tr><td> UMAggression </td><td> UMAggression(RampageTigerRun1) </td><td> UMAggression(i) </td></tr>
<tr><td> UMClear </td><td> UMClear(Human5) </td><td> UMClear(Human5) </td></tr>
<tr><td> UMFear </td><td> UMFear(RampageTigerRun1,1) </td><td> UMFear(i,1) </td></tr>
<tr><td> UMFollow </td><td> UMFollow(Borka,GetLeader) </td><td> UMFollow(Borka,GetUnitOfPlayer(0,0)) </td></tr>
<tr><td> UMGuard </td><td> UMGuard(WTiger1,79,329,7) </td><td> UMGuard(i,79,329,7) </td></tr>
<tr><td> UMPlayer </td><td> UMPlayer(Human1) </td><td> UMPlayer(Human1) </td></tr>
<tr><td> UMRevenge </td><td> UMRevenge(Boars1) </td><td> UMRevenge(i) </td></tr>
<tr><td> UMSentry </td><td> UMSentry(Human1,44,78) </td><td> UMSentry(Human1,44,78) </td></tr>
<tr><td> UMSentryObj </td><td> UMSentryObj(Chasers,Hero) </td><td> UMSentry(this,GetX(GetObjectByName("Hero")),GetY(GetObjectByName("Hero"))) </td></tr>
<tr><td> UMSentryObjRnd </td><td> UMSentryObjRnd(s1,5,GetLeader,5) </td><td> for(i,s1)(UMSentry(i,Add(GetX(GetUnitOfPlayer(0,0)),Random(5)),Add(GetY(GetUnitOfPlayer(0,0)),Random(5)))) </td></tr>
<tr><td> UMSentryRnd </td><td> UMSentryRnd(Dkins,6,3,160,5) </td><td> UMSentry(i,Add(6,Random(3)),Add(160,Random(5))) </td></tr>
<tr><td> UMStandard </td><td> UMStandard(Q5dThreat) </td><td> UMStandard(Q5dThreat) </td></tr>
<tr><td> UnitInSquare </td><td> UnitInSquare(GetLeader,229,70,232,74) </td><td> UnitInSquare(GetLeader(),229,70,232,74) </td></tr>
<tr><td> Walk </td><td> Walk(Hero) </td><td> Walk(GetObjectByName("Hero")) </td></tr>
<tr><td> WasLooted </td><td> WasLooted(LoneWolf) </td><td> WasLooted(LoneWolf) </td></tr>
</table>



Всего 140 всевозможных комбинаций методов и свойств.
В Интернет версии, мы собираемся установить связь в графическом виде между выдачей заданий после вызова диалогов и инициализацией переменных диалогов после выполнения заданий, а также условия выполнения заданий, и все Это в одной табличной структуре! Постараемся сделать ядро-эмулятор всего этого хозяйства.
Мы предполагаем, что после такого «объединения» будет удобно создавать сложные задания и диалоги в ПЗ, пока только для одиночной игры, позже для МП.
Ответ
#7
выглядит потрясающе Smile
только вот, прости, я не сейчас не понимаю не тогда не мог понять, как это заработает в ПЗ Sad т.е что нужно сделать что бы новые команды можно было бы использовать?...

Код:
IsDead    IsDead(OrcG)    Every(i,OrcG,IsDead(i))
может лучше вот так?
Код:
IsDead     IsDead(OrcG)    Every(i,OrcG,Not(IsIsAlive(i)))
что бы уже на этом этапе исключить возможную ошибку (как было с Геной(не помню как его по человечески звали) на Вторжении) потому что так приходится использовать вместо IsDead(x), Not(IsIsAlive(x))

Sun
а то описание команд из которого ты давал цитату, оно хм, я могу его посмотреть? Потому что то которое есть у меня, по всей видимости, достаточно сильно не полное... Это сохраненное твое сообщение из темы "для vea...." от 08 августа 2002 :o (только немного отредактированное)

p.s Jet, а почему Sun может использовать а я, например, нет? Big Grin
(причем на странице просмотра, в его сообщении тоже это не работает, таблицы нету)
Кто не согласен – пусть первый кинет в свой монитор камнем!
Ответ
#8
Цитата:выглядит потрясающе
1-ая колонка это новое имя скриптового макроса.
2-ая колонка это код, в которй будет интерпретироваться макрос
3-я колонка, это старый код.

Цитата:может лучше вот так?
Ты наверное не замтил:
IsAlive
IsDead
IsNotAlive
B)

Цитата:а то описание команд из которого ты давал цитату, оно хм, я могу его посмотреть?
Я думаю, что мы мы выложим это описание в рамках нашего проекта "Энциклопедия ПЗ". Rolleyes

Цитата:p.s Jet, а почему Sun может использовать  а я, например, нет?
Это связано с безопасностью. :excl:

Цитата:причем на странице просмотра, в его сообщении тоже это не работает, таблицы нету)
Это бага форума. Blush
Ответ
#9
Цитата:Я думаю, что мы мы выложим это описание в рамках нашего проекта "Энциклопедия ПЗ". 
жаль что потом... Sad ведь приходится работать с этим уже сейчас... :unsure:

Цитата:Ты наверное не замтил:
IsAlive
IsDead
IsNotAlive
хм, чего не заметил? я не понял.
я предложил заменить проверку "смерти" юнита через IsDead() на проверку через Not(IsAlive()) это равнозначная замена, даже есть преимущество, т.к если использовать IsDead то есть шанс просчитаться из за известного бага. (если успеть схватить труп в полете, то он из состояния жив переходит в состояние отсутствует, но не умер Smile )
наверное я, точно, что то недопонял
Кто не согласен – пусть первый кинет в свой монитор камнем!
Ответ
#10
Цитата: предложил заменить проверку "смерти" юнита через IsDead() на проверку через Not(IsAlive()) это равнозначная замена
Согласен.

Цитата:хм, чего не заметил? я не понял.
В нашей версии скрипта, вместо 2-х проверок имеется целых 3!
IsDead - Если есть труп.
IsAlive - Есть ли есть живой юнит на карте.
IsNotAlive - Если нет живого юнита на карте.
Разъяснения по назначению каждой команды может дать только Сан, т.к. я боюсь ошибиться Rolleyes, особенно по поводу того почему мы решили оставить IsDead.
Ответ
#11
Код:
возвращает истину = 1- если объект: Unit труп, и ложь =0 - в противном случае. Если объект поднят? если объект не существует?, если ввести код предмета,  например ключ от пирамиды?
Пример: Гоблин Дозорный до Убийства. В консоли будут следующие значения:
@ConsoleFloat(IsAlive(GetObject(4747)))          = 1
@ConsoleFloat(Not(IsAlive( GetObject(4747))))  =0
@ConsoleFloat(IsDead( GetObject(4747)))        =0
@ConsoleFloat(Not(IsDead(GetObject(4747))))  =1
После убийства Гоблина:
@ConsoleFloat(IsAlive(GetObject(4747)))         = 0
@ConsoleFloat(Not(IsAlive( GetObject(4747))))  =1
@ConsoleFloat(IsDead( GetObject(4747)))        =1
@ConsoleFloat(Not(IsDead(GetObject(4747))))  =0
После поднятия трупа:
@ConsoleFloat(IsAlive(GetObject(4747)))         = 0
@ConsoleFloat(Not(IsAlive( GetObject(4747))))  =1
@ConsoleFloat(IsDead( GetObject(4747)))        =0
@ConsoleFloat(Not(IsDead(GetObject(4747))))  =1
С функцией IsDead могут быть проблемы, так если очень быстро поднять тело убитого врага (в старых версиях) напрмер после стены огня, то игра моджет не засчитать квест. Лучше использовать  Not(IsAlive(Object)).


С функцией isAlive и isDead не так все просто, в коде может быть не явным образом сделано отрицание, через ELSEIF и проверяться игровые моменты, которые не заменишь друг на друга этими функциями. Я не стал исправлять сразу все ошибки в ПЗ, так как каждый такой случай нужно интеллектуально оценить. Вернее, даже исправил, то о чем пишет Твистер, но потом закомментировал, так как, опять же, нужно будет «руками» все править.
Таблица процедур, что я написал - команды, функции, которые встречаются в ПЗ, это не все функции, которые мы поддержим.
Вообще, Мы собираемся ввести в конструктор ПЗ несколько больше логических команд и функций. Мы очень сильно упростили язык ПЗ, на столько сильно, что в нашем макроязыке нет вообще работы с группами, а соответственно и организации циклов. Группы обрабатывается по определенной логике. Логика нового скрипта построена на основе проверки функциями состояния переменных как: «ИСТИНА» и никогда: «ЛОЖЬ»! Дизайнеру уровней игры ненужно будет задумываться, как убить группу, просто указать: «удалить», и все. Все объекты и группы должны будут объявляться предварительно, и наш компилятор будет определять, какому объекту какой метод применен. Вот как планируется обрабатывать скрипт, и что подразумевается под понятием функций: isDead, isAlive




<TABLE BORDER=1 CELLPADDING=1>
<tr><td> Правило </td><td> Функция </td><td> Описание </td><td> <B>Пример </B></td></tr>
<tr><td> 1 </td><td> IsInAreaObj </td><td> любой из группы в любой области - истина </td><td> Any </td></tr>
<tr><td> 2 </td><td> iaNotDead </td><td> В группе нет ни единого трупа(мертвеца) </td><td> Any(i,s1,IsDead(i)) </td></tr>
<tr><td> 3 </td><td> IsEnemy </td><td> в группе хоть один враг игроку - истина (вся группа враги!) </td><td> Any(i,Peasans,IsEnemy(i,0)) </td></tr>
<tr><td> 4 </td><td> IsFriend </td><td> в группе нет ни единого врага игроку - то истина (вся группа друзья). </td><td> Not(Any(i,Peasans,IsEnemy(i,0))) </td></tr>
<tr><td> 5 </td><td> isDead </td><td> в группе хоть один трупп (мертвец) на карте! </td><td> Every </td></tr>
<tr><td> 6 </td><td> isAlive </td><td> в группе жив хоть один член группы, тогда истина </td><td> </td></tr>
<tr><td> 7 </td><td> IsLessDistanceUnitUnit </td><td> любой из группы ближе к юниту на указанное расстояние - истина </td><td> AnyIsLessDistanceUnitUnit(Heroes,BoarCage,7) </td></tr>
<tr><td> 8 </td><td> IsGreaterDistanceUnitUnit </td><td> любой из группы дальше от юнита на указанное расстояние - истина </td><td> Any </td></tr>
<tr><td> 9 </td><td> IsGreaterDistanceUnitPoint </td><td> любой из группы дальше указанного расстояния - истина. Обратное, если нужно чтобы вся группа была ближе к указанной точке. Аналог через ELSE (Every(i,Dkins,IsLess(DistanceUnitPoint(i,6,160),7)) - переделана структура на ELSE) </td><td> Any </td></tr>
<tr><td> 10 </td><td> isNotAlive </td><td> в группе убиты все , тогда истина. </td><td> </td></tr>
<tr><td> 11 </td><td> isPresent </td><td> присутствует юнит на карте. </td><td> </td></tr>
<tr><td> 12 </td><td> isAbsence </td><td> отсутствует юнит на карте. </td><td> </td></tr>
</table>

P.S: Это рабочая табличка и примеры могут не соответствовать действительности. Но, так в общих чертах...
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 4 Гость(ей)