Автор | Сообщение |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 05.11.15 20:21:44 | | | theleo_ua: | Никаких значений после дропитем не написано, а айтем дропается почти всегда. Т.е. по умолчанию там 255 скорее всего стоит |
Тогда фиг знает почему оно не дропает, мб на самом деле баг...
theleo_ua: | Мне аналогично, кстати. В том моде, который я делаю сейчас, мне пришлось переписать каждого монстра (из еретика, хексена и 10 дополнительных) + сделать еще около 100 дополнительных акторов (и это еще не предел), но результатом доволен |
Вот вот, главное нормально рабочий результат В старом типа рпг поделке я около 500+ акторов писал из-за брони и был жутко доволен т.к. шмотки снимались\одевались, давали защ. в общем нормально работало. хД но тогда мой скил в ацс был ниже чуть, и приходилось подстраиваться под дефолтный инвентарь дума, сейчас то я бы и свой инвентарь написал и шмотки по другому делал, и 500 акторов не понадобилось.
theleo_ua: | кстати, одна из хотелок для моего мода была "увеличить урон врагам на 25%", вместо чего я уменьшил хп и броню игрока на 20% (как у игрока, так и у предметов), ибо эффект почти тот же, а реализовать проще |
Не ну тут как бы особо сложного наверное нет, есть же функция SetActorProperty(); в которой можно изменять damage актора.
ZZYZX: | script "apply_armor" ENTER { while (true) { int coef = CheckInventory("MyArmorCount")<<16>=0; coef /= 2; coef /= 100; SetActorProperty(0, APROP_DamageFactor, 1.0-coef); Delay(1); } } |
А зачем так записанно? coef /= 2; Я еще не юзал /=, что оно значит? Это получается coef делится само на себя и равно двум? Что-то вообще не въехал.
То есть SetActivatorToTarget(); тоже подходит для того что бы узнать какая цель у монстра? | |
|
1 |
3 |
1 |
|
|
| |
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 05.11.15 21:03:13 | | | Ну да.
alekv: | Я еще не юзал /=, что оно значит? Это получается coef делится само на себя и равно двум? |
Нет, это значит что coef делится на два и результат записывается в coef. Аналогично для +=, -= и *=. А ещё &=, ~=, и ^= с |=.
Кстати, во всех рандомах МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ это не 255, а 256. ВСЕГДА. ВООБЩЕ ВСЕГДА. A_Jump, DropItem...
Писать 500 акторов это ересь. Весь декор Total Conversion'а должен умещаться в 100 акторов. Ключевое слово Total Conversion. | |
|
2 |
2 |
1 |
|
|
| |
Shadowman UAC General
| 8391 |
Doom Rate: 2.08 Posts quality: +1994 |
Отправлено: 05.11.15 21:25:25 | | | Мне тоже неясна эта строчка:
| int coef = CheckInventory("MyArmorCount")<<16>=0; |
А конкретно, что означает запись "<<16>=0"; А две последующие строки означают, что коэф делится на 2, и полученное значение делится еще на 100? То есть максимальный резист в итоге будет только 50%? Обязательно ли делать скрипт фоновым с постоянной проверкой брони? Может, проще включать скрипт один раз - при надевании/снимании брони в инвентаре, чтобы потом игрок спокойно ходил с заданным значением дамаж-фактора? (чисто субъективно -опасаюсь большого количества одновременно работающих ентер-скриптов да еще и висящих бесконечно. Может, зря, но единоразово выполняемые скрипты кажутся надежнее). | |
|
1 |
7 |
2 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 05.11.15 21:27:53 | | | ZZYZX: | Нет, это значит что coef делится на два и результат записывается в coef. Аналогично для +=, -= и *=. А ещё &=, ~=, и ^= с |=. |
А почему нельзя записать просто coef /2 ? Я просто так и не понял где применять эти все += -= итд.
ZZYZX: | Кстати, во всех рандомах МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ это не 255, а 256. ВСЕГДА. ВООБЩЕ ВСЕГДА. A_Jump, DropItem... |
Ну это я давно знал, еще с brightness понял что макс 256, только почему так хз.
ZZYZX: | Писать 500 акторов это ересь. Весь декор Total Conversion'а должен умещаться в 100 акторов. Ключевое слово Total Conversion. |
Не понял смысла, причем total conversion? У меня в старой поделке реально около 500 акторов 200 из них для брони, атаки остальные для инвентаря и шмотья разного, всего 5 сетов у каждой шмотки были еще + какие-то доп. акторы, но я тогда вообще ацс толком не знал, пользовался только if\else, а for, until, do, function для меня были как ночные кошмары, щас то конечно лучше знаю, но до хорошо мне еще далеко )
Кстати, тут назрел вопрос пр morph классы, я вот думал все как же имитировать приседания игрока, т.е. игрок нажал кнопки присесть, персонаж переходит в стейт crouch и height актора урезается в 2 раза, вот morph кажется подходит для этого, но обнаружил баг или я не знаю как это убрать, когда персонаж стоит около пола высота которого к примеру 128 и жму кнопку присесть, персонаж морфится в другого перса с уменьшеным height и сам запрыгивает на этот высокий пол.. Это баг вообще или что? морфил игрока ацс функциями.. Хотелось бы найти другой способ имитации приседания, но пока что не додумался, хотя есть вариант по нажатию кнопки присесть, делать игрока nonsolid, ставить картинки приседания, постоянно спавнить 2ого актора с +solid и с маленькой height в координатах игрока.. еще не проверял, способ геморный, но надеюсь что с морфом что-то получится.. | |
|
1 |
3 |
1 |
|
|
| |
Shadowman UAC General
| 8391 |
Doom Rate: 2.08 Posts quality: +1994 |
Отправлено: 05.11.15 21:30:18 | | | alekv: | Хотелось бы найти другой способ имитации приседания |
Не понял, а разве в гоззе по дефолту не учтено приседание игрока? Даже спрайт приседающего думера в гз архиве есть. Или тебе нужно какое-то особое приседание, тогда для чего? | |
|
1 |
7 |
2 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 05.11.15 22:00:31 | | | Shadowman: | Обязательно ли делать скрипт фоновым с постоянной проверкой брони? Может, проще включать скрипт один раз - при надевании/снимании брони в инвентаре, чтобы потом игрок спокойно ходил с заданным значением дамаж-фактора? (чисто субъективно -опасаюсь большого количества одновременно работающих ентер-скриптов да еще и висящих бесконечно. Может, зря, но единоразово выполняемые скрипты кажутся надежнее). |
У монстра в стейте Melee и\или messile должен запускаться void скрипт который будет чекать сколько защ. у игрока и в зависимости от защ. игрока ставится монстру атака.
Script "CheckPlayerDefence" (void)
{
int Monster_TID = UniqueTID(); Thing_ChangeTID(0,Monster_TID);//запоминаем тид монстра вызвавшего скрипт
SetActivatorToTarget(0);// ставим активатора на цель
if (CheckInventory("PlayerDefence")>0)//если у цели не будет defence(что значит это не игрок чтоли..), то и атака не изменится
{
int coef = CheckInventory("PlayerDefence")<<16>=0; //можно и без инвентори итема, т.е. вместо актора PlayerDefence объявить глобальную переменную.
coef /= 2;
coef /= 100;
SetActorProperty(Monster_TID, APROP_DamageFactor, 1.0-coef);//монстр будет бить с такой вот силой, которая изменяется в зависимости от защ игрока.
}
} вот примерно такие расчеты я имел ввиду, только вместо inventory вещи сделать глобальную переменную и тщательно высчитать баланс, что бы игрок чуствовал защиту когда одел вещь и когда снял
Добавлено спустя 7 минут 7 секунд:
Shadowman: | Не понял, а разве в гоззе по дефолту не учтено приседание игрока? Даже спрайт приседающего думера в гз архиве есть. Или тебе нужно какое-то особое приседание, тогда для чего? |
Есть в гоззе приседания, но в стейте Crouch манипуляций не сделаешь, уже не помню почему, но дефолтный crouch вообще не подходит. Потому пришлось искать замену. Приседание в целом.. в целом ничего особого, просто игрок жмет на кнопку, перс переходит в стейт crouch с помощью функции SetActorState(); в стейте crouch анимация присевшего перса и его height должна уменьшиться в 2 раза что бы он смог пролезть где либо... просто с морфом, очень удобно сделать такую имитацию, но что игрок во время морфа сам запрыгивает на высокие полы, прям баг какой-то.. | |
|
1 |
3 |
1 |
|
|
| |
Shadowman UAC General
| 8391 |
Doom Rate: 2.08 Posts quality: +1994 |
Отправлено: 05.11.15 22:14:54 | | | alekv: | У монстра в стейте Melee и\или messile должен запускаться void скрипт который будет чекать сколько защ. у игрока и в зависимости от защ. игрока ставится монстру атака. |
Зачем? При том способе, который предложил ZZYZX, достаточно менять игроку дамаж факторы с учетом надетой брони. И дефолтная атака монстра автоматически будет учитывать этот фактор - никаких доп. манипуляций в декорэйте не нужно. Собсно я тоже планировал пойти по этому пути, те же резисты в примерах завязаны на дамаж факторы.
alekv: | Есть в гоззе приседания, но в стейте Crouch манипуляций не сделаешь |
А какие манипуляции имеются в виду? Движение и стрельба работают как в обычном состоянии, так и в приседе. | |
|
1 |
7 |
2 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 05.11.15 22:25:01 | | | Shadowman: | Зачем?
При том способе, который предложил ZZYZX, достаточно менять игроку дамаж факторы с учетом надетой брони. И дефолтная атака монстра автоматически будет учитывать этот фактор - никаких доп. манипуляций в декорэйте не нужно. |
Да это я походу не понял хД Меня проглючило. подумал что damageFactor это сила атаки игрока... давно не возился с damagetype.. Так-то да, способ отличный.
Shadowman: | А какие манипуляции имеются в виду? Движение и стрельба работают как в обычном состоянии, так и в приседе. |
Самые простые манипуляции
Crouch:
CROU A 0 A_JumpIfInventory("Crouch",1,"Spawn")
CROU A 1 A_JumpIfInventory("Crouch",0,"Spawn")
Loop
CrouchMove:
CROU A 0 A_Recoil(-0.5)
CROU AAAA 1 A_JumpIfInventory("Crouch",1,"Spawn")
CROU B 0 A_Recoil(-0.5)
CROU BBBB 1 A_JumpIfInventory("Crouch",1,"Spawn")
CROU C 0 A_Recoil(-0.5)
CROU CCCC 1 A_JumpIfInventory("Crouch",1,"Spawn")
Goto Crouch Почему не подходит дефолтное приседание с трудом пытаюсь вспомнить.. по моему для стандартного приседания нет спец. стейта т.е. можно прописать в проперти актора игрока стейты приседания Player.CrouchSprite "CROU", но мне нужен именно стейт в котором можно самому настроить кадры, запускать функции и т.д. Потому то и нужна замена.
Добавлено спустя 8 минут 56 секунд:
Вот еще хотел бы узнать, я как-то мучался с thrustThing.. В общем есть 2 актора с разной Z координатой Start_Point и End_Point, когда игрок касается Start_Point срабатывает скрипт и игрока должно тянуть к End_Point, вот как такое сделать? Я помню что мои мучения не дали мне нормальных результатов, может можно как-то просто это реализовать? | |
|
1 |
3 |
1 |
|
|
| |
Shadowman UAC General
| 8391 |
Doom Rate: 2.08 Posts quality: +1994 |
Отправлено: 05.11.15 23:00:07 | | | Посмотрел вики и мне стало неясно, где же указывать тип пресловутого дамаж фактора в скрипте? В вике читаем:
APROP_DamageFactor Generic damage factor for the actor, in fixed point. It is applied before any specific DamageFactor. В скрипте записано: SetActorProperty(0, APROP_DamageFactor, 1.0-coef); А как понять, что нужно, например, уменьшить дамаг фактор только типа "Огонь"? или "нормал", а огонь оставить без изменений? Или уменьшить 3 фактора из возможных 5? Где в скрипте указания на тип уменьшаемого дамаг фактора? | |
|
1 |
7 |
2 |
|
|
| |
VladGuardian = Commissar =
| 5537 |
Doom Rate: 1.28 Posts quality: +1934 |
Отправлено: 05.11.15 23:11:07 | | | Shadowman: | как понять, что нужно, например, уменьшить дамаг фактор только типа "Огонь"? или "нормал", а огонь оставить без изменений? |
В другой статье указан какой-то хитрый "type": http://zdoom.org/wiki/Actor_properties#DamageFactor В разделе: Actor Properties/Behaviour
DamageFactor type, value | |
|
4 |
10 |
23 |
|
|
| |
Shadowman UAC General
| 8391 |
Doom Rate: 2.08 Posts quality: +1994 |
Отправлено: 05.11.15 23:24:42 | | | VladGuardian: | В другой статье указан какой-то хитрый "type": |
Ну это же в декорэйте актора прописываешь. На каждый тип вешаешь свой коэффициент. А мне нужно совсем другое - где в вышеупомянутом скрипте этот "тип" показывать? | |
|
1 |
7 |
2 |
|
|
| |
VladGuardian = Commissar =
| 5537 |
Doom Rate: 1.28 Posts quality: +1934 |
Отправлено: 05.11.15 23:48:13 | | | Shadowman: | А мне нужно совсем другое - где в вышеупомянутом скрипте этот "тип" показывать? |
Могу сильно ошибаться, но судя по документации, она какбэ намекает, что возможно, множители для конкретных damage types изменять из скрипта нельзя. (?) Только лишь общий множитель (generic factor).
Есть еще нелегальный нетрадиционный путь решения проблемы: скачать несколько крутых крупных "фирменных" GZ-вадов и поискать строки вида "DamageFactor", "damage factor", "factor". (если скрипты конечно, не скомпилированы и не переведены в нечитаемый вид) Это мой путь, иногда этим пользуюсь. Вставляет порой похлеще любого нудного учебника по скриптам. | |
|
4 |
10 |
23 |
|
|
| |
theleo_ua = Colonel =
| 4802 |
Doom Rate: 1.8 Posts quality: +1032 |
Отправлено: 06.11.15 00:42:15 | | | alekv: | Не ну тут как бы особо сложного наверное нет, есть же функция SetActorProperty(); в которой можно изменять damage актора. |
Т.е. для каждого актора придется в spawn и raise стейтах вызывать такой скрипт? И он точно сработает на тех акторах, которые стреляют проджектайлами, a_blast-ами или "spawnitem poisonbag"-ами?
ZZYZX: | Кстати, во всех рандомах МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ это не 255, а 256. ВСЕГДА. ВООБЩЕ ВСЕГДА. A_Jump, DropItem... |
кроме A_SpawnItemEx: http://zdoom.org/wiki/A_SpawnItemEx
цитата: chance: This is the chance (out of 255) that the actor has of not spawning. If this is 0 or omitted, the actor will always spawn. If it is 255, it will never spawn.
Ну или в вики ошибка | |
|
3 |
1 |
|
|
| |
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 06.11.15 13:04:17 | | | Цитата из кода ZDoom (thingdef_codeptr.cpp если что):
if (chance > 0 && pr_spawnitemex()<chance ) Следовательно если pr_spawnitemex вернёт 255 (а он может, там 8битный рандомайзер, неограниченный, т.е. 0 до 255), будет жопа. Причём жопа буквально случайная и совершенно неотлаживаемая.
В вики кстати уже было такое один раз.
Добавлено спустя 12 минут 27 секунд:
Shadowman: | А как понять, что нужно, например, уменьшить дамаг фактор только типа "Огонь"? или "нормал", а огонь оставить без изменений? Или уменьшить 3 фактора из возможных 5? |
Никак. Через ACS можно только общий менять. Но в общем-то оригинальный армор только "от всего сразу" и защищал. Я думаю если поковыряться, то можно и это тоже сделать без создания кучи отдельных классов. | |
|
2 |
2 |
1 |
|
|
| |
TesaQ = Warrant Officer =
| 1149 |
Doom Rate: 1.72 Posts quality: +368 |
Отправлено: 06.11.15 14:35:14 | | | а как создать линию, которая блокировала бы определенный тип монстров? | |
|
| |
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 06.11.15 16:03:44 | | | Никак. | |
|
2 |
2 |
1 |
|
|
| |
alekv - Colonel -
| | 4168 |
Doom Rate: 1.87 Posts quality: +949 |
Отправлено: 06.11.15 18:17:38 | | | TesaQ: | а как создать линию, которая блокировала бы определенный тип монстров? |
Никак, это да, но все таки есть черезжопный вариант и не совсем блокировка, просто когда монстр попытается пройти линию, отбрасывать его назад или поворачивать монстра на 180 градусов, в общем сделать все что бы монстр не прошел линию.
theleo_ua: | Т.е. для каждого актора придется в spawn и raise стейтах вызывать такой скрипт? И он точно сработает на тех акторах, которые стреляют проджектайлами, a_blast-ами или "spawnitem poisonbag"-ами? |
Честно не задумывался, просто предположил что проще все же менять атаку монстру, но т.к. damagetype видимо менять нельзя да и не только дамаге тип, тогда конечно ты нашел лучший вариант.
alekv: | Вот еще хотел бы узнать, я как-то мучался с thrustThing.. В общем есть 2 актора с разной Z координатой Start_Point и End_Point, когда игрок касается Start_Point срабатывает скрипт и игрока должно тянуть к End_Point, вот как такое сделать? Я помню что мои мучения не дали мне нормальных результатов, может можно как-то просто это реализовать? |
Очень актуальный вопрос, помогите ответом | |
|
1 |
3 |
1 |
|
|
| |
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 06.11.15 21:40:15 | | | "Тянуть к End_Point" выражается как-то так:
int DiffX = GetActorX(End_Point)-GetActorX(Player);
int DiffY = GetActorY(End_Point)-GetActorY(Player);
int DiffZ = GetActorZ(End_Point)-GetActorZ(Player);
int DiffLen = VectorLength(VectorLength(DiffX, DiffY), DiffZ);
DiffX = FixedDiv(DiffX, DiffLen);
DiffY = FixedDiv(DiffY, DiffLen);
DiffZ = FixedDiv(DiffZ, DiffLen);
SetActorVelocity(Player, DiffX, DiffY, DiffZ, true, false); Если умными словами, то в результате этого кода появляется трёхмерный нормализованный вектор, указывающий в направлении притягивающей точки. Если нужно, чтобы тянуло сильнее, множишь DiffX/Y/Z на нужную цифру (вместо 1). | |
|
2 |
2 |
1 |
|
|
| |
Kragoth762 = Master Sergeant =
| 474 |
Doom Rate: 1.93 Posts quality: +47 |
Отправлено: 06.11.15 23:06:08 | | | Как сделать так чтобы определенный скрипт сработал (напрмер смена текстур) когда оказываешься в сектор с определенным тегом? И еще Слэйд конвертит в соответствии с думовской палитрой. Как бы задать индексацию цветов (набор из 256-ти цветов) близкую к оригиналу ?
| |
|
| |
VladGuardian = Commissar =
| 5537 |
Doom Rate: 1.28 Posts quality: +1934 |
Отправлено: 07.11.15 00:12:35 | | | ZoD: | Как сделать так чтобы определенный скрипт сработал (напрмер смена текстур) когда оказываешься в сектор с определенным тегом? |
Похоже, надо положить в нужный тебе сектор особый Thing: http://zdoom.org/wiki/Classes:SecActEnter
(т.е. в DoomBuilder-е кладешь в сектор Thing / Sector Actions / Actor enters sector) Останется только настроить этот Thing. | |
|
4 |
10 |
23 |
|
|
| |