Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые! Пред.  1, 2, 3 ... 195, 196, 197
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!Ответить
АвторСообщение
Xtor
- Lance Corporal -
Next rank: = Lance Corporal = after 14 points
146

Doom Rate: 1.95

Posts quality: +16
Ссылка на пост №3921 Отправлено: 03.05.19 20:18:04
Доброго времени суток, уважаемые Думеры.
Собственно, возник такой вопрос, который давно не даёт покоя. По части кода в Decorate.
Имею в своём распоряжении GZDoom 4.1.0.
Есть у меня три класса.
Скрытый текст:


Все они базируются на оригинальном классе Думгая - ничем, кроме mugshot и скина не отличаются. Стилистика под классику.
Есть немного модифицированный пистолет из Ванили в виде отдельного Actor.
Вопрос - можно ли к каждому отдельному классу, которые будут использовать одни и те же подбираемые оружия, привязать собственные спрайты как ниже? Конечно, отличие будет состоять исключительно в графике рук.
Скрытый текст:


Что на Discord канале ZDoom, что на QCDE (Quake Champions: Doom Edition) мне советовали создать Actor типа CustomInventory, который должен выдаваться конкретному классу "Player.StartItem<>", который и будет определять проверку спрайтов. Не помогло. В коде не силён, но ошибок мой код не вызывал.
Скрытый текст:






Благодарю за внимание.
P.S. Прошу прощения, если задал вопрос в неподходящем разделе.
MyNameIs
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 148 points
1492

Doom Rate: 1.94

Posts quality: +558
Ссылка на пост №3922 Отправлено: 03.05.19 21:08:08
Xtor
мб проблема в goto в обычный селект и +1? попробуй следать goto в селектТР
или без этой +1 на конце, а то вроде декорейт странно работает на первом фрейме
Скрытый текст:

а зачем так вообще? будет фича смены класса игрока по ходу игры?



а вообще да, мне кажется, сюда бы вопрос больше подошел

Рейтинг сообщения: +1, отметил(и): Void Weaver
1 1
Void Weaver
- 1st Lieutenant -
Next rank: = 1st Lieutenant = after 176 points
1664

Doom Rate: 1.83

Posts quality: +492
Ссылка на пост №3923 Отправлено: 03.05.19 21:15:04
Xtor
Если не особо шаришь в структуре стэйтовджампов, то лучше действительно начать с тупо выдачи 3 разных пистолей, а не мутить 1 но с разными спрайтами под каждого игрока, для тебя это будет та ещё морока.

Ну и коль тебе так приспичило рескинить пистоль под каждый класс, то можно использовать следующий вариант:
Скрытый текст:

Лучше юзать просто инвентори-итем (ака токен), типа такого:

Actor SwitchCheckerSL : Inventory
{
Inventory.Amount 1 //Число сколько выдаётся данного предмета за раз
Inventory.MaxAmount 3 //Максимально возможное число данного итема для трёх классов и, соответственно, для трёх спрайтов пистоля
}

Далее, каждому классу игрока на старте надо выдавать разное ко-во данного итема, например DoomSlayer - 1, DoomCyborg - 2, DoomMarine - 3 (остальные имена от балды, хз как их звать).

Ну и наконец, в самом пистоле в стэйте "Select" надо прописать 3 разные проверки типа:

Select: //Именно в порядке убывания ко-ва итемов!
TNT1 A 0 A_JumpIfInventory("SwitchCheckerSL",3,"SelectMarine")
TNT1 A 0 A_JumpIfInventory("SwitchCheckerSL",2,"SelectCyborg")
TNT1 A 0 A_JumpIfInventory("SwitchCheckerSL",1,"SelectSlayer")
//Стэйт можно вообще не закрывать
//А далее ставим 3 соответствующих кастомных Select-стэйта:

SelectMarine:
СПРАЙТЫ_ПИСТОЛЯ_МАРИНА A 1 A_Raise
Loop
SelectCyborg:
СПРАЙТЫ_ПИСТОЛЯ_КИБОРГА A 1 A_Raise
Loop
SelectSlayer:
СПРАЙТЫ_ПИСТОЛЯ_СЛЭЙЕРА A 1 A_Raise
Loop

Ready: //Снова клепаем общий стэйт проверки классов, но теперь уже для Рэди стэйта
TNT1 A 0 A_JumpIfInventory("SwitchCheckerSL",3,"ReadyMarine")
TNT1 A 0 A_JumpIfInventory("SwitchCheckerSL",2,"ReadyCyborg")
TNT1 A 0 A_JumpIfInventory("SwitchCheckerSL",1,"ReadySlayer")
//Аналогично ставим 3 соответствующих кастомных Ready-стэйтов:

ReadyMarine:
СПРАЙТЫ_ПИСТОЛЯ_МАРИНА A 1 A_WeaponReady
Loop
ReadyCyborg:
СПРАЙТЫ_ПИСТОЛЯ_КИБОРГА A 1 A_WeaponReady
Loop
ReadySlayer:
СПРАЙТЫ_ПИСТОЛЯ_СЛЭЙЕРА A 1 A_WeaponReady
Loop

Аналогично с Fire стэйтом (и всеми другими, включая Deselect), но там надо учитывать в какой стэйт будет возвращаться оружие после выстрела (A_ReFire).
Надеюсь схема понятна, и теперь ты видишь что не всё так просто как могло показаться, да и как правильно заметил MyNameIs в твоём случае просто нет такой необходимости.
Зато будет полезная практика если доделаешь. :)



Добавлено спустя 1 день 18 часов 50 секунд:
//==========================//
1. Я правильно понимаю что из анон ф-ции невозможно прописать такие джампы как A_CheckLOF, A_CheckFlag, A_JumpIfHealthLower(по поинтеру кроме DEFAULT), A_JumpIfTargetInLOS, A_CheckSpecies, A_Warp, A_Teleport и другие?
-----------------------
2. Этот вопрос отпадает если по всем ф-циям первого вопроса ответ утвердительный. Можно ли внутри анон ф-ции записать инкрементальный цикл с джампом из него, например цикл увеличивающий на 1 значение угла в A_CheckLOF и завершающийся джампом по достижению значения угла в 360?
Иными словами, можно ли упаковать такое:
Скрытый текст:

TNT1 A 0 A_SetUserVar("user_CLOFangle",0) //setting of uservar initial value
CLOFCircleA:
TNT1 A 0 A_CheckLOF("ChargeEND",CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|CLOFF_JUMPOBJECT|CLOFF_JUMPNONHOSTILE|CLOFF_MUSTBESOLID|CLOFF_JUMP_ON_MISS|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL,Radius+25,0,user_CLOFangle,0,20,0,AAPTR_DEFAULT,0) //uservar assignment to CheckLOF angle
TNT1 A 0 A_SetUserVar("user_CLOFangle",user_CLOFangle+1) //1 degree uservar increasement
TNT1 A 0 A_JumpIf(user_CLOFangle==360,"StepB") //360 degrees uservar check, then jumping out of loop
Goto CLOFCircleA

внутрь анонки?
-----------------------
3. Имеется 7 разных токен-итемов:
Actor A : Inventory {Inventory.MaxAmount 1}
Actor B
Actor C
Actor D
Actor E
Actor F
Actor G
Необходимо получить все возможные джампы по соответствующим комбинациям всех токенов исключая повторы, т. е. чтобы при наличии A+B+C+D+E+F+G был один джамп, совсем другой при A+B+C+D+E, третий - при наличии F+G+B+C, и так все возможные комбинации. Очевидно что A_JumpIfInventory тут совершенно не уместна и необходимо юзать анонку вида If(CountInv("A")==1||CountInv("B")==1||...).
Собс-но вопросы к шарящим в матике и оптимизации:
1) Можно ли записать эти чеки как-то ещё более ёмко\рационально?
2) Сколько вообще получится комбинаций и как это всё записывать чтобы ни глаза не вытекли ни мозг не лопнул? От больших к меньшим полагаю, или не?
-----------------------
4. Кто-нибудь знает специфику гибридных акторов (монстр-миссиль например)? Или это можно только выяснить кропотливыми экспериментами и дотошным лурчанием по форумам?
Скриптов не предлагать.

Рейтинг сообщения: +2, отметил(и): theleo_ua, MyNameIs
1 7 1
N00b2015
= Sergeant =
Next rank: - Master Sergeant - after 32 points
368

Doom Rate: 2.29

Posts quality: +99
Ссылка на пост №3924 Отправлено: 05.05.19 20:35:07
Void Weaver
1, (2?). Wiki пишет, что

It is possible to use an A_Jump-type function inside the condition part of the if statement. The jump will not happen, but if it would have, the condition is considered as true.

То есть, можно написать
TNT1 A 0 {
  if (A_CheckLOF("ChargeEND",CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|blah-blah-blah...,AAPTR_DEFAULT,0)) {
    return state("ChargeEND"); //описано чуть выше на той же странице
  }
  return state("");
}

Если что, я не тестил.
3. 2^7 = 128 комбинаций (каждого актора может быть либо ноль, либо один). Можно сделать
Actor M: Inventory {Inventory.MaxAmount 127} //0, 1, 2, ..., 127 --- 128 чисел 

и потом загонять комбинации в двоичную запись (например, A будет соответствовать 64, B --- 32, C --- 16... G --- 1) и проверять CountInv на точное равенство (ещё лучше попробовать switch/case, он должен работать в decorate):
switch(CountInv("M")) {
  case 0: //пусто
    return state("State0");
    break;
  case 1: //G
    return state("State1");
    break;
  ...
  case 127: //ABCDEFG
    return state("State127");
    break;
}

Только после этого нужно аккуратно работать с выдачей и отбором предметов.
Как записывать, чтобы глаза не вытекли? Чёрт его знает. А ты точно уверен, что тебе нужны эти 128 вариантов, и разбор каждого из них будет существенно отличаться от другого?
Ещё, как вариант, можно сделать
TNT1 A 0 A_Jump(256,1 + CountInv("M"))
TNT1 A 0 A_Jump(256, "State0")
TNT1 A 0 A_Jump(256, "State1")
...
TNT1 A 0 A_Jump(256, "State127")

Но все эти методы индусские. Нужны детали, в том числе информация о том, для какой цели эти джампы будут использоваться.
4. Акторы, у которых одновременно стоят Monster и Projectile/+MISSILE, что ли? Вряд ли кто-то прописывал в движке специальный разбор таких случаев (если вообще такой актор может быть создан). Здесь, кажется, вариантов действительно немного, могу только предложить в особенно запутанных случаях смотреть код gzdoom (по той же ссылке есть zscript-исходники из gzdoom.pk3, куда очень много логики перенесено, но их не предлагаю :oops: ).

Рейтинг сообщения: +2, отметил(и): JSO x, Void Weaver
1 1
Void Weaver
- 1st Lieutenant -
Next rank: = 1st Lieutenant = after 176 points
1664

Doom Rate: 1.83

Posts quality: +492
Ссылка на пост №3925 Отправлено: 05.05.19 21:18:14
N00b2015 пишет:
То есть, можно написать
О! То есть получается что в условие можно замхать вообще что угодно и просто возвращать стэйт джампа? Круууть. )

N00b2015 пишет:
А ты точно уверен, что тебе нужны эти 128 вариантов, и разбор каждого из них будет существенно отличаться от другого?
Собс-но это одна большая заготовка, шаблон "на все случаи"; я вот только не понял откуда столько вариантов?! Чё-т шибко дофига получается, тем более что в счёт идут только тру-комбинации.

N00b2015 пишет:
ещё лучше попробовать switch/case, он должен работать в decorate
А можно мануальчик по этой конструкции? Краем глаза где-то видел но хз где.

N00b2015 пишет:
Ещё, как вариант, можно сделать
Не понял... вообще. o_0
Ну как бы в думе имеется 7 подбираемых волын и надо обеспечить джампы в зависимости от возможных наличествующих пушек. Т. е. если есть пистоль то джамп на "А", если же компанию пистолю составляет РЛаунчер то джамп на "Д", ну и так все возможные комбинации.

4. Ну да, именно такие комбинации и схожие. На удивление используется не так уж редко (лично юзал), при этом открывает доступ к весьма интересному поведению. Ок, будем искать моар.
1 7 1
N00b2015
= Sergeant =
Next rank: - Master Sergeant - after 32 points
368

Doom Rate: 2.29

Posts quality: +99
Ссылка на пост №3926 Отправлено: 05.05.19 22:28:18
Void Weaver
Там MaxAmount должен быть 127, если что. Подправлю сейчас.
Void Weaver пишет:
в условие можно замхать вообще что угодно

Ну, не совсем что угодно, но функции, подобные A_Jump, возвращают булево значение в зависимости от того, произошёл бы переход или нет.
Void Weaver пишет:
откуда столько вариантов?!

Ну так если смотреть со стороны, то пистолета может быть, а может не быть --- две возможности; дробовика может быть, а может и нет; ... BFG также может иметься, а может и отсутствовать. Причём эти наличия/отсутствия независимые друг от друга.
Можно для наглядности просто в строчку записать 7 нулей/единиц, например, так: "1010110" --- есть пистолет, ssg, rl, плазма. Эта двоичная запись соответствует десятичному числу 64 + 16 + 4 + 2 = 86. Вот в стейте State86 можно и разобрать этот случай.
Что такое "тру-комбинации"?.. Не понимаю.
Void Weaver пишет:
мануальчик по этой конструкции

Ну так я в предыдущем посте как раз написал пример. Switch/case --- узкоспециализированная конструкция, созданная ровно для подобного разбора случаев. Синтаксис аналогичен C/C++, все детали гуглятся одним кликом.
Void Weaver пишет:
Не понял... вообще

В первой строчке я считаю, сколько у меня акторов типа M в инвентаре, и считаю offset, на который нужно сделать первый прыжок (прибавляя 1, поскольку иначе при CountInv == 0 произойдёт рекурсия, которая не входит в наши планы). Следующие 128 строчек (их можно сгенерировать чем угодно, не вручную же писать) --- это собственно джампы.
Void Weaver пишет:
надо обеспечить джампы в зависимости от возможных наличествующих пушек

Может быть, для твоей цели достаточно не разбирать каждую комбинацию отдельно? Иначе я не понимаю, что тут дальше оптимизировать :?

Рейтинг сообщения: +2, отметил(и): JSO x, Void Weaver
1 1
Void Weaver
- 1st Lieutenant -
Next rank: = 1st Lieutenant = after 176 points
1664

Doom Rate: 1.83

Posts quality: +492
Ссылка на пост №3927 Отправлено: 06.05.19 02:58:20
N00b2015 пишет:
Ну так если смотреть со стороны, то пистолета может быть, а может не быть --- две возможности; дробовика может быть, а может и нет; ... BFG также может иметься, а может и отсутствовать. Причём эти наличия/отсутствия независимые друг от друга.
N00b2015 пишет:
Что такое "тру-комбинации"?.. Не понимаю.
Это когда общая проверка JumpIf(CountInv("SSGmark")==1 && CountInv("RLmark")==1 && CountInv("BFGmark")==1) возвращает "TRUE" и так для всех 7 пушек, а всеми теми вариантами когда возвращается "FALSE" можно пренебречь, ибо после них будет один и тот же Goto, а вот каждый "тру" должен прыгать в уникальный стэйт.

N00b2015 пишет:
В первой строчке я считаю, сколько у меня акторов типа M в инвентаре, и считаю offset, на который нужно сделать первый прыжок
Да не, структура понятна, не понятна суть... Зачем мне счётчик джампов? о_0

N00b2015 пишет:
Может быть, для твоей цели достаточно не разбирать каждую комбинацию отдельно? Иначе я не понимаю, что тут дальше оптимизировать :?
В общем же суть в том чтобы монстр менял пул доступных ему атак в зависимости от пула же подобранного оружия, идею чего я уже описывал в соотв. теме форума. Я хз что тут можно оптимизировать, но проверка выходит очень громоздкая, вот и интересуюсь какой вид записи будет наиболее оптимален.
1 7 1
N00b2015
= Sergeant =
Next rank: - Master Sergeant - after 32 points
368

Doom Rate: 2.29

Posts quality: +99
Ссылка на пост №3928 Отправлено: 12.05.19 14:21:58
1. Можно ли средствами GZDoom сделать "бесконечный океан" с использованием Line_Horizon и прозрачного 3d-пола, чтобы в него мог погружаться игрок? Может, есть вады с примерами? Увеличение размера карты мне не подойдёт.
Туда же: как сделать равномерное течение 3d-пола, уносящее актора, его касающегося, но не обязательно стоящего на дне?
2. Можно ли с текущим GZDoom получить более-менее адекватное "интерполяционное" движение актора (камеры) через секторные порталы с помощью InterpolationPoint? Интересно послушать и про линии, но менее важно. Сейчас пробую сделать вершинами интерполяции соответствующие точки на порталах (пересечение траектории с плоскостью портала), а между ними установить бесконечную скорость, но это, естественно, влияет на сплайны (вектор скорости-то считается без учета порталов), и картинка дёргается.
Если есть возможность обойти ограничения движка, скажите.
1 1
Void Weaver
- 1st Lieutenant -
Next rank: = 1st Lieutenant = after 176 points
1664

Doom Rate: 1.83

Posts quality: +492
Ссылка на пост №3929 Отправлено: 12.05.19 15:49:05
1. "Бесконечный" это такой в секторе которого можно вечно плыть в одну сторону без остановки и преткновений в блоклайн мапы? Если это именно оно, то мб попробовать "зациклить" Sector_Set3dFloor телепортлайном или аналогичным экшеном? Правда если это реально, то надо будет как-то считать ко-во совершённых телепортов в одну сторону, чтобы для реалистичности совершить столько же проходов при движении в обратную.
Не уверен, но тут похоже тред с аналогичным вопросом.
1 7 1
Xtor
- Lance Corporal -
Next rank: = Lance Corporal = after 14 points
146

Doom Rate: 1.95

Posts quality: +16
Ссылка на пост №3930 Отправлено: 13.05.19 09:20:16
И вновь доброго времени суток, уважаемые Думеры.
Благодарю всех тех, кто откликнулся на мою проблему, кто предложил свои варианты разрешения вопроса - я чрезвычайно вам благодарен :)
Я внимательно (в пределах своих возможностей и DECORATE-планирования) изучал предложения MyNameIs и Void Weaver. Именно второе решение мне позволило стремительно продвинуться в моей задумке и как минимум воплотить самый минимум задуманного.
Оружие осталось прежним, спрайты переключаются.
Но, к несчастью для меня, появились новые проблемы:
1) звуки бензопилы теперь работают некорректно (нет даже жужжания во время простоя в инвентаре);
2) почему-то при поднятии обычного рюкзака на HUD панели сразу пропадает и лицо класса игрока, и шкала для бензопилы, которую я сделал отдельно по типy "interpolate verical scale".
Эти два огреха появились после того, как я решил перенести все свои подключаемые отдельные *.wad, *.pk3 файлы в единый *.pk3 файл. Не уверен, вызвано ли это тем, что теперь ZScript и Decorate временно соседствуют бок о бок. В дальнейшем я планирую переписать всё на ZScript.
И если с первым у меня ещё есть идеи, как быть, то со вторым я подошёл в тупик.
Я начал изучать проблему в поисках причины - смотрел свой код по всем файлам внутри архива, особенно SBARINFO (как ни странно, если его на время убрать, возвращается старая безглючная информационная панель).
Может ли кто помочь мне разобраться с данными симптомами? Или хотя бы примерно направить, куда стоит копнуть. Благодарю за внимание.
UPD1: прошу прощения, что потревожил, но проблема с исчезающим лицом на HUD решилась следующим образом:
в файле SBARINFO на 43 строке кода я заменил отображение панели с топливом бензопилы на следующее содержание:
Скрытый текст:

inInventory SawFuelBar //Chainsaw ammo panel
                {
		inInventory ChainsawFixed { drawBar "STSAWFL" , "STSAWAM" , SawFuel , vertical , interpolate(1), 37 , 224; }
		isSelected ChainsawFixed { drawImage "STSAWAM" , 37 , 224; }
		}

Страница 197 из 197Перейти наверх Пред.  1, 2, 3 ... 195, 196, 197
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!