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

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4201 Отправлено: 08.08.19 11:26:59
Doomgay1999 пишет:
Как сделать так чтобы на уровне играли случайные треки?
Случайно вызывать (Local)SetMusic.
1 8 1
FoxPlays
= Master Corporal =
Next rank: - Sergeant - after 28 points
262

Doom Rate: 2.05

Posts quality: +101
Ссылка на пост №4202 Отправлено: 08.08.19 14:26:12
Есть-ли рабочий способ добавить в GZDoom Builder тест на DOSBox ?
1
Doomgay1999
- UAC Gunner -
Next rank: = UAC Gunner = after 8 points
52

Doom Rate: 2

Ссылка на пост №4203 Отправлено: 10.08.19 06:09:29
Где мне можно скачать вырезаную миди музыку в думе?
Void Weaver
- Captain -
Next rank: = Captain = after 194 points
2146

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4204 Отправлено: 10.08.19 06:29:55
Выбирай. Не за что.
1 8 1
FoxPlays
= Master Corporal =
Next rank: - Sergeant - after 28 points
262

Doom Rate: 2.05

Posts quality: +101
Ссылка на пост №4205 Отправлено: 10.08.19 12:28:20
Doomgay1999

Вот сайт, там есть кнопка которая скачивает архив со всеми миди с дум 1/2 - * сайт *
1
Chaingunner
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 91 points
1349

Doom Rate: 2.16

Posts quality: +302
Ссылка на пост №4206 Отправлено: 10.08.19 12:40:07
Doomgay1999 пишет:
Где мне можно скачать вырезаную миди музыку в думе?

Если ты про треки, не вошедшие в игру, то тут:
https://web.archive.org/web/20140310123519/http://rome.ro/2007/06/doom-archaeology.html
1 1 2
Void Weaver
- Captain -
Next rank: = Captain = after 194 points
2146

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4207 Отправлено: 17.08.19 00:21:04
1. Схожая задача уже поднималась в этом треде но дискуссия вокруг решения оной особого развития не получила.

Чуток обрисую нынешнюю проблему. Игрок ставит стационарную турель которая выдаёт игроку бобло как только цель турели (монстр) скопытится. Проблема в том что если один монстр является целью сразу нескольких турелей, то по смерти монстра ревард игроку выдадут ВСЕ турели для которых усопший был последней целью.
Отсюда вопрос следующий: каким образом можно отследить и зафиксировать авторство убийства одного актора другим БЕЗ модификации кода жертв? Годится любой метод, но лично мне предпочтительней решение на декоре.
----
2. Есть ли какой-нибудь способ визуализировать field of view+sight range актора в перекрестии прицела? Т. е. например наводишь прицел на актор и под ним тут же отрисовывается сектор (в визуальном смысле а не в смысле маппинга) отражающий текущие параметры A_LookEx? Ну типа если у цели field of view = 45 градусам а sight range = 500, то и сектор на полу будет подсвечен ровно на 500 мапюнитов и строго в диапазоне 45 градусов от "лица" цели.

Рейтинг сообщения: +1, отметил(и): FoxPlays
1 8 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 77 points
603

Doom Rate: 1.53

Posts quality: +348
Ссылка на пост №4208 Отправлено: 17.08.19 01:13:28
Void Weaver
1. Посмертно выдать цели итем, который может существовать в инвентаре в единственном экземпляре. А значит, и чекнуть+изъять для подтверждения реварда его можно один лишь раз.

2. Здесь проблема не в способе визуализации (можно какие-нибудь 3д-модели скейлить), а в выковыривании настроек A_LookEx. Это ведь вообще не Property, ни через CheckActorProperty, ни зскриптом это не вытащить. Если не трогать код монстра, единственный зыбкий путь, который я вижу - это мутить какие-то тестовые объекты, которые будут агрить монстра на себя, предварительно запомнив его стейт и возвращая ему его стейт. И багов здесь будет просто овердофига.

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

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

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4209 Отправлено: 17.08.19 04:34:57
Герр Смертоносец пишет:
1. Посмертно выдать цели итем, который может существовать в инвентаре в единственном экземпляре.
А можно чуток подробнее кто кому должен выдавать итем (аутентификатор выдачи реварда, да?)? Если что, то по умолчанию игрок остаётся целью монстров, исходя из того что турели не нацеливаемые.
Олсо, до публикации вопроса я было попробовал замхать выдачу хабара игроку непосредственно из самого пуффа, и казалось бы что всё логично, правильно, красиво и косяков не содержит по определению. Но ВНЕЗАПНО хз по какой причине периодически таки продолжает проскакивать двойная награда:
Скрытый текст:

Actor TurretPuff : BulletPuff
{
+PUFFONACTORS
+HITTRACER
+PUFFGETSOWNER
var int user_lootClass;
States
{
Spawn:
TNT1 A 0 NoDelay A_CheckFlag("NOBLOOD","XDeath",AAPTR_TRACER)
Goto Super::Spawn

XDeath:
TNT1 A 1 A_ChangeFlag("ALLOWPARTICLES",0) //Тут ОБЯЗАТЕЛЬНО должен быть буфферный ТИК!
//TNT1 A 0 A_CheckFlag("CORPSE","GiveReward",AAPTR_TRACER)
//TNT1 A 0 A_JumpIfHealthLower(1,"GiveReward",AAPTR_TRACER) //У некоторых монстров может не быть трупа, так что универсальней чекать хп
TNT1 A 0 //На всякий пожарный 2 в одном
{
If(A_JumpIfHealthLower(1,"GiveReward",AAPTR_TRACER)&&A_CheckFlag("CORPSE","GiveReward",AAPTR_TRACER)){Return state("GiveReward");}
Else{Return state("");}
}
Stop

GiveReward:
TNT1 A 0 A_PlaySound("brain/pain",0)
//TNT1 A 0 A_GiveToTarget("RewardActivator")
//*
TNT1 A 0
{
If(CheckClass("ZombieMan",AAPTR_TRACER,1)){user_lootClass=1;Return state("");}
Else If(CheckClass("ShotgunGuy",AAPTR_TRACER,1)){user_lootClass=2;Return state("");}
Else If(CheckClass("ChaingunGuy",AAPTR_TRACER,1)){user_lootClass=4;Return state("");}
Else If(CheckClass("DoomImp",AAPTR_TRACER,1)){user_lootClass=3;Return state("");} //Иногда 1 импа таки "валят" сразу 1+ пушки и получаем 6 шеллсов, такое впечатление что это тот случай когда сбоит та самая "распределённая одновременность": http://i.iddqd.ru/viewtopic.php?p=104278#104278
Else If(CheckClass("Demon",AAPTR_TRACER,1)){user_lootClass=4;Return state("");}
Else If(CheckClass("LostSoul",AAPTR_TRACER,1)){user_lootClass=0;Return state("");}
Else If(CheckClass("Revenant",AAPTR_TRACER,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("Cacodemon",AAPTR_TRACER,1)){user_lootClass=6;Return state("");}
Else If(CheckClass("HellKnight",AAPTR_TRACER,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("BaronofHell",AAPTR_TRACER,1)){user_lootClass=8;Return state("");}
Else If(CheckClass("Arachnotron",AAPTR_TRACER,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("Fatso",AAPTR_TRACER,1)){user_lootClass=8;Return state("");}
Else If(CheckClass("Archvile",AAPTR_TRACER,1)){user_lootClass=9;Return state("");}
Else If(CheckClass("SpiderMastermind",AAPTR_TRACER,1)){user_lootClass=10;Return state("");}
//Else If(CheckClass("Cyberdemon",AAPTR_TRACER,1)){user_lootClass=10;Return state("");}
Else{user_lootClass=10;Return state("");} //Значит остался только Кибер
}
//TNT1 A 0 A_GiveToTarget("Shell",user_lootClass) //Строка для использования из волыны
TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT,AAPTR_DEFAULT,AAPTR_NULL) //На всякий пожарный?...
TNT1 A 0 A_GiveToTarget("Shell",user_lootClass,AAPTR_MASTER)
//*/
Stop
}
}

----
2. Не-не, для этого пункта код монстра вполне открыт для любых модификаций. Вернуть параметры A_LookEx я полагаю ваще изи если использовать для оных юзерварки. Честно говоря меня как раз интересует гибкость визуализации. И если то, как отрисовывать на полу круг с динамичным радиусом это хотя бы относительно понятно, то вот как рисовать динамичную "дольку" (при FoV<360) я вообще хз.
Мб. как-нибудь через A_SetVisibleRotation?

Рейтинг сообщения: +1, отметил(и): FoxPlays
1 8 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 77 points
603

Doom Rate: 1.53

Posts quality: +348
Ссылка на пост №4210 Отправлено: 17.08.19 07:12:40
Void Weaver пишет:
А можно чуток подробнее кто кому должен выдавать итем (аутентификатор выдачи реварда, да?)?

Ну для начала рассмотрим простейший пулемётно-хитскановый случай.
1. Турель лупит по монстру, с каждым выстрелом делая A_JumpIfHealthLower(1, int offset , AAPTR_TARGET), и как только здоровье монстра падает до нуля - выдаёт ему итем.
2. Идёт небольшая задержка. (Для надёжности её можно рандомизировать, загнав фрейм в бесконечный самоповтор с джампом на выход с некоторым шансом).
3. Проверка A_JumpIfInventory("итем",1, int offset,AAPTR_TARGET) ведёт на действие: забрать у таргета итем, дать игроку награду.
4. Далее A_ClearTarget.
В теории, даже если несколько турелей попадут на этап 3 одновременно, то обрабатывать их движок будет по очереди. И как только одна из них изымет у таргета итем - все остальные уже не смогут пройти эту проверку.

С ракетными турелями всё чуть сложнее, ракета сразу после спауна должна узнавать у турели её текущий таргет и записывать в AAPTR_TRACER. При попадании в цель все вышеописанные действия совершает уже ракета (разумеется, вместо таргетфилда теперь трасерфилд).

Void Weaver пишет:
И если то, как отрисовывать на полу круг с динамичным радиусом это хотя бы относительно понятно, то вот как рисовать динамичную "дольку" (при FoV<360) я вообще хз.

A_SetVisibleRotation всего лишь делает объект невидимым с некоторых ракурсов, так что она тут малополезна.

Вообще, если решать задачу "в тупую", то можно установить шаг погрешности (допустим, 10 градусов) и спаунить под объектом модель вида "плоский треугольник" в количестве от 1 до 36 штук. Вершина треугольника должна быть координатным центром модели, а радиус мы задаём через Scale. (Здесь есть некоторая жопа в том, что параметр ограничен значением 4.0, так что изначально должен быть выставлен сильно меньше 1.)

Если решать умнее, то мы спауним всего 8 треугольников, чтобы было похоже на логотип Umbrella corporation. По дефолту треугольники имеют угол 45 градусов и разложены по полу с шагом в 45 градусов. Но если применить особую уличную магию тригонометрии, то можно определить коэффициент YScale для любого числа градусов. (Навскидку K = tg(α/2)/tg(45/2), если я ничего не путаю). В этом случае мы одновременно уменьшаем угловой шаг и угловой размер треугольника, и логотип Umbrella corporation превращается в китайский веер, который может быть разложен на какой угодно угол от 0 до 360, и давать точный результат при экономии полигонов.
Да, там вылезет небольшая проблема центровки, ибо линия, разделяющая треугольники №4 и №5 должна быть сориентирована чётко по морде монстра, т.е. их угол должен равняться "собственный угол монстра ± шаг/2", но это уже всё легко и понятно делается.

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

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4211 Отправлено: 17.08.19 08:28:22
1. Так, я в общем подозревал что будет шило на мыло, ну в общем оно так и вышло: остальные турели выполняют всё те же действия над всё той же ОБЩЕЙ целью! Лут сыпется как из ведра. :(
Пока что лучший результат показывает вышеприведённый пуфф, но хоть убей не понимаю в какой момент проскакивает мультилут.
Со снарядами полагаю механика будет аналогичная, причём подозреваю что заглюков с мультилутом у маслин будет меньше чем у хитсканов, либо вообще не будет такой проблемы. Но хитскан, ссука, никак не лечится, хотя по логике он-то как раз должен был бы полностью исключён из подобных коллизий - на 1 труп 1 пуля.
Есть ещё какие соображения, няш?

2. A_SetVisibleRotation - я полагал типа спаунить слоёнку "круглых" спрайтов, глядящих в разные стороны, видимость которых задавать через установку (не)видимого угла, а диапазон как раз брать из ФоВ _ЛукЭкса. Т. е. использовать функцию как общую маску для всех разнонаправленных слоёв круглых спрайтов, что в теории будет означать что с какой стороны не взгляни то везде будет отрисовываться видимый сектор ("долька") одного из кругов. Аналогично устройству механизма лимбового (сейфового) замка.

В моделях не шарю но на бумаге твой вариант выглядит перспективно. Подождём результатов от FoxPlays, если что. ;)

Рейтинг сообщения: +1, отметил(и): FoxPlays
1 8 1
FoxPlays
= Master Corporal =
Next rank: - Sergeant - after 28 points
262

Doom Rate: 2.05

Posts quality: +101
Ссылка на пост №4212 Отправлено: 17.08.19 12:48:09
По-эксперементировал -- без серьёзных результатов.

1. Пытался что-то похожее сделать на ACS, но без должных результатов. Если у меня всё-таки не получиться сделать эту штуку с деньгами, то сделаю деньги физическими, то-есть они будут выпадать с монстров. Лучший результат получился у воида, также спасибо и герру с помощью.

2. Визуальный радиус турелей не думаю добавлять, обойдусь добавлением информации о радиусе для турелей по типу - Radius: Small, Medium, Large.
На том спасибо.

:o

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

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4213 Отправлено: 17.08.19 14:29:03
FoxPlays пишет:
Если у меня всё-таки не получиться сделать эту штуку с деньгами, то сделаю деньги физическими, то-есть они будут выпадать с монстров.
Ну да, наверное это логично.
А игроку можно запилить что-то типа "магнитного" скилла который при юзе будет собирать дроп в радиусе на некоторой дистанции. Ну или со всей мапы. :)
Правда меня всё ещё интересует решение этой задачи именно через получение награды из самой турели или из инфликтора её урона. Иначе придётся оставить механизм выдачи экспы не за киллы а за нанесённый урон.

FoxPlays
2. Если будешь когда-нибудь работать с моделями попробуй реализовать визуализацию по методу Смертоносца. Отпишусь если получится по A_SetVisibleRotation.
1 8 1
Guest
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 59 points
1381

Doom Rate: 2.57

Posts quality: +108
Ссылка на пост №4214 Отправлено: 17.08.19 14:35:25
Void Weaver пишет:
А игроку можно запилить что-то типа "магнитного" скилла который при юзе будет собирать дроп в радиусе на некоторой дистанции.

Кстати, в моде Guncaster такая фича уже реализована, причем работает в пассивном режиме, а не "по нажатию", просто автоматом сгребаются все деньги (которые там выпадают с монстров) в неком радиусе от игрока. Правда эта фича работает только если у игрока есть специальный айтем ("том философа", как-то так называется).

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

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4215 Отправлено: 17.08.19 14:44:14
Ага. А в DRPG как раз по юзу и со всей мапы. Так что накрайняк есть где образец глянуть. )
1 8 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 77 points
603

Doom Rate: 1.53

Posts quality: +348
Ссылка на пост №4216 Отправлено: 17.08.19 17:06:20
Void Weaver пишет:
Так, я в общем подозревал что будет шило на мыло

Это не шило на мыло, я вообще не вижу в твоём коде проверку checkinventory, которая бы обеспечивала "принудительную единственность" (либо её корректный аналог). Есть проверка на здоровье и проверка на флаг CORPSE, которые сразу же ведут на GiveReward, и не существует никаких преград перед тем, чтобы на GiveReward переключилось бы сразу несколько акторов.
2
Void Weaver
- Captain -
Next rank: = Captain = after 194 points
2146

Doom Rate: 1.8

Posts quality: +667
Ссылка на пост №4217 Отправлено: 17.08.19 17:18:41
Ваще-т существует. Наличие ХИТТРАСЕР подразумевает что если флаг навешен значит урон прошёл и если трэйсер оказался трупом (или хп<1) то ВОТ ПРЯМО СЕЙЧАС я (пуфф) лично завалил этот трэйсер.
Другие же пуффы должны пролететь несолоно хлебавши. И в общем-то всё так и происходит, но при плотном пулемётном огне ~25% срабатывает мультиревард.
Твой же вариант всё также допускает наличие общей цели для нескольких турелей, только ещё добавляет усложнение в виде доп звена для активации выдачи реварда. Вот твой вариант:
Скрытый текст:

ACTOR Turret_pistol
{
Radius 20
Height 56
Monster
Translation 1
Species "PlayerAlly"
//+NOINTERACTION //Вкл если не нужна физика актора
//+NEVERTARGET //Вкл если не хочешь чтобы актор мог стать чьей-либо целью
+DONTTHRUST
+FRIENDLY

var int user_lootClass;

States
{
Spawn:
CPOS A 0 NoDelay A_GiveInventory("Uniter",1,AAPTR_MASTER)
Idle:
CPOS A 10 A_LookEx(LOF_NOSOUNDCHECK,0,500,0,360,"See")
Loop
See:
CPOS A 0 A_Chase("","Missile",CHF_DONTMOVE|CHF_NODIRECTIONTURN)
CPOS AAA 1
{
If(GetDistance(1)>Radius+500){A_ClearTarget;Return state("Idle");}
Else{Return state("");}
}
Loop
Missile:
/*
CPOS AB 6 A_FaceTarget
CPOS C 0 A_PlaySound("grunt/attack")
CPOS C 0 A_CustomBulletAttack(2,0,1,10,"TurretPuff",0,CBAF_NORANDOM)
CPOS C 8 //A_CheckFlag("CORPSE","GiveReward",AAPTR_TARGET)
Goto See
*/
CPOS E 10 A_FaceTarget
CPOS F 0 A_PlayWeaponSound("chainguy/attack")
CPOS F 4 bright A_CustomBulletAttack(22.5,0,1,10,"BulletPuff",0,CBAF_NORANDOM)
TNT1 A 0 A_JumpIfHealthLower(1,2,AAPTR_TARGET)
TNT1 A 0 A_Jump(256,3)
TNT1 A random(1,6) A_GiveToTarget("RewardActivator")
TNT1 A 0 A_JumpIfInventory("RewardActivator",1,"GiveReward",AAPTR_TARGET)
CPOS E 1 A_PlayWeaponSound("chainguy/attack")
CPOS E 4 bright A_CustomBulletAttack(22.5,0,1,random(1,5)*3,"BulletPuff",0,CBAF_NORANDOM)
TNT1 A 0 A_JumpIfHealthLower(1,2,AAPTR_TARGET)
TNT1 A 0 A_Jump(256,3)
TNT1 A random(1,6) A_GiveToTarget("RewardActivator")
TNT1 A 0 A_JumpIfInventory("RewardActivator",1,"GiveReward",AAPTR_TARGET)
CPOS F 1 A_CPosRefire
Goto Missile+1

//*
GiveReward:
TNT1 A 0 A_PlaySound("brain/pain",0)
TNT1 A 0
{
If(CheckClass("ZombieMan",AAPTR_TARGET,1)){user_lootClass=1;Return state("");}
Else If(CheckClass("ShotgunGuy",AAPTR_TARGET,1)){user_lootClass=2;Return state("");}
Else If(CheckClass("ChaingunGuy",AAPTR_TARGET,1)){user_lootClass=4;Return state("");}
Else If(CheckClass("DoomImp",AAPTR_TARGET,1)){user_lootClass=3;Return state("");}
Else If(CheckClass("Demon",AAPTR_TARGET,1)){user_lootClass=4;Return state("");}
Else If(CheckClass("LostSoul",AAPTR_TARGET,1)){user_lootClass=0;Return state("");}
Else If(CheckClass("Revenant",AAPTR_TARGET,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("Cacodemon",AAPTR_TARGET,1)){user_lootClass=6;Return state("");}
Else If(CheckClass("HellKnight",AAPTR_TARGET,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("BaronofHell",AAPTR_TARGET,1)){user_lootClass=8;Return state("");}
Else If(CheckClass("Arachnotron",AAPTR_TARGET,1)){user_lootClass=7;Return state("");}
Else If(CheckClass("Fatso",AAPTR_TARGET,1)){user_lootClass=8;Return state("");}
Else If(CheckClass("Archvile",AAPTR_TARGET,1)){user_lootClass=9;Return state("");}
Else If(CheckClass("SpiderMastermind",AAPTR_TARGET,1)){user_lootClass=10;Return state("");}
//Else If(CheckClass("Cyberdemon",AAPTR_TARGET,1)){user_lootClass=10;Return state("");}
Else{user_lootClass=10;Return state("");} //Значит остался только Кибер
}
TNT1 A 0 A_TakeFromTarget("RewardActivator")
TNT1 A 0 A_ClearTarget
TNT1 A 0 A_GiveInventory("Shell",user_lootClass,AAPTR_MASTER)
Goto Spawn
//*/

Death:
CPOS A 0 A_GIveInventory("DeUniter",AAPTR_MASTER)
Stop
}
}

Может я неправильно тебя понял, но если выполнить дословно то что ты советовал то получится именно такая конструкция.

Добавлено спустя 29 минут:

Т. е. чтобы твой или мой (который не на пуффе) варианты сработали как положено, то первая же пушка получившая от трупа итем-пасс должна немедленно обнулить таргетфилд ВСЕМ турелям которые также имеют этого монстра своей целью. Но даже если это грамотно прописать, то всё по-прежнему останется на воле РНГ случайной длительности буфферного кадра.
1 8 1
Герр Смертоносец
= Sergeant Major =
Next rank: UAC Sergeant Major after 77 points
603

Doom Rate: 1.53

Posts quality: +348
Ссылка на пост №4218 Отправлено: 17.08.19 18:48:36
Void Weaver пишет:
Ваще-т существует. Наличие ХИТТРАСЕР подразумевает что если флаг навешен значит урон прошёл и если трэйсер оказался трупом (или хп<1) то ВОТ ПРЯМО СЕЙЧАС я (пуфф) лично завалил этот трэйсер.
Другие же пуффы должны пролететь несолоно хлебавши.

Вот абсолютно не обязательно. Твой метод работает на "физическом" уровне, мой на программном. Поскольку время у нас квантуется, то вполне вероятна такая ситуация, при которой несколько пуффов уткнутся в недоубитого монстра в один и тот же тик, и "ВОТ ПРЯМО СЕЙЧАС" для них будет действовать одновременно и равноценно. Для физического уровня возможны одновременные события.

На программном уровне всё происходит иначе. Процессор читает код аки книгу по порядку, и вносит изменения тоже по порядку. Здесь у нас не может быть одновременных событий, а события внутри "нулевого" отрезка времени разделены между собой номерным порядком и причинно-следственной связью. Например, возможно такое, что один актор уже обработан - и он переключил некую глобальную переменную из А в Б. А другой актор ещё не обработан, и к началу его обработки глобальная переменная уже стала Б.
(Конечно, из этого принципа могут быть исключения на каких-нибудь движках, где внутри понапиханы всякие мутные костыли, влияющие на порядок обработки малопредсказуемым образом. Но в теории всё выглядит именно так.)

Void Weaver пишет:
Может я неправильно тебя понял, но если выполнить дословно то что ты советовал то получится именно такая конструкция.

Я сейчас придумал чуть иначе.
Missile:
CPOS AB 6 A_FaceTarget
CPOS C 0 A_PlaySound("grunt/attack")
CPOS C 0 A_CustomBulletAttack(2,0,1,10,"TurretPuff",0,CBAF_NORANDOM)
CPOS C 0 A_JumpIfHealthLower(1, "GiveReward" ,AAPTR_TARGET) // Если подох - переходим в режим ожидания.
CPOS F 1 A_CPosRefire
Goto Missile+1

GiveReward:
CPOS C random(1,6)
CPOS C 0 A_JumpIfInventory("RewardActivatorBlocker",1,"ExitReward",AAPTR_TARGET) //Если подохший хоть раз был помечен - он нас более не интересует. Сбрасываем и выходим.
CPOS C 0 A_GiveToTarget("RewardActivatorBlocker") //Пометить подохшего.
CPOS C 0 //дать игроку 500 рублей на водку//
CPOS C 0 //....//
Goto ExitReward

ExitReward:
CPOS C 0 A_ClearTarget
Goto See


Здесь минимум спагетти, всё легко и однозначно читается (однозначность можно похерить, пытаясь сделать код компактнее) и нет ничего лишнего. Здесь итем помечает не труп, по которому можно совершать выплаты, а труп, по которому нельзя. Помечается он необратимо, распомечен быть не может никем и ни при каких обстоятельствах, поэтому здесь всё должно работать стабильнее. Если и тут будет лагать - для верности можно попробовать повесить A_JumpIfInventory и A_GiveToTarget на один фрейм в зскрипте.
2
Страница 211 из 211Перейти наверх Пред.  1, 2, 3 ... 209, 210, 211
   Список разделов - Местечко мапперов и моддеров - Тема для новичков. Вопросы по маппингу/моддингу - любые!