Давай только не будем начинать тут эту ахнею, хорошо? Лучшеб написал чё нить по делу.
Да! я не по делу пишу! да! я всегда всякую бредятину пишу! да!!! я такой, сякой!!! да! достали все!!! особенно ты! я обиделся...... у меня и так всё хреново, всем пока!
Просьба не надо кипятиться! Скаладин
_________________ Зам.Клан-Лидера
Skaladin
Заголовок сообщения: Re: скриптинг и всё что с ним связано(DECORATE и т.п.)
Любимый порт: GZDOOM, SKULLTAG Любимое оружие: ССГ, Плазмаган Любимые карты в Duel32: Нет таких, не больно люблю дуэли. Я больше люблю кооператив.
-ILOK- GenesisOmega не буду разводить холивар, но лучше не будем писать всякую фигню друг другу, ок? Всё заканчиваем этот трёп и возвращаемся к теме, а то начался офтоп)
_________________ TRANE
Skaladin
Заголовок сообщения: Re: скриптинг и всё что с ним связано(DECORATE и т.п.)
Любимый порт: GZDOOM, SKULLTAG Любимое оружие: ССГ, Плазмаган Любимые карты в Duel32: Нет таких, не больно люблю дуэли. Я больше люблю кооператив.
скрипт надо извлечь из вада и раскомпилировать(он по идее скомпилированный должен быть, хотя бывает и иначе), а далее проискивать по координатам(где ракеты вылетают, думаю в думбилдере места должны быть как нить помечены). Далее дело техники - методом научного тыка правишь код спавна ракет в нужных местах(или лучше основываясь на этом скрипте, пишешь свой). Да и ещё раз говорю - я ещё не постиг АЦ пока что, так что всё растолковать не смогу(пока скриптить именно под мапу не пробовал)
-- 5 месяцев 9 дней 8 часов 45 секунд --
Долго думал о том, что же написать в уроке про декорейт. Многим на ум приходит попытка запилить свои собственные оружия, монстров и т.п. Все естесно сталкиваются с проблемой не понимания основ и примитивов. Для интереса я попытаюсь объяснить как я понимаю вообще декорейт. Мб это поможет начинающим понять основы и поможет не запутаться.
Первым делом надо запомнить 2 очень хороших сайта - гугл и здум-вики. Так же в инете есть "декорейт для чайников", небольшой справочник на русском. Для чего это? - это поможет потом в отыскивании нужных инструкций(команд, опкодов, как угодно можно назвать).
Чтоже такое декорейт - говорят разные вещи, но я скажу как понимаю я - язык, который отдаёт отдаёт сильно ЛУА скриптами. Отличие этого языка к примеру от того же АЦС - его не нужно компилировать. Компиляция происходит непосредственно уже в самой игре, а если говорить ещё точнее - то при запуске(да да, окошечко там вылазит где и т.п.). Это в свою очередь помогает извлекать грубые ошибки.
Стоит запомнить одну вещь - в игре любой предмет\игрок\дерево\монстр\оружие - это "АКТОР". Конструкция любого оружия\вещи\монстра примерно такова:
ACTOR "Название актора" : "Тип актора" { Параметры\флаги { Код самого актора. Часто говорят, что тут стейты, я называю их потоками. } }
Последние две скобки завершающие.
Собственно на счёт имени актора - вроде как на имя игра никак не реагирует, т.е. регистр букв(строчные или заглавные) может быть абсолютно любой. На счёт кол-ва символов в имени я не помню, но советую не использовать больно длинные имена.
Собсна в типе актора прописывается для чего этот актор и что он делает. У монстров тип не указывается. У оружий\инвенторий и подобных фентифлюшек всё это указывается. Т.е. нельзя игроку выдать оружие, если там не указано, что это оружие. Так же на месте типа может указываться на чём актор будет основываться. Об этом будет немного по позже.
В коде самого актора существуют различные потоки(стейты), которые отвечают за то, что будет в данный момент твориться на экране.
У монстров\оружий\инвенторий\ потоки разные - не думайте в оружии использовать потоки от монстра например, игра просто начнёт тупить или выдаст ошибку при компиляции.
В данный момент я буду ща рассматривать код простого думовского пистолета и код простого думовского зомбаря дабы дать понять в чём же их разница.
Пистолет, начнём пожалуй. ACTOR Pistol : DoomWeapon 5010 { Game Doom Weapon.SelectionOrder 1900 Weapon.AmmoUse 1 Weapon.AmmoGive 20 Weapon.AmmoType "Clip" Obituary "$OB_MPPISTOL" +WEAPON.WIMPY_WEAPON Inventory.Pickupmessage "$PICKUP_PISTOL_DROPPED" Tag "$TAG_PISTOL" States { Ready: PISG A 1 A_WeaponReady Loop Deselect: PISG A 1 A_Lower Loop Select: PISG A 1 A_Raise Loop Fire: PISG A 4 PISG B 6 A_FirePistol PISG C 4 PISG B 5 A_ReFire Goto Ready Flash: PISF A 7 Bright A_Light1 Goto LightDone PISF A 7 Bright A_Light1 Goto LightDone Spawn: PIST A -1 Stop } }
Начнём с самой первой строки. ACTOR Pistol : DoomWeapon 5010 ACTOR - актор Pistol - имя актора оружия, в данном случае это пистолет, название его актора. DoomWeapon - тип, вообще я хочу заметить одну вещь, что это зашитый в движок тип и он указывает непосредственно, что это думовское оружие. Когда будете пробывать создать своё оружие, указывайте просто Weapon во избежании ошибок. 5010 - на это число не обращаем внимание, это тоже стандартное число, пробитое в движке. Нахрена оно, я так и не понял. Если вздумаете брать для модифицирования актор какого либо оружия из gzdoom.pk3, то удаляйте сразу же подобные вещи.
Далее у нас идут параметры оружия. Game Doom - указывает, что оружия для игры дум, как мы помним, есть ещё херетик и т.п. Weapon.SelectionOrder 1900 - это параметр автоматического выбора оружия. Приориет выставляет. Обычно к примеру в думе тот же рокетланчер выбирается самым последним, если патронов нет - собсна этот параметр и делает подобную фишку. Weapon.AmmoUse 1 - сколько патронов юзает оружие при выстреле Weapon.AmmoGive 20 - сколько патронов даётся при подборе оружия. Я не знаю зачем тут онное значение, ведь пистолета грубо говоря в думе в открытом виде не найти. Он заранее в руках игрока. Weapon.AmmoType "Clip" - какой тип патронов использует данное оружие. В данном случае пистолетные патроны. Obituary "$OB_MPPISTOL" - тут у нас надпись, вроде при смерти игрока от данного оружия выльется данная мессага. Состоит из двух частей $OB_MP и PISTOL. $OB_MP - точно не помню, что это, но там фиксированное слово. Работает это в мультиплеере. +WEAPON.WIMPY_WEAPON - это указывает игре на то, что оружие слабое. Если например патронов на шотгане нет, то при подборе этих самых патроновигра автоматом переключит на сам шотган. Inventory.Pickupmessage "$PICKUP_PISTOL_DROPPED" - пишет на экране мессагу(сообщение), о том, что подобрано данное оружие. Сюда можно тупо прописать что то своё. Tag "$TAG_PISTOL" - индивидуальный таг оружия.
И так вот мы приблизились к концу, к потокам или как их ещё называют - стейтам оружия. States - стейты(потоки) { Ready: - тут у нас пишется то, что будет происходить на экране, когда оружие уже выбрано. PISG A 1 A_WeaponReady PISG - название спрайта пистолета. A - кадр, который висит в данный момент на экране. О кадрах я напишу по ниже. 1 - скорость проигрывания кадра, ещё их называют тиками. A_WeaponReady - инструкция, которая говорит, что оружие в данный момент находится в неактивном состоянии. Кстати говоря если этой инструкции не будет в данном потоке, то оружие всегда будет в том месте, в котором вы его назначили. Т.е. при хотьбе\беге оно не будет двигаться ни при каких условиях. Обычно если вы не делаете чего то необычного, то данную инструкцию надо ставить в своём оружии, дабы оно нормально реагировало на бег) Но кстати говоря движение оружия при беге\хотьбе можно поменять, как и поведение камеры. Loop - повторять, это что то типа конца данного потока, говорит повторять его без конца. Deselect: - поток, который отвечает за убирание оружия, за тот момент, когда оружие убирается и выбирается другое. PISG A 1 A_Lower PISG A 1 - как я писал выше, название спрайта, кадр и скорость проигрывания. A_Lower - Это что то типа автоматического убирания оружия из полезрения, т.е. говорит оружию плавно спускаться вниз, при достижении минимальной точки невидимости сразу же выбирается другое оружие. Loop - как и писалось выше, повторять выполнение кода Select: - данный поток, отвечает за то, что происходит на экране, когда данное оружие выбирается. PISG A 1 A_Raise PISG A 1 - как я писал выше, название спрайта, кадр и скорость проигрывания. A_Raise - медленно поднимает оружие вверх, до нужного момента(а если говорить точнее - офсета). Тоже автоматическое, как и в deselect A_Lower Loop - повторять Fire: - самое интересное место, поток, который отвечает за стрельбу данного оружия. PISG A 4 - как я писал выше, название спрайта, кадр и скорость проигрывания. PISG B 6 A_FirePistol PISG B 6 - как я писал выше, название спрайта, кадр и скорость проигрывания. A_FirePistol - инструкция, зашитая в движок дума, говорит выстрелить 1 простой пулей с определённым разбросом. Если буду писать другой урок, то расскажу, как задать свой разброс, свой тип пуль и т.п.) PISG C 4 - как я писал выше, название спрайта, кадр и скорость проигрывания. PISG B 5 A_ReFire PISG B 5 - как я писал выше, название спрайта, кадр и скорость проигрывания. A_ReFire - эта инструкция говорит выполнять код выстрела заного, если зажата клавиша выстрела(ну или так часто нажимается). Для альтфаира такая инструкция тоже работает. Goto Ready - после выстрела игра автоматически переходит в поток готовности оружия. Flash: - этот поток особый, работает он по особому, одновременно с потоком Fire. Наверняка когда просмотривали спрайты пистолета, вы замечали, что у него есть отдельные спрайты выстрела. Вот собственно эта штука и происходит тут. Совмещает спрайты простого выстрела и спрайты огня. PISF A 7 Bright A_Light1 PISF A 7 - как я писал выше, название спрайта, кадр и скорость проигрывания. Bright - это означает, что при вопроизведении данного кадра, он засветится как сам, так и будет ещё непосредственно свет на уровне. Типа свет от выстрелов(точнее иммитация) A_Light1 - это я не помню что, но вроде бы тоже зашитая в движок инструкция, относящаяся к пистолету. Goto LightDone - закончить совмещение. PISF A 7 Bright A_Light1 Goto LightDone - тут тоже самое, что и выше. Spawn: - показывает то, как выглядит пистолет в самой игре, как валяется на уровне. Ну это технически говоря конечно. PIST A -1 - как я писал выше, название спрайта, кадр и скорость проигрывания, но тут я хочу заметить, что -1 говорит игре, что спрайт показывается не 1 раз, а постоянно. Stop - обозначает остановить. } }
И так в конец напишу одну вещь на счёт кадров, чтобы наконец стало понятно, что да как, зачем и почему именно в таком виде.
Возьмём название спрайта нашего пистолета PISGA0 - у него особая конструкция. PISG - это название, A - это название кадра, а 0 обозначает, что у спрайта нет сторон и он одноразовый. Так же наверное вы заметите, что такое и у монстров и остальных оружий. PISG A 1 - теперь сравним и то и это) Надеюсь сходство видно и мне не придётся рассказывать об этом ещё раз)
Так вот на счёт названий и кадров. У всех спрайтов предметов\монстров\игрока\оружий название спрайта всего 4 символа. Замечу так же, что это правило стоит усвоить при подготовке своих спрайтов. Сначала идёт название из 4-х символов(даже можно совать числа), потом название кадра и потом угол поворота(одноразовость, для оружий нужно ставить нули, ибо сторон то у него нет на экране). Углы поворота можно поставить даже предметам в игре, которое разбросано на карте. Многие замечали, что у монстры нарисованы с разных ракурсов, такое можно сделать и у предметов. Достаточно нарисовать предмет с разных ракурсов и поставить углы повотора в названии. Для примера я возьму названия спрайтов пинки: SARGA1 SARGA2A8 SARGA3A7 SARGA4A6 SARGA5 Цифры обозначают угол поворота спрайта. Это тоже стоит усвоить. Угол поворота можно ставить обратный(т.е. не A2A8, а A8A2 и т.п.), если у вас случайно спрайты находятся в реверсе, а переделывать лень. Так же замечу ещё одну вещь - можно нарисовать монстра не только с 5 ракурсов, но и с 8, как например у чаинганнера: CPOSA1 CPOSA2 CPOSA3 CPOSA4 CPOSA5 CPOSA6 CPOSA7 CPOSA8 Тут названия немного другие, но суть осталась та же. Кстати фишка с обратными ракурсами прёт тоже здесь.
Думаю на этом можно пока остановиться. Комментим, засираем, оцениваем, поливаем говном мои говноуроки и т.п., вообщем как обычно))))
Любимый порт: GZDOOM, SKULLTAG Любимое оружие: ССГ, Плазмаган Любимые карты в Duel32: Нет таких, не больно люблю дуэли. Я больше люблю кооператив.
Ну в игре есть соответствующая инструкция. Ах лана, вот те код)
ACTOR HellKnight : BaronOfHell 69 { Game Doom SpawnID 113 Health 500 -BOSSDEATH SeeSound "knight/sight" ActiveSound "knight/active" PainSound "knight/pain" DeathSound "knight/death" HitObituary "$OB_KNIGHTHIT" Obituary "$OB_KNIGHT" States { Spawn: BOS2 AB 10 A_Look Loop See: BOS2 AABBCCDD 3 A_Chase Loop Melee: Missile: BOS2 EF 8 A_FaceTarget BOS2 G 8 A_BruisAttack Goto See Pain: BOS2 H 2 BOS2 H 2 A_Pain Goto See Death: BOS2 I 8 BOS2 J 8 A_Scream BOS2 K 8 BOS2 L 8 A_NoBlocking BOS2 MN 8 BOS2 O -1 Stop Raise: BOS2 O 8 BOS2 NMLKJI 8 Goto See } }
Стандартный код рыцаря ада, собсна копнём чуть глубже. У монстра есть стандартная зашитая в движок инструкция A_BruisAttack, поэтому в потоке mellee тупо ни чё нет, точнее при переходе в этот поток, игра сразу переходит в поток Missile. Mellee означает милийную или ближную атаку, а Missile обозначает атаку файрболлом. Зачем это объяснение, а за тем, что нам придётся таки переписать эти два потока под себя. Собсна правленый код:
ACTOR HellKnight : BaronOfHell { Game Doom SpawnID 113 Health 500 -BOSSDEATH SeeSound "knight/sight" ActiveSound "knight/active" PainSound "knight/pain" DeathSound "knight/death" HitObituary "$OB_KNIGHTHIT" Obituary "$OB_KNIGHT" States { Spawn: BOS2 AB 10 A_Look Loop See: BOS2 AABBCCDD 3 A_Chase Loop Melee: BOS2 EF 8 A_FaceTarget BOS2 G 8 A_CustomMeleeAttack(6) Goto See Missile: BOS2 EF 8 A_FaceTarget BOS2 G 8 A_CustomMissile("BaronBall") Goto See Pain: BOS2 H 2 BOS2 H 2 A_Pain Goto See Death: BOS2 I 8 BOS2 J 8 A_Scream BOS2 K 8 BOS2 L 8 A_NoBlocking BOS2 MN 8 BOS2 O -1 Stop Raise: BOS2 O 8 BOS2 NMLKJI 8 Goto See } }
Собсна что же я сделал, я в поток Melee добавил инструкцию A_CustomMeleeAttack(6), а в поток Missile добавил A_CustomMissile("BaronBall"). Первая инструкция обозначает удар в ближнем бою. У этой инструкции есть ещё параметры, а именно:
A_CustomMeleeAttack ( ущерб,"звук попадания", "звук промаха", "дамаг тип", будет ли кровоточить актор при попадании) ущерб - число, означает ущерб, который получаешь при попадании по тебе. "звук попадания" - звук попадания, это звук, который будет звучать, когда по тебе попадают. Пишется звук так же в ковычках "звук промаха" - звук, который воспроизведётся при промохе(если по тебе не попали, но монстр атаковал) Пишется тоже в кавычках "дамаг тип" - это специальный параметр. Например ты захотел, чтобы у тебя монстр вырывал сердце при смерти, собсна этот параметр это и делает, указывает конкретный тип атаки, на сколько помню, сюда так же можно забить тип "пуфов" свой. Если не собираешься делать что то особенное - не юзай. Тоже в ковычках будет ли кровоточить актор при попадании - так и расшифровывается как написано, чуть не забыл, тут пишется число, на сколько помню 1 это да, а 0 это нет. Пример: A_CustomMeleeAttack(30, "hiting", "hitingFail", "Mydamage", 1), думаю расшифровывать не нужно)
Так собсна A_CustomMissile("BaronBall") Эта инструкция говорит выстрелить монстру 1 проджектайлом(снарядом), в нашем случае фаирболлом барона. Да да, рыцарь ада и барон юзают один и тот же фаирболл. Так и под конец ещё кое что. Заменяем нашего нового рыцаря ада, на того, который был.
Actor NewHellKnight : HellKnight replaces HellKnight { States { Melee: BOS2 EF 8 A_FaceTarget BOS2 G 8 A_CustomMeleeAttack(6) Goto See Missile: BOS2 EF 8 A_FaceTarget BOS2 G 8 A_CustomMissile("BaronBall") Goto See } }
Этот код упрощёный и одновременно изменённый, так же заменяет оригинального рыцаря ада, на нового. Небольшая расшифровочка: Actor NewHellKnight : HellKnight replaces HellKnight - Тут мы создаём нового рыцаря ада, который основывается на старом(Actor NewHellKnight : HellKnight) и заменяем обычного рыцаря на нового(replaces HellKnight). Почему создаём, а не редачим? Чтобы потом мы в дальнейшем не удивлялись почему у нас игра при компиляции в окошке выдаёт варнинг, а потом в процессе тупит. Нижние строки взяты из нашего модифленого рыцаря ада. Надо всего 2 потока, т.к. у нас монстр не нулячий, а именно основан, то игра автоматически берёт параметры и код сразу из двух мест. Ну и ответ на твой вопрос в конце концов, тебе нужно редачить инструкцию A_CustomMeleeAttack, добавляешь по желанию в неё нужные тебе звуки(звук попадания, звук промаха) и урон. Кстати под конец, урон можно сделать рандомным, если хочется чего то необычного. Достаточно в уроне прописать вот так - random(число1, число2), число1 и число2 задают диапазон рандома, т.е. если будет например random(4, 10), то игра будет автоматически брать случайное число в диапазоне 4-10. Дерзай. Собственно всё. Если чё не понятно, задавай вопросы.
_________________ TRANE
Skaladin
Заголовок сообщения: Re: скриптинг и всё что с ним связано(DECORATE и т.п.)
Вот я и вытащил искры из LOS.pk3 все знают ЛОСя а я вытащил искры от туда и запихнул в отдельный wad файл)) видео где я показал и рассказал всё, и два вада sparks.wad - там только искры, а на MAP01.wad там только карта, запускаем сразу два вада и будет счастье)) ну или через гздумбилдер как на видео я запускал)
Любимый порт: gzdoom Любимое оружие: Двухстволка и бфг9000 Любимые карты в Duel32: SSL2, judas, oblivx, shoot, king, moo, dwango-map07
GhosTDoomer Да это полезный туриал, особенно для любителей гозовских баз Казалось бы искорки, а сколько пришлось перерыть папок и декорейтов и спрайтов
_________________ Клан-Лидер
GhosTDoomer
Заголовок сообщения: Re: скриптинг и всё что с ним связано(DECORATE и т.п.)
Skaladin так главное теперь не нужно заморачиваться со скриптами что бы искры сделать, они декорейтом теперь идут, просто вставил на карту и работает!)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения