Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Тема для новичков. Вопросы по маппингу/моддингу - любые! Пред.  1, 2, 3 ... 176, 177, 178 ... 198, 199, 200  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!Ответить
АвторСообщение
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +775
Ссылка на пост №3521 Отправлено: 20.09.18 02:59:59
Anto96WS
Хех, как раз этот вопрос мы мурыжили со Смертоносцем несколько страниц назад.
Вот этот имп будет бегать за любыми ближайшими, видимыми в радиусе 512, дум аптечками, с их последующим уничтожением:
Скрытый текст:

Actor DImp : DoomImp
{
+LOOKALLAROUND

var float user_CLOFangle;

States
{
See:
TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT,AAPTR_DEFAULT,AAPTR_NULL)
TNT1 A 0 A_CheckProximity("ItemChase","Health",512.0,1,CPXF_CHECKSIGHT|CPXF_ANCESTOR|CPXF_SETTRACER|CPXF_CLOSEST)
TROO ABCD 3 A_Chase
Loop

ItemChase:
StepA:
TROO A 0 A_JumpIfTracerCloser(Radius+10,"Remove")
TROO A 0 A_FaceTracer
TROO A 2 A_Recoil(-3)
TROO A 0 A_SetUserVarFloat("user_CLOFangle",0.0)
CLOFCircleA:
TNT1 A 0 A_CheckLOF("PathBlock",CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|CLOFF_JUMPOBJECT|CLOFF_JUMPNONHOSTILE|CLOFF_MUSTBESOLID|CLOFF_JUMP_ON_MISS|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL,Radius+25,0,user_CLOFangle,0,Height,0,AAPTR_TRACER)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",user_CLOFangle+0.5)
TNT1 A 0 A_JumpIf(user_CLOFangle==360.0,"StepB")
Loop

StepB:
TROO B 0 A_JumpIfTracerCloser(Radius+10,"Remove")
TROO B 0 A_FaceTracer
TROO B 2 A_Recoil(-3)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",0.0)
CLOFCircleB:
TNT1 A 0 A_CheckLOF("PathBlock",CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|CLOFF_JUMPOBJECT|CLOFF_JUMPNONHOSTILE|CLOFF_MUSTBESOLID|CLOFF_JUMP_ON_MISS|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL,Radius+25,0,user_CLOFangle,0,Height,0,AAPTR_TRACER)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",user_CLOFangle+0.5)
TNT1 A 0 A_JumpIf(user_CLOFangle==360.0,"StepC")
Loop

StepC:
TROO C 0 A_JumpIfTracerCloser(Radius+10,"Remove")
TROO C 0 A_FaceTracer
TROO C 2 A_Recoil(-3)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",0.0)
CLOFCircleC:
TNT1 A 0 A_CheckLOF("PathBlock",CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|CLOFF_JUMPOBJECT|CLOFF_JUMPNONHOSTILE|CLOFF_MUSTBESOLID|CLOFF_JUMP_ON_MISS|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL,Radius+25,0,user_CLOFangle,0,Height,0,AAPTR_TRACER)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",user_CLOFangle+0.5)
TNT1 A 0 A_JumpIf(user_CLOFangle==360.0,"StepD")
Loop

StepD:
TROO D 0 A_JumpIfTracerCloser(Radius+10,"Remove")
TROO D 0 A_FaceTracer
TROO D 2 A_Recoil(-3)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",0.0)
CLOFCircleD:
TNT1 A 0 A_CheckLOF("PathBlock",CLOFF_JUMPENEMY|CLOFF_JUMPFRIEND|CLOFF_JUMPOBJECT|CLOFF_JUMPNONHOSTILE|CLOFF_MUSTBESOLID|CLOFF_JUMP_ON_MISS|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL,Radius+25,0,user_CLOFangle,0,Height,0,AAPTR_TRACER)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",user_CLOFangle+0.5)
TNT1 A 0 A_JumpIf(user_CLOFangle==360.0,"StepA")
Loop

PathBlock: //Пробует обойти препятствие
TROO ABCD 3 A_Wander
Goto Charge

Remove:
TNT1 A 0 A_RemoveTracer(RMVF_MISC)
Goto See


----------------------------
Герр Смертоносец
Ахвотоночо... а я-то надеялся получать четвертинки хп и дамага, облом. :/
А зачем тогда существует возможность конвертации чисел? Или эта фича онли для ацс\зскрипта?

А есть какие соображения по поводу пунктов 1 и 2.1 из этого поста? Особенно интересует 2.1.

Рейтинг сообщения: +1, отметил(и): JSO x
1 9 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3522 Отправлено: 20.09.18 15:34:59
Void Weaver:
А зачем тогда существует возможность конвертации чисел? Или эта фича онли для ацс\зскрипта?

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

Void Weaver:
А есть какие соображения по поводу пунктов 1 и 2.1 из этого поста? Особенно интересует 2.1.

Насколько я понял, функция извлекает точный дамаг снаряда с учётом УЖЕ наложенного на него рандома.
Т.е. в думе на уровне движка есть рандомизация урона. Предположительно, этот урон считается не в момент удара снаряда об жертву, а в момент испускания снаряда. Т.е. APROP_Damage это ГОСТ, по которому были изготовлены снаряды, но на самом деле часть из них изначально бракованные.

Точный нанесённый дамаг (с точки зрения жертвы) таким способом узнать нельзя, ибо на жертве может быть какая-то броня, кастомные DamageFactor-ы и хрен знает какие модификаторы. Можно лишь узнать, насколько наш снаряд бракованный.

Если же ты хочешь сделать снаряд, который тырит здоровье в точности по полученному жертвой урону (я хреново следил за темой, но вроде о чём-то таком речь шла), то надо идти вообще другим путём и стрелять снарядом вообще без базового дамага, жертву же определять по HITTRACER. А в момент попадания проделать алгоритм:
1.  X = "текущее здоровье жертвы"
2.  (Дамагнуть жертву нужным DamageType на нужное либо слегка рандомное количество хеллсов.)
3.  X = X -"текущее здоровье жертвы"

Сделать это можно и в зскрипте, и в ACS. В декорейте гипотетически тоже можно - важно лишь, чтобы между событиями не было временных интервалов вообще.

В этом случае нам плевать на рандомы и модификаторы, нам вообще на всё плевать, работаем непосредственно со здоровьем "до" и "после".

Рейтинг сообщения: +2, отметил(и): JSO x, Void Weaver
2
Landsberg
= UAC Gunner =
Next rank: - Corporal - after 18 points
62

Doom Rate: 2

Posts quality: +6
Ссылка на пост №3523 Отправлено: 20.09.18 16:25:47
Здравствуйте
Как сделать так, чтобы тайтлпэйдж меняли друг друга
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +775
Ссылка на пост №3524 Отправлено: 20.09.18 17:37:47
Герр Смертоносец:
Т.е. в думе на уровне движка есть рандомизация урона. Предположительно, этот урон считается не в момент удара снаряда об жертву, а в момент испускания снаряда. Т.е. APROP_Damage это ГОСТ, по которому были изготовлены снаряды, но на самом деле часть из них изначально бракованные.

Точный нанесённый дамаг (с точки зрения жертвы) таким способом узнать нельзя, ибо на жертве может быть какая-то броня, кастомные DamageFactor-ы и хрен знает какие модификаторы. Можно лишь узнать, насколько наш снаряд бракованный.
ВТФ из "бракованный урон"? Бтв, может я снова неправильно тебя понял но урон считается явно НЕ в момент выстрела снаряда, ибо тогда не было бы подобных коллизий типа "свампирил больше чем покоцал". Собс-но маслина с Damage (random(x,y)*z) может покоцать на 10 и одновременно похилить на 20 за один кадр нулевой длительности.

Герр Смертоносец:
Если же ты хочешь сделать снаряд, который тырит здоровье в точности по полученному жертвой урону (я хреново следил за темой, но вроде о чём-то таком речь шла), то надо идти вообще другим путём и стрелять снарядом вообще без базового дамага, жертву же определять по HITTRACER. А в момент попадания проделать алгоритм:
Да, хочу вампиризм для мобов.
Типа так?
Actor DrainImpBall : DoomImpBall
{
  +HITTRACER
  
  var int user_TracerHealth;
  
  States
  {
  Spawn:
	BAL1 AB 4 Bright 
	Loop
  Death:
        TNT1 A 0 A_JumpIf(IsPointerEqual(AAPTR_TRACER,AAPTR_NULL)==1,"BlankDeath")
	TNT1 A 0 A_CheckSpecies("BlankDeath","DoomImp",AAPTR_TRACER)
	TNT1 A 0 A_SetUserVar("user_TracerHealth",health) //Вот только как получить хелсы трэйсера??
        TNT1 A 0 A_DamageTracer(random(x,y))
        TNT1 A 0 A_SetUserVar("user_TracerHealth",health) //Вот только как получить хелсы трэйсера??
        TNT1 A 0 A_DamageTarget(-user_TracerHealth/2)
        TNT1 A 0 A_SpawnItemEx("LifeStealOverlay",0,0,20,0,0,0,0,SXF_SETTRACER)
  BlankDeath:
	BAL1 CDE 6 Bright
    Stop
  }
}


---------------------------
Landsberg
Делаешь файл-анимацию из желаемых изображений и обзываешь его TITLEPIC, - пишут что анимация теперь поддерживается; есть ещё TITLEMAP с вроде схожей функцией, но я не уверен.
1 9 1
Anto96WS
= Master Corporal =
Next rank: - Sergeant - after 9 points
281

Doom Rate: 1.77

Posts quality: +89
Ссылка на пост №3525 Отправлено: 20.09.18 19:39:34
Void Weaver:
Anto96WS
Хех, как раз этот вопрос мы мурыжили со Смертоносцем несколько страниц назад.
Вот этот имп будет бегать за любыми ближайшими, видимыми в радиусе 512, дум аптечками, с их последующим уничтожением:
Скрытый текст:

Zandronum не ест A_CheckProximity :diatel:
А я хотел заставить это работать в мультиплеере. За что, Zandro, за что?!

Попробую аналогичной функцией через ACS
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +775
Ссылка на пост №3526 Отправлено: 20.09.18 19:56:29
Anto96WS:
Zandronum не ест A_CheckProximity
Блин, надо было предупреждать, как раз сначала выкладывал код на ЧекЛОФе. Но на ЧекЛОФе всё равно работает хуже.

Кстати ты уверен что Зандро не знает саму ф-цию? Просто иногда бывает что зандро не распознаёт конкретный флаг. А вообще Зандро дохрена чего не приемлет, те же анонимные ф-ции, некоторые ф-ции выражений.
1 9 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3527 Отправлено: 20.09.18 19:58:38
Void Weaver:
ВТФ из "бракованный урон"? Бтв, может я снова неправильно тебя понял но урон считается явно НЕ в момент выстрела снаряда, ибо тогда не было бы подобных коллизий типа "свампирил больше чем покоцал". Собс-но маслина с Damage (random(x,y)*z) может покоцать на 10 и одновременно похилить на 20 за один кадр нулевой длительности.

Варьируя Damage ты варьируешь ГОСТ, но конечный результат варьируется тоже.
Пример: Ты директор патронной фабрики, а Damage это твоя ТЗшка на количество дробин. Ты можешь приказать "сыпать по 20 дробин!" или "сыпать по 20, 22 или 24 дробины!", но в магазине всё равно появятся патроны с 18, 19 и 25 дробинами, потому что на сборочной линии работают криворукие узбеки, у которых криворукость прописана на уровне движка.

Вообще здесь нужен следственный эксперимент. Тебе нужна мееедленная ракета и моб-паралитик, ежесекундно говорящий своё здоровье принтболдом.
1. Стреляешь ракетой.
2. Сохраняешь игру.
3. Забегаешь вперёд и спаунишь на её пути монстра. Записываешь урон.
4. Загружаешь сейв, забегаешь дальше и подпрыгивая и всячески дразня генератор случайных чисел, спаунишь монстра. Записываешь урон.
5. Пункт 4 повторить несколько раз.
Гипотеза в том, что урон каждый раз будет одинаковым, даже если у ракеты был прописан рандомный Damage.

Void Weaver:
Типа так?

Типа так.

Void Weaver:
Вот только как получить хелсы трэйсера

Вот здесь слабое место, да. По ходу только вставлять ACS-костыль либо зскрипт-костыль, декорейт-онли с ходу не придумывается.

Upd: декорейт-онли метод определения здоровья трасера придумывается, но это безумный пиздец, и иначе его не назвать, да простит меня Пушкин. Заключается он в создании until-цикла на джамперах с применением смещённого goto (может быть сработает A_Jump с негативным оффсетом) и A_JumpIfHealthLower(int health, int offset , AAPTR_TRACER), который в случае со всякими там кибердемонами может потребовать несколько тысяч итераций.
Upd2: количество итераций можно заметно сократить, если перед until-циклом сделать несколько итераций бинарного поиска, существенно сузив диапазон, но это ещё более упоротая конструкция получается.
2
Anto96WS
= Master Corporal =
Next rank: - Sergeant - after 9 points
281

Doom Rate: 1.77

Posts quality: +89
Ссылка на пост №3528 Отправлено: 20.09.18 20:03:59
Void Weaver:
Кстати ты уверен что Зандро не знает саму ф-цию? Просто иногда бывает что зандро не распознаёт конкретный флаг. А вообще Зандро дохрена чего не приемлет, те же анонимные ф-ции, некоторые ф-ции выражений.

Script error, "DECORATE.txt:DECORATE" line 11:
Invalid state parameter checkproximity
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3529 Отправлено: 20.09.18 20:04:51
Anto96WS:
За что, Zandro, за что?!

Зандро это движок ZDoom 2.5.0, который по-моему даже поинтеры в декорейтных функциях не понимал, и половины нынешнего там не было. А поскольку дампа Zdoom wiki образца 2.5.0 никто так и не удосужился сделать - теперь разработка модов под задротум превращается в боль, унижение и гадание на кофейной гуще.

П - планирование. :oops:

Рейтинг сообщения: +1, отметил(и): Void Weaver
2
Anto96WS
= Master Corporal =
Next rank: - Sergeant - after 9 points
281

Doom Rate: 1.77

Posts quality: +89
Ссылка на пост №3530 Отправлено: 20.09.18 20:09:10
Zandronum 3 версии умеет есть ZScript хотяб?

Добавлено спустя 7 минут 1 секунду:

Void Weaver:
Блин, надо было предупреждать, как раз сначала выкладывал код на ЧекЛОФе. Но на ЧекЛОФе всё равно работает хуже.

Но все равно покажи. Я тут глобальный RP-мод пилю. Сетевой. И поэтому нужно чтобы Zandronum это ел
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3531 Отправлено: 20.09.18 20:27:18
Anto96WS:
Zandronum 3 версии умеет есть ZScript хотяб?

Третий ВРОДЕ БЫ должен уметь в фичи здум 2.7.1, но это не точно и полноценная реализация этих фич под вопросом.
Зскрипт впервые появился в пост-здумовском релизе козы, когда Рэнди ушёл в астрал, и все бразды по инноваторству взял на себя Граф.
2
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +775
Ссылка на пост №3532 Отправлено: 20.09.18 21:24:47
Герр Смертоносец:
Void Weaver:
ВТФ из "бракованный урон"? Бтв, может я снова неправильно тебя понял но урон считается явно НЕ в момент выстрела снаряда, ибо тогда не было бы подобных коллизий типа "свампирил больше чем покоцал". Собс-но маслина с Damage (random(x,y)*z) может покоцать на 10 и одновременно похилить на 20 за один кадр нулевой длительности.

Варьируя Damage ты варьируешь ГОСТ, но конечный результат варьируется тоже.
Пример: Ты директор патронной фабрики, а Damage это твоя ТЗшка на количество дробин. Ты можешь приказать "сыпать по 20 дробин!" или "сыпать по 20, 22 или 24 дробины!", но в магазине всё равно появятся патроны с 18, 19 и 25 дробинами, потому что на сборочной линии работают криворукие узбеки, у которых криворукость прописана на уровне движка.
Сорри, но либо я тупой, либо твоё утверждение голословно. Ну вот я беру Damage(random(1,4)*10) и мне чётко возвращает 10,20,30 или 40 дмг, без всяких там "гастарбайтерских" 42 и 11. И уж если APROP_Damage - ГОСТ, то Damage и Damage() - это вполне себе честные ТУ. Так в чём бракованность-то?

Герр Смертоносец:
Вообще здесь нужен следственный эксперимент. Тебе нужна мееедленная ракета и моб-паралитик, ежесекундно говорящий своё здоровье принтболдом.
То же самое, - либо я тупой, либо ты усложняешь. Берёшь плюху с Damage(random(1,4)*10) и пробуешь на своей небронированной тушке, - результат выше.

Герр Смертоносец:
Upd: декорейт-онли метод определения здоровья трасера придумывается, но это безумный пиздец, и иначе его не назвать, да простит меня Пушкин. Заключается он в создании until-цикла на джамперах с применением смещённого goto (может быть сработает A_Jump с негативным оффсетом) и A_JumpIfHealthLower(int health, int offset , AAPTR_TRACER), который в случае со всякими там кибердемонами может потребовать несколько тысяч итераций.
Ёбушки-воробушки... а можно для не визионеров от бога? А разве нет какой-нибудь декор ф-ции типа GetSpawnHealth но для текущих?
-----------------------
Anto96WS
Строку с ЧекПрокс меняешь на это:
Скрытый текст:

TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",0.0)
CLOFItemCircle:
TNT1 A 0 A_CheckLOF("ClassCheck",CLOFF_SKIPOBSTACLES|CLOFF_JUMPOBJECT|CLOFF_SKIPTARGET|CLOFF_BEYONDTARGET|CLOFF_ALLOWNULL|CLOFF_CHECKPARTIAL|CLOFF_SETTRACER,512,0,user_CLOFangle,-180,-28,0,AAPTR_TRACER)
TNT1 A 0 A_SetUserVarFloat("user_CLOFangle",user_CLOFangle+0.1)
TNT1 A 0 A_JumpIf(user_CLOFangle==360.0,"ClassCheck")
Goto CLOFItemCircle

ClassCheck:
TNT1 A 0 A_JumpIf(CheckClass("Health",AAPTR_TRACER,1)==1,"ItemChase")

Но учти, в отличии от ЧекПрокс варианта работает не по ближайшему итему а по первому обнаруженному, плюс срабатывает через пень колоду (вероятно не те значения питч\высота), тогда как ЧекП работает как часы.

Anto96WS:
Я тут глобальный RP-мод пилю.
Удачи. Что значит "RP-мод"?
1 9 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3533 Отправлено: 20.09.18 23:03:00
Void Weaver:
Сорри, но либо я тупой, либо твоё утверждение голословно. Ну вот я беру Damage(random(1,4)*10) и мне чётко возвращает 10,20,30 или 40 дмг, без всяких там "гастарбайтерских" 42 и 11. И уж если APROP_Damage - ГОСТ, то Damage и Damage() - это вполне себе честные ТУ. Так в чём бракованность-то?

Ну если все факторы рандома гарантированно устраняются скобочками, значит проблема ошибок вампиризма где-то в другом месте, и GetMissileDamage тут точно не поможет. Энивей, это всё гадание на кофейной гуще, а проверить это самостоятельно я сейчас не могу, ибо сижу с левого ноута в другом городе.

Void Weaver:

Ёбушки-воробушки... а можно для не визионеров от бога?

Ну в простейшем случае:
GetTracerHealth:
     TNT1 A 0 A_SetUserVar("user_TracerHealth",5000) // базовое значение 
     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 2, AAPTR_TRACER) // если значение совпало - выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-1) //уменьшить сравниваемое на 1
     Goto GetTracerHealth+1
     TNT1 A 0  //точка выхода из цикла.

Здесь будет огромный цикл до тех пор, пока user_TracerHealth не сравняется с текущим здоровьем обследуемого монстра. Причём если изначально у монстра было 6000хп - цикл будет бесконечным, и всё нафиг крашнется. Это пагубный извращенский путь, который теоретически можно довести до ума каким-нибудь изуверским и неочевидным способом, сравнивать в несколько этапов по разрядам, например (сначала считаем миллионы, потом сотни тысяч, потом десятки тысяч, потом тысячи, потом сотни, потом десятки, потом единицы). Но всё равно будет долго и громоздко.

Void Weaver:
А разве нет какой-нибудь декор ф-ции типа GetSpawnHealth но для текущих?

Вот нету. CountInv для подсчёта предметов в инвентаре у поинтера есть, а для здоровья почему-то нету. О принципе полноты языка как-то позабыли, когда эти фичи добавляли. А сейчас вся движуха сосредоточена на обмазывании рендера всякими там бамп-текстурами и прочими свистоперделками, и на эти логические дыры надолго возложен болт.

Рейтинг сообщения: +1, отметил(и): Void Weaver
2
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +775
Ссылка на пост №3534 Отправлено: 20.09.18 23:49:09
Герр Смертоносец:
Ну если все факторы рандома гарантированно устраняются скобочками, значит проблема ошибок вампиризма где-то в другом месте, и GetMissileDamage тут точно не поможет.
Если мы таки говорим об одном и том же, то вообще-то да, скобочки решают. Хотя я сам узнал об этом только месяца 2 назад; и кстати да, рандом выбирается непосредственно в момент нанесения дамага:
For a projectile defines the damage it inflicts upon impact. The formula is random(1,8) * damage, or random(1,4) * damage if the STRIFEDAMAGE flag is set.
This also defines the damage for actors which attack like the Lost Soul. The formula for this is random(1,8) * damage.
damage is also used to define how many bullets are fired by the generic hitscan attack function A_BulletAttack.
Custom damage formulas can be specified by enclosing the value completely within parenthesis. For example: damage (random(4,8) * 5 + 6). This bypasses the normal calculation and does the exact damage resulting from the custom formula. Also, ACS_ExecuteWithResult and user variables can be used as part of the damage expression; this allows for more sophisticated damage calculations to be performed. The damage formula is evaluated at the moment the actor causes damage (e.g. projectile/hitscan impact).


Герр Смертоносец:
Ну в простейшем случае:
Фигасе! Понял, данке.
1 9 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3535 Отправлено: 21.09.18 02:08:50
Void Weaver:

А если поставить максималку 0x7FFFFFFF (2147483647 хп), с запасом так ск-ть? Или таким значением счётчик сразу поперхнётся?

Скорее всего. Где-то по-любому должна сработать защита от бесконечных циклов, ибо столько итераций никакой процессор за адекватное время не прожуёт. Да и 5000 итераций нулевой длительности это слишком много. Здесь надо что-то придумывать, и я придумал такую наркоманскую муйню:

GetTracerHealth:
     TNT1 A 0 A_SetUserVar("user_TracerHealth",10000) // базовое значение измеряемого максимума
     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 2, AAPTR_TRACER) // если значение совпало - выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-1000) //уменьшить сравниваемое на 1000
     Goto GetTracerHealth+1
     TNT1 A 0  A_SetUserVar("user_TracerHealth",user_TracerHealth+1000) //выход из цикла01
   //отошли на один тысячеый шаг назад, чтобы приближаться более мелкими шажками

     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 2, AAPTR_TRACER) // если значение совпало - выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-100) //уменьшить сравниваемое на 100
     Goto GetTracerHealth+4
     TNT1 A 0  A_SetUserVar("user_TracerHealth",user_TracerHealth+100) //выход из цикла02
   //отошли на один сотенный шаг назад, чтобы приближаться более мелкими шажками

     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 2, AAPTR_TRACER) // если значение совпало - выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-10) //уменьшить сравниваемое на 10
     Goto GetTracerHealth+7
     TNT1 A 0  A_SetUserVar("user_TracerHealth",user_TracerHealth+10) //выход из цикла03
   //отошли на один десятичный шаг назад, чтобы приближаться более мелкими шажками

     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 2, AAPTR_TRACER) // если значение совпало - выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-1) //уменьшить сравниваемое на 1
     Goto GetTracerHealth+10
     TNT1 A 0     //выход из цикла04, окончательное значение равно здоровью цели.


Здесь четыре цикла, приближающиеся к цели от старших разрядов к младшим. На каждый разряд должен быть добавлен новый цикл. Здесь максимальное количество итераций равно 40 при верхней границе 10000 (10^4), соответственно при 10^6 итераций будет 60, при 0x7FFFFFFF 92. Это уже разумные числа. Это всё, конечно, надо отлаживать, и нет никаких гарантий, что наркоманская муйня сработает, но выглядит она так-то довольно изящной. А внедрив сюда ещё одну переменную, можно сократить написание до одного цикла с меняющимся шагом, который будет выполняться поверх себя же самого, пока шаг не станет равным 1.

GetTracerHealth:
     TNT1 A 0 A_SetUserVar("user_TracerHealth",10000) // базовое значение измеряемого максимума
     TNT1 A 0 A_SetUserVar("user_Stepsize",1000) // базовый шаг, в задаваемом максимуме их должно помешаться от двух до десяти.
     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 2, AAPTR_TRACER) // если значение совпало - выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-user_Stepsize) //уменьшить сравниваемое на шаг
     Goto GetTracerHealth+2
     TNT1 A 0 A_JumpIf(user_Stepsize == 1, 3) //выход из локального цикла
     TNT1 A 0  A_SetUserVar("user_TracerHealth",user_TracerHealth+user_Stepsize)  //отошли на один текущий шаг назад, чтобы приближаться более мелкими шажками
     TNT1 A 0  A_SetUserVar("user_Stepsize",user_Stepsize/10) //уменьшили разрядность шага
     Goto GetTracerHealth+2
     TNT1 A 0    //выход из глобального цикла, окончательное значение равно здоровью цели.



Ну и при желании можно ограничить максимальное здоровье измеряемого монстра автоабортом, если не пройдёт проверку на какое-то большое число. Мол, нехер здоровье у фулловых боссов по 100к хп тырить, они сами у кого хочешь стырят.
2
Void Weaver
= Captain =
Next rank: - Major - after 144 points
2496

Doom Rate: 1.82

Posts quality: +775
Ссылка на пост №3536 Отправлено: 21.09.18 08:47:54
Герр Смертоносец:

Goto GetTracerHealth+10
TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth) //выход из цикла04, окончательное значение равно здоровью цели.
Выглядит конечно клёво, но вот тут почему-то возвращает ровно 11000, что никак не соответствует 100-200 хп думгая. :|
Скрытый текст:

Бтв, внезапно нашло вдохновение и в итоге запилил таки сразу Взрыв Трупов по SpawnHealth цели и Вампир-маслину по Health, причём вообще без узерваров. Если интересно, могу выложить. Правда в моём варианте ни одну абилку Зандро не примет, - в обеих ЧекПрокс.

1 9 1
Anto96WS
= Master Corporal =
Next rank: - Sergeant - after 9 points
281

Doom Rate: 1.77

Posts quality: +89
Ссылка на пост №3537 Отправлено: 21.09.18 09:12:58
Void Weaver:
Что значит "RP-мод"?

Игроки закидываются на огромную заскриптованную карту.
И собсна все. Игра бесконечна.

Можно улучшать оружие и броню, можно чистить локации от монстроты на ивентах.
Можно крафтить разнообразную дичь и продавать торговцам, или восстанавливать и обустраивать разрушенные базы.

Монстры ведут себя намного сложнее, и как и игроки могут лечиться, менять оружие и т.д.
MyNameIs
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 34 points
1606

Doom Rate: 1.92

Posts quality: +621
Ссылка на пост №3538 Отправлено: 21.09.18 09:39:58
кидать аббревиатуру и не показывать, как она расшифровывается

РП - это РолеПлей. как рпг, только ролеплеят в основном своими силами, а не игра тебя
может сопровождаться прокачкой, походами за хлебом в магазины, иногда даже покупкой хат
1 1
Anto96WS
= Master Corporal =
Next rank: - Sergeant - after 9 points
281

Doom Rate: 1.77

Posts quality: +89
Ссылка на пост №3539 Отправлено: 21.09.18 14:24:39
[OFFTOP]
MyNameIs:
кидать аббревиатуру и не показывать, как она расшифровывается

Разве не для этого создали аббревиатуры, чтобы каждый раз их не расшифровывать?
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 39 points
641

Doom Rate: 1.5

Posts quality: +412
Ссылка на пост №3540 Отправлено: 21.09.18 14:29:25
Void Weaver:

Выглядит конечно клёво, но вот тут почему-то возвращает ровно 11000, что никак не соответствует 100-200 хп думгая. :|

Потому что не надо такие вещи по ночам писать. Сама логика поразрядного отступа написана правильно, а вот A_JumpIfHealthLower применён с точностью до наоборот. Нам ведь нужно продолжать цикл до тех пор, пока реальное значение здоровья меньше сверхгигантского предполагаемого, а оно, увидев огромный user_TracerHealth, делало автовыход.

Как-то так:
GetTracerHealth:
     TNT1 A 0 A_SetUserVar("user_TracerHealth",10000) // базовое значение измеряемого максимума
     TNT1 A 0 A_SetUserVar("user_Stepsize",1000) // базовый шаг, в задаваемом максимуме их должно помешаться от двух до десяти.
     TNT1 A 0 A_JumpIfHealthLower(user_TracerHealth, 1, AAPTR_TRACER) // продолжить цикл, если здоровье всё еще меньше предполагаемого
     Goto GetTracerHealth+4 //путь на выход из цикла
     TNT1 A 0 A_SetUserVar("user_TracerHealth",user_TracerHealth-user_Stepsize) //уменьшить сравниваемое на шаг
     Goto GetTracerHealth+2 //путь на продолжение цикла
     TNT1 A 0 A_JumpIf(user_Stepsize == 1, 3) //выход из локального цикла
     TNT1 A 0  A_SetUserVar("user_TracerHealth",user_TracerHealth+user_Stepsize)  //отошли на один текущий шаг назад, чтобы приближаться более мелкими шажками
     TNT1 A 0  A_SetUserVar("user_Stepsize",user_Stepsize/10) //уменьшили разрядность шага
     Goto GetTracerHealth+2
     TNT1 A 0    //выход из глобального цикла, окончательное значение равно здоровью цели.

Рейтинг сообщения: +2, отметил(и): VladGuardian, Void Weaver
2
Страница 177 из 200Перейти наверх Пред.  1, 2, 3 ... 176, 177, 178 ... 198, 199, 200  След.
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!