| Автор | Сообщение | 
alekv - Colonel -
   |   |  | 4170 |  
   Doom Rate: 1.87 Posts quality: +950 | 
  Отправлено: 04.03.19 11:27:26 |  |  
 |  
В аноним функциях прыжки прописываются иначе:
 
TNT1 A 0 
{
if (CallACS("GetActorAngle") == TRUE)//Если вернет 1, прыгнет с вероятностью 128 в стейт MyState_1
	{
	return A_Jump(128, "MyState_1");
	}
else//иначе, 100% прыгаем в стейт MyState_2
	{
	return state("MyState_2");
	}
}
 
 Про другое не уверен, давно не юзал это дело, но можешь и сам проверить что будет с актером если ему прописать null (по идее актер будет уничтожен) |  
  |  
  | 
| 1 | 
3 | 
1 | 
  | 
 
 
 |  
  |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 04.03.19 22:01:25 |  |  
 |  
Ну вот опять:Actor DImpA : DoomImp
{
+AVOIDMELEE
States
{
See:
    TROO AABBCCDD 2 
	{
	If (GetDistance(1)<Radius+256)
		{
		Return A_Jump(256,"Avoid");
		}
	Else
		{
		Return State("See");
		}
	A_Chase;
       }
Loop
Melee:
Missile:
   TROO EF 8 A_FaceTarget
   TROO G 6 A_TroopAttack
   goto See
Avoid:
   TROO AABBCCDD 2 
       {
       If (GetDistance(1)>Radius+272)
		{
		Return A_Jump(256,"Missile");
		}
       Else
		{
                Return State("Avoid");
		}
       A_FaceTarget;
       A_Chase(0,"Missile",CHF_NODIRECTIONTURN);
       }
Loop
}
}
В чём косяк?
 
 EDIT:
 Пробовал ставить continue в элс теперь до кучи возвращает "'continue' outside of a loop". ((
 
 ЭДИТ2:
 Пробовал ставить return и return state(0) и всё время возвращает ошибку "Return type mismatch". ВТФ?! |  
 |  
  | 
| 1 | 
9 | 
1 | 
  | 
 
 
 |  
  |  | 
alekv - Colonel -
   |   |  | 4170 |  
   Doom Rate: 1.87 Posts quality: +950 | 
  Отправлено: 04.03.19 23:02:25 |  |  
 |  
Поставив такого актера на карте, ты можешь подойти к нему или отойти и он будет оповещать дальше или ближе.. 
 Короче тест актер показывает что прыжки работают корректно.
 
 
 
 
 В твоем случае, надо написать функции A_Chase; A_Facetarget ДО КОДА с прыжком, получается код прыжка должен быть последним
 Либо после этих всех функций написать return state("");
 Т.е. логика такая что если в аноним функции есть прыжок, то она как бы эквивалентна function int myFunc () т.е. должна что-то вернуть обязательно либо 0 либо что-то еще. прописав return state(""); ты в конце возвращаешь 0, как бы все выполняется и если не прыгнуло никуда, то вернет 0.
 
 Вот рабочий вариант:
 Actor DImpA : DoomImp
{
+AVOIDMELEE
States
	{
	See:
		TROO AABBCCDD 2
			{
			if (GetDistance(TRUE) < Radius + 256)
				{
				return A_Jump(256, "Avoid");
				}
			else
				{
				return state("See");
				}
			A_Chase;
			return state("");
			}
		Loop
	Melee:
	Missile:
		TROO EF 8 A_FaceTarget
		TROO G 6 A_TroopAttack
		goto See
	Avoid:
		TROO AABBCCDD 2
			{
			A_FaceTarget;
			A_Chase(false, "Missile", CHF_NODIRECTIONTURN);
			if (GetDistance(TRUE) > Radius + 272)
				{
				return A_Jump(256, "Missile");
				}
			else
				{
                return state("Avoid");
				}
			A_FaceTarget;
			A_Chase(false, "Missile", CHF_NODIRECTIONTURN);
			return state("");
			}
		Loop
	}
}
 |  
  |  
  | 
| 1 | 
3 | 
1 | 
  | 
 
 
 |  
  |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 04.03.19 23:25:04 |  |  
 |  
Так вот где собака порылась... Фига се, не думал что очерёдность ф-ций определяет внутреннюю конструкцию иф\элс. О_О
 
 Т. е. либо так:See:
		TROO AABBCCDD 2
			{
			A_Chase;
			if (GetDistance(TRUE) < Radius + 256)
				{
				return A_Jump(256, "Avoid");
				}
			else
				{
				return state("");
				}
			}
	Loop
	либо так:See:
		TROO AABBCCDD 2
			{
			if (GetDistance(TRUE) < Radius + 256)
				{
				return A_Jump(256, "Avoid");
				}
			else
				{
				//
				}
			A_Chase;
			return state("");
			}
	Loop
 alekv, Гранд Мерси!   |  
  |  
  | 
| 1 | 
9 | 
1 | 
  | 
 
 
 |  
  |  | 
alekv - Colonel -
   |   |  | 4170 |  
   Doom Rate: 1.87 Posts quality: +950 | 
  Отправлено: 04.03.19 23:37:59 |  |  
 |  
Да не за что.
 Только уточню
  	  | Void Weaver пишет: | 	 		  | Фига се, не думал что очерёдность ф-ций определяет внутреннюю конструкцию иф\элс. О_О  | 	  
  	  | alekv пишет: | 	 		  | Т.е. логика такая что если в аноним функции есть прыжок, то она как бы эквивалентна function int myFunc () т.е. должна что-то вернуть обязательно либо 0 либо что-то еще.  | 	  
 и ты пишешь не внутри if\else.
 А вот если посмотреть на acs, там тот же принцип, просто мне кажется decorate совсем уг синтаксис.
 function int myFunc ()
 {
 return 0;
 }
 поскольку функция myFunc имеет тип int, то функция там где ее вызывают должна что-то вернуть. 
 пример 
 script "test" (void)
 {
 if (myFunc() == 0) 
       PrintBold(s:"test");
 }
 если функция myFunc() будет иметь возвращаемый тип(bool, int, str(хз может ли строку возвращать не помню)), а не void, то обязательно надо что-то возвращать. |  
  |  
  | 
| 1 | 
3 | 
1 | 
  | 
 
 
 |  
  |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 05.03.19 17:32:06 |  |  
 |  
Запись "####" и "#" (или #### и # для зскрипта) позволяет "копировать" кадр спрайта и его направление соответственно.
 Вопрос: есть ли какой-либо способ "копировать" также длительность (тики) кадра? |  
 |  
  | 
| 1 | 
9 | 
1 | 
  | 
 
 
 |  
  |  | 
JSO x - 2nd Lieutenant -
   |  | 1386 |  
   Doom Rate: 2.28 Posts quality: +758 | 
  Отправлено: 05.03.19 22:10:18 |  |  
 |  
Зачем тебе такое?..
 
 В Decorate -- невозможно, только через очередной колоссальный костыль выдачи после каждого подпункта стейта предмета количеством предыдущей строки и соответственной проверки. В смысле,
 
See:
    TROO A 4 A_Chase
    TROO A 0 A_GiveInventory( "TickItem", 4 )
    TROO B 4 A_Chase
    TROO B 0 A_GiveInventory( "TickItem", 4 )
    TROO C 4 A_Chase
    TROO C 0 A_GiveInventory( "TickItem", 4 )
    TROO D 4 A_Chase
    TROO D 0 A_GiveInventory( "TickItem", 4 )
    Loop
<...>
TickTest:
    TROO E 1 A_TakeInventory( "TickItem", 1 )
    TROO E 0 A_JumpIfInventory( "TickItem", 1, "TickTest" )
    TROO FGHI 5 // Если нужно несколько строк стейта, копируешь текущее количество TickItem в какой-нибудь TempTickItem и декрементируешь уже его; и так -- каждый подпункт.
    Goto See
 ...Но это атас. В ZScript особо другого способа нет, вариант -- проверять через InStateSequence название текущего пункта выполнения и в Tick() обрабатывать изменения. 
 
 Никогда с такой проблемой ни там, ни там не встречался, потому больше сказать не могу. |  
 |  
  | 
| 2 | 
8 | 
1 | 
  | 
 
 
 |  
  |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 05.03.19 22:24:32 |  |  
 |  
 	  | JSO x пишет: | 	 		  | Зачем тебе такое?..  | 	  Смотри, допустим есть имп с идл стэйтом:Actor Imp1 : DoomImp
{
   States
  {
  Idle:
  TROO AABBCCDD 5 //A_Look
  Loop
  }
}и есть барон с идл стэйтом:Actor Ba1 : BaronOfHell
{
  States
  {
  Idle:
  BOSS AABBCCDD 3 //A_Look
  Loop
  }
}
 
 Если им выдавать в течении некоторого времени такую штуку, то оба войдут в _Вандер с кадрами Idle, вот только у обоих скорость перемещения будет одинаково запредельная:Мне же нужно чтобы при получении подобного итма каждый моб двигался со скоростью аналогичной таковой своего стэйта. |  
 |  
  | 
| 1 | 
9 | 
1 | 
  | 
 
 
 |  
  |  | 
alekv - Colonel -
   |   |  | 4170 |  
   Doom Rate: 1.87 Posts quality: +950 | 
  Отправлено: 05.03.19 22:39:46 |  |  
 |  
Я не понимаю чего делает #### и не хочу понимать, но тики теоретически можно передавать, таким путем:
 
 
 В ACS прописываем переменную и 2 мини скрипта.. 
 
 Если надо копипастить тики в пределах 1 актера, то еще проще, надеюсь понятно как? |  
  |  
  | 
| 1 | 
3 | 
1 | 
  | 
 
 
 |  
  |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 05.03.19 22:54:42 |  |  
 |  
 	  | alekv пишет: | 	 		  | Я не понимаю чего делает #### и не хочу понимать | 	  вот поэтому ты предложил мне АЦС-вариант "шило на мыло". Спасибо конечно за алгоритм (он действительно понятный и возможно кому-нибудь пригодится), но с таким же успехом проще задать фиксированные индивидуальные значения тиков для каждого актора непосредственно в пикап стэйте, типа:Но я рассчитывал на более гибкую и универсальную конструкцию. |  
 Рейтинг сообщения:  +1, отметил(и):  alekv |  
  | 
| 1 | 
9 | 
1 | 
  | 
 
 
 |  
  |  | 
JSO x - 2nd Lieutenant -
   |  | 1386 |  
   Doom Rate: 2.28 Posts quality: +758 | 
  Отправлено: 05.03.19 23:15:50 |  |  
 |  
Придумал, как сделать. ZScript.
 
class DoomImp2: DoomImp replaces DoomImp {
    State oldState;
    override void Tick() {
        if ( self.CurState != oldState ) {
            if ( self.InStateSequence( CurState, ResolveState( "Pain" ) ) )
                A_SetTics( oldState.Tics );
            oldState = self.CurState;
        }
        Super.Tick();
    }
} |  
 Рейтинг сообщения:  +1, отметил(и):  alekv |  
  | 
| 2 | 
8 | 
1 | 
  | 
 
 
 |  
  |  | 
alekv - Colonel -
   |   |  | 4170 |  
   Doom Rate: 1.87 Posts quality: +950 | 
  Отправлено: 05.03.19 23:50:58 |  |  
 |  
 	  | Void Weaver пишет: | 	 		  вот поэтому ты предложил мне АЦС-вариант "шило на мыло". Спасибо конечно за алгоритм (он действительно понятный и возможно кому-нибудь пригодится), но с таким же успехом проще задать фиксированные индивидуальные значения тиков для каждого актора непосредственно в пикап стэйте, типа:
 Скрытый текст: 
 Но я рассчитывал на более гибкую и универсальную конструкцию. | 	  
 Ну значит зскрипт хороший выход.
 Хотя в том коде что ты написал теоретически можно писать так
 
 Я просто видимо не вижу проблемы т.к. не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз   |  
  |  
  | 
| 1 | 
3 | 
1 | 
  | 
 
 
 |  
  |  | 
Void Weaver = Captain =
   |  | 2496 |  
   Doom Rate: 1.82 Posts quality: +808 | 
  Отправлено: 06.03.19 00:14:08 |  |  
 |  
 	  | JSO x пишет: | 	 		  | Придумал, как сделать. ZScript. | 	  Сорри, ваще нифига не понял.
 Я случаем не упоминал раз стопицот в этом треде что все мои вопросы базируются на условии "декор онли" если не указано иное?  
 
 alekv снова выручаэ! ^_^ Далеко не то что надо, но отличная оптимизация вместо "спагетти". )
 
 Добавлено спустя 14 минут 47 секунд:
 
  	  | alekv пишет: | 	 		  | не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз | 	  Ну например дляActors spawned with A_SpawnItemEx can utilize SXF_TRANSFERSPRITEFRAME, allowing use of the two preserving names above for the first frame of the initializing actor. This only works with A_SpawnItemEx, and should not be attempted with anything else. Т. е. такими кадрами можно эмулировать блур эффект из _СпаунИтемЭкс.
 
 ЛИБО же для визуализации кадрами текущего стэйта актора принудительного вызова какой-либо А_Ф-ции извне (как в моём случае) или внутри самого актора.
 Например у актора (импа, барона) нет своего стэйта в котором бы вызывалась A_Wander, но оную можно принудительно вызвать из кастоминвентори, вот только без указания "####" "#" придётся либо довольствоваться невидимыми TNT1 либо визуализировать КАЖДЫЙ кадр для КАЖДОГО получателя:
 TROO AABBCCDD 5 A_Wander
 BOSS AABBCCDD 3 A_Wander
 <...>
 
 Кароч эти "####" "#" кадры весьма удобная штука. |  
 |  
  | 
| 1 | 
9 | 
1 | 
  | 
 
 
 |  
  |  | 
theleo_ua - Commissar -
   |  | 5258 |  
   Doom Rate: 1.79 Posts quality: +1194 | 
  Отправлено: 06.03.19 00:36:20 |  |  
 |  
 	  | alekv пишет: | 	 		  | Я просто видимо не вижу проблемы т.к. не понимаю как работает стейт ####.. ну понимаю что он копирует предыдущий стейт но что дальше хз и зачем это надо тоже хз  | 	  
 
 Это не стейт, а спрайт фрейм. Когда ты пишешь DEMN A 1, то в ваднике ищется файл DEMNA0.PNG. А теперь представь ситуацию, когда мне надо переопределить заморозку монстра таким образом, что я хочу убрать монстра которого заморозили, и на его месте заспавнить другого актора, которого я заморожу, и чтобы этот другой актор был с точно таким же спрайт фреймом, в котором был сам монстр в момент его заморозки
 
 Тогда спавн актора будет с такой командой:
 
 A_SpawnItemEx("замороженный" бла бла бла, SXF_TRANSFERSPRITEFRAME)
 
 а в коде актора "замороженный" первый спрайт фрейм будет #### #, и движок гздума заменит его на тот, который был у спавнера в момент выполнения A_SpawnItemEx
 
 Каким образом оно работает у Void Weaver, я не вникал в код, но думаю там какой-то похожий механизм, когда в момент самой игры, откуда-то возьмется спрайт фрейм и подставится вместо #### # |  
  |  
  | 
| 4 | 
1 | 
  | 
 
 
 |  
  |  | 
JSO x - 2nd Lieutenant -
   |  | 1386 |  
   Doom Rate: 2.28 Posts quality: +758 | 
  Отправлено: 06.03.19 11:09:28 |  |  
 |  
 	  | Void Weaver пишет: | 	 		  | Я случаем не упоминал раз стопицот в этом треде что все мои вопросы базируются на условии "декор онли" если не указано иное? | 	  
  	  | JSO x пишет: | 	 		  | В Decorate -- невозможно, только через очередной колоссальный костыль выдачи после каждого подпункта стейта предмета количеством предыдущей строки и соответственной проверки. | 	  
 Дополнение -- да, что в Decorate ныне можно свои переменные добавлять, забыл.
 
 В общем, всё упирается в извечный вопрос: "Тебе шашечки или ехать?". Нужен исключительно Decorate (совместимость со старыми версиями всё равно нарушена, так как в моём любимом ZDoom 2.8.1 anonymous-функции не поддерживаются. А тогда зачем Decorate использовать, кроме как для совместимости?) -- тогда используй вариант, предложенный alekv и первоначально мной, нужна универсальность -- обучайся ZScript, даром что рабочий код для тебя УЖЕ написан. |  
 |  
  | 
| 2 | 
8 | 
1 | 
  | 
 
 
 |  
  |  | 
alekv - Colonel -
   |   |  | 4170 |  
   Doom Rate: 1.87 Posts quality: +950 | 
  Отправлено: 06.03.19 11:27:03 |  |  
 |  
theleo_ua
 Void Weaver
 Спасибо, за разъяснения. 
 
  	  | Void Weaver пишет: | 	 		  | Далеко не то что надо, но отличная оптимизация вместо "спагетти". )  | 	  
 Жаль что с появлением зскрипта, забили на декорейт синтаксис, так бы оптимизация была гораздо круче.
 К примеру в декорейт поддерживает ENUM перечисления, но только цифры.. Строки не может, так же не понимает именованных enum да кучу всего, все это теперь в зскрипте, а он не понятный для простого юзера.
 
  	  | JSO x пишет: | 	 		  | обучайся ZScript, даром что рабочий код для тебя УЖЕ написан. | 	  
 Вот я бы лучше посоветовал забить болт на этот гздум и учить нормальные ЯП. А гздум пусть покоится с миром.
 Zscript уже не для мододелов, это язык программирования довольно сложный и плохо задокументированный, да еще и с хз каким синтаксисом. Если нужен зскрипт для создания модов, пора задуматься может пора менять движок, на ue или unity или cryengine и др., а не яп?
 Тот же сишарп юнити во многие разы проще и круче и возможности огромные, обучение на столько простое что словами не передать, инфы и уроков тьма.
 
 Полемика про достоверность Дума перенесена в http://i.iddqd.ru/viewtopic.php?p=107763#107763 BeeWen |  
 Рейтинг сообщения:  -1, отметил(и):  MyNameIs |  
  | 
| 1 | 
3 | 
1 | 
  | 
 
 
 |  
  |  | 
Doomgay1999 - Corporal -
   |  | 96 |  
  Doom Rate: 2 Posts quality: +1 | 
  Отправлено: 10.03.19 07:54:12 |  |  
 |  
| Можно как нибудь заменить текстуры в DOOM не трогая программы предназначение для этого? |  
 |  
  | 
 |  | 
ZZYZX - UAC Commissar -
   |   |  | 6284 |  
   Doom Rate: 1.65 Posts quality: +1633 | 
  Отправлено: 10.03.19 08:43:04 |  |  
 |  
 	  | alekv пишет: | 	 		  Вот я бы лучше посоветовал забить болт на этот гздум и учить нормальные ЯП. А гздум пусть покоится с миром. 
 Zscript уже не для мододелов, это язык программирования довольно сложный и плохо задокументированный, да еще и с хз каким синтаксисом. Если нужен зскрипт для создания модов, пора задуматься может пора менять движок, на ue или unity или cryengine и др., а не яп? 
 Тот же сишарп юнити во многие разы проще и круче и возможности огромные, обучение на столько простое что словами не передать, инфы и уроков тьма.  | 	  
 Тут ведь какая интересненькая особенность выходит — ты потратишь кучу времени на создание игры с нуля, а в неё в итоге будет играть столько же людей, сколько и в мод, то есть 5-20 за всё время   
 Так что тут скорее надо учитывать, насколько то что ты делаешь близко к думу, и сколько оригинального контента планируется слепить (причём код тоже в это входит).
 
 Вот тебе пример: чтобы перейти на Unity, необходимо начать с менюшек настройки игры и открытия уровня, самому реализовать перемещение по уровню и AI монстров, нарисовать оружие, руки игрока (причём вероятно в 3D, чтобы не выглядело как уг, раз уж на юньке), и только после этого можно будет приступить к непосредственно созданию игры. И начать придётся с того что ты нарисуешь модель игрока. Потому что в думе она уже есть, а тут вот какая незадача — нема. И мало нарисовать, важно ещё и АНИМИРОВАТЬ, и состыковать с видом из глаз. Или смириться с тем что зеркал в твоём уровне не будет %)
 Если бы в юньке существовало что-то в стиле "стартер пак для переходящих с маппинга к думоподобным играм", можно было бы ещё посмотреть.
 
 А так вполне уместно учить зскрипт. Только с оглядкой на то что это практически буквальный интерфейс к внутренностям движка, защитой от дурака часто не обременённый. |  
  |  
  | 
| 2 | 
2 | 
1 | 
  | 
 
 
 |  
  |  | 
Герр Смертоносец - Warrant Officer -
   |  | 1095 |  
   Doom Rate: 1.33 Posts quality: +990 | 
  Отправлено: 10.03.19 14:39:30 |  |  
 |  
 	  | ZZYZX пишет: | 	 		  | Если бы в юньке существовало что-то в стиле "стартер пак для переходящих с маппинга к думоподобным играм", можно было бы ещё посмотреть.  | 	  
 Это, не? |  
 |  
  | 
| 5 | 
  | 
 
 
 |  
  |  | 
ZZYZX - UAC Commissar -
   |   |  | 6284 |  
   Doom Rate: 1.65 Posts quality: +1633 | 
  Отправлено: 10.03.19 15:59:44 |  |  
 |  
| Это не совсем сравнимо с готовым игровым миром дума, мне кажется. В думе легко делать игру кусками, сначала маппишь с обычными текстурами или вообще дефолтными, потом подумал - дорисовал свои, а потом и монстру позаменял. Процесс вообще другой. |  
  |  
  | 
| 2 | 
2 | 
1 | 
  | 
 
 
 |  
  |  |