В Decorate -- исключительно тем же "A_Jump()", так как работы с типом строки там нет вовсе (если не добавили функции из ACS, и "StrParam()" в том числе):
TNT1 A 0 A_Jump( 256, 1, 2, 3, 4, 5, 6, 7 )
TNT1 A 0 A_Log( "$kl_bat1" )
Goto See
TNT1 A 0 A_Log( "$kl_bat2" )
Goto See
TNT1 A 0 A_Log( "$kl_bat3" )
Goto See
TNT1 A 0 A_Log( "$kl_bat4" )
Goto See
TNT1 A 0 A_Log( "$kl_bat5" )
Goto See
TNT1 A 0 A_Log( "$kl_bat6" )
Goto See
TNT1 A 0 A_Log( "$kl_bat7" )
Goto See
В ZScript можно сильно проще:
TNT1 A 0 A_Log( StringTable.Localize( "$kl_bat" .. Random( 1, 7 ) ) );
// Или:
TNT1 A 0 A_Log( StringTable.Localize( String.format( "$kl_bat%i", Random( 1, 7 ) ) ) );
// Кстати, не уверен, нужно ли в логировании вручную локализовать текст. Возможно, и без него всё прекрасно будет выводиться.
Ну это крайне ситуативно. Как правило это одна из Category:Decorate Weapon attack functions, хотя тот же популярный A_Explode к таковым не относится но при этом ооочень часто используется в разном оружии, включая рукопашное.
В более специфических случаях могут использоваться даже функции монстро-атак типа A_DamageTracer.
И кстати функция атаки может находиться в оружии и ВНЕ стэйта '(Alt)Fire'. Вот если поставить атакующую ф-цию в любой другой стэйт (включая кастомный, т. е. придуманный моддером), например в 'Reload' то атака может быть выполнена во время выполнения перезарядки.
Если речь идёт только о разнице визуализации и отчасти разницы в функциях то для этого можно использовать:
а) соответствующие стэйты пуффа с разной анимацией:
Spawn - используется по умолчанию при попадании в любой объект (не отображается на живых акторах) если не указаны иные стэйты.
Melee - используется по умолчанию из мили-функций (только для оружия), не отображается на живых акторах.
Crash - используется по умолчанию при попадании в любой НЕ кровоточащий объект.
XDeath - используется по умолчанию при попадании в любой кровоточащий объект, НЕ отображается на живых акторах.
Наличие PUFFONACTORS или ALWAYSPUFF также влияет на отображение пуффов.
б) чек на соответствие поинтеров HITTRACER + A_JumpIf(IsPointerEqual(AAPTR_TRACER,AAPTR_NULL),"джамп")
в) можно попробовать прописать в оружие (НЕ для монстров) чек A_JumpIf(GetDistance(1,AAPTR_PLAYER_GETTARGET)>0,"джамп_на_файрбуллетс_пуфф1"), иначе файрбуллетс_пуфф2. К сожалению этот способ работает ТОЛЬКО на дистанции не более 1054.54
1. ??? А разве после интермиссии игра виснет или заканчивается? И так же происходит переход на новый уровень. о_0
Могу лишь предположить что если те нужны конкретные переходы на конкретные мапы после кастомных интермиссий то попробуй Intermission script.
Почему большие и скайленные внутри GZDoomBuilder текстуры на соседних полигонах - НЕ СТЫКУЮТСЯ между собой:
(визуально будто имеют разный масштаб, хотя и размер!, и скейлинг! у них один и тот же)
Скрытый текст:
Я имею 4 отдельных текстуры (размером 640x640 пикселей каждая), и соответственно 4 больших квадрата на которые они наложены (каждый размером 32000x32000 мап юнитов)
Чтобы текстура натянулась на ВЕСЬ полигон (без повторений), ее нужно повторить 32000/640 = 50 раз.
Что соответствует коэффициенту 0.02 (потому что 1/50 = 0.02)
Казалось бы, какие тут могут быть сложности?
Однако на практике на стыке заметно явное несоответствие масштабов прилегающих соседних текстур,
хотя все они имеют одинаковый коэффициент! (scale_x=0.02, scale_y=0.02)
Все четыре полигона имеют такие установки этих коэффициентов.
И дело не в оффсетах, я проверял. Не стыкуется именно из-за разного масштаба. (разный размер текселей у соседствующих текстур)
Скрытый текст:
Чтобы окончательно убедить вас, что проблема НЕ в самих текстурах, выкладываю и их тоже:
(блок 2x2 из четырех соседствующих текстур)
Как видно, в Фотошопе всё идеально прилегает друг к другу.
Скрытый текст:
P.S. Вот уж где-где, а на таком ровном месте, не ожидал огрести проблем...
Что-ж, решил вопрос по интермиссии (см. страница - 207) при помощи кластеров, но теперь не могу выяснить.
В чём отличие entertext от exittext ?
Пытаюсь сделать чтобы после окончания уровня была интермиссия и во время начала уровня ещё одна
Думал что - entertext, это вывод при начале уровня, а - exittext, это вывод в конце уровня, но это так не работает
ЕЯПП, то во-первых, (enter\exit)text - это исключительно фича для кластеров а не просто для уровней. Т. е. для блоков уровней начинающихся с собственно "cluster" кейворда.
Далее, если следовать определениям вики получается что:
entertext = "<message>" Это текст который выводится когда игрок входит на уровень нового кластера, завершив уровень предыдущего.
exittext = "<message>" Это текст который выводится когда игрок завершает уровень текущего кластера. Если кластер следующего (грядущего) уровня имеет прописанный entertext, то оный будет выведен вместо exittext.
Пытаюсь сделать чтобы после окончания уровня была интермиссия и во время начала уровня ещё одна
Попробую дать идею:
Сделай интермиссию как уровень, т.е., например, заканчивается уровень скажем 12 - переходим в уровень скажем 112 (интермиссия) в котором рассказывается как и что (немного потребуется скриптинга), после чего переходим в уровень 13 (ну или снова в некую интрмиссию). Так сделано у меня...
Осмелюсь не согласиться - учитывая насколько ты уже глубоко вник в процесс программинга в GZDOOM, странно что ты не учитываешь насколько больше возможностей дает то, что я предложил по сравнению с просто кластер дефинитион.
Во-первых, ты явно заблуждаешься об уровне моих моддинг-скиллов. Я по-прежнему имею весьма поверхностные представления о блоках связанных с маппингом и мап-скриптингом, таких как MAPINFO, и поэтому не могу по достоинству оценить потенциал возможностей твоего метода относительно интермиссий.
Во-вторых, я и не оспаривал технической разницы между способами воспроизведения интермиссий, а лишь подчеркнул что по-сути это костыль к вполне доступному способу записи интермиссий из кластеров.
П. С.
Кстати ты ошибся авторством оригинальной цитаты, похоже у тебя механизм цитирования глюкнул.
2. Можно пример или описание текущей аптечки под модификацию? Если аптечка допускается быть кастом инвентори, то самый простой способ поставить чек на хп игрока при подборе, типа:
{
Pickup:
TNT1 A 0 A_JumpIfHealthLower(GetSpawnHealth,1)
Stop
TNT1 A 0 //Экшн аптечки
Stop
}
}
Для обычной же аптечки максимум определяется свойством Inventory.MaxAmount и по умолчанию и так не берётся при хп > 100. Ну и офк удостовериться что у конкретной НЕ кастоминвентори аптечки отсутствует флаг +INVENTORY.ALWAYSPICKUP. //Ага.
Идея следующая: во время перезарядки игрок может отбиваться от монстров ногами.
Попытка реализовать следующая: в блоке файр есть проверка на релоадтокен, который выдаётся в инвентарь в начале перезарядки и забирается в конце, если он есть, перекидывается на релоадатак, где игрок бьёт ногой, в конце анимации перекидывается опять на релоад(т.е. перезарядка начинается с начала).
Проблема в том, что анимация перезарядки не прерываемая и атака ногой не происходит.
Вопроса 2:
1) Как сделать так, чтобы анимация релоад прерывалась и игрок бил ногой
2) Как сделать так, чтобы после атаки ногой перекидывало не в начало перезарядки а на место прерывания(т.е. использовать "что-то" вместо goto reload)
Если что, вот файл: https://yadi.sk/d/-utw7s0MQnsPxA