Добавляем новый тип монстра в SDK


Добавляем новый тип монстра в SDK
Автор: Heming_Hitrowski


Статья предусматривает то, что вы умеете
создавать директории для модов, а также что у вас имеется Visual C++ 6.0
он полностью настроен на работу с SDK. Также данная статья
предусматривает, что Вы разобрались с редактированием классов Serious
Sam: TSE. ©



Всем привет! В этой статье я научу вас, как добавить новый тип врага в SDK. Я думаю, немало кто хотел сделать новый тип врага, поэтому я и написал эту статью.Вот примеры новых типов монстров в SDK:

 

 

 

 

Новый монстр - ракетометчик (Автор: SeriousAlexej)
Парочка новых видов биомеханоида от Heming_Hitrowski


Ну чтож, приступим.

Возьмем за основу файл Walker.es. Для начала, определимся, как и чем он будет стрелять.
Статья повествует о том, как:

 

  • Создать нового биомеханоида
  • Создать собственную функцию атаки
  • Создать новый вид Projectile

И многое другое..

В этой статье мы научимся регулировать:

 

 

 

  • Очки при убийстве (мелочь, а приятно)
  • Расстояние при выстреле
  • Скорость выстрелов
  • Скорость ходьбы
  • Количество здоровья у врага.


В дальнейшем, вы сами сможете пополнить этот список.

 

 

 

 

  • Часть 1. Добавляем новый тип врага


Откроем наш файл Walker.es и найдем строки:

enum WalkerChar {
  0 WLC_SOLDIER   "Soldier",    // soldier
  1 WLC_SERGEANT  "Sergeant",   // sergeant


И добавим сюда наш тип монстра:

  2 WLC_GENERAL  "General",   // general

Сейчас мы добавили параметр к перечислению "Тип". Теперь вы можете обнаружить новый тип монстра в поле Character.

Добавим переменные, которые вы сможете изменять прямо в редакторе:
После строки 5 FLOAT m_fThreatDistance = 5.0f,
Добавим:

 

 

 


20 FLOAT m_fShootWaitTime ''Shoot Wait time" = 0.5f, // Регулирует выстрел 2 пушки (время в секундах)
21 INDEX m_iHealthOfGeneral "Health" = 400, // Здоровье нового типа монстра
22 FLOAT m_fGenAttackRunSpeed "Speed" = 10.0f, // Скорость монстра при беге
23 INDEX m_iScore "Score" = 5500, // Очки при убийстве
24 FLOAT m_fGeneralThreatDistance "Threat Distance" = 20.0f, // Расстояние угрозы

 

 


Далее мы добавим новые файлы к нашему биомеханоиду, то есть текстуру, или модель пушки.
После строки  65 sound   SOUND_SERGEANT_WALK        "Models\\Enemies\\Walker\\Sounds\\Sergeant\\Walk.wav",
добавим следующее:

 

 


 // ********** GENERAL **********

 80 sound   SOUND_GENERAL_FIRE        "Models\\Weapons\\DoubleShotgun\\Sounds\\Fire.wav",
 81 texture TEXTURE_WALKER_GENERAL    "Models\\Enemies\\Walker\\Walker03.tex",
 82 texture TEXTURE_WALKER_GENGUN        "Models\\Enemies\\Walker\\GenRocketLauncher.tex",

 

 


 


Примечание: Чтобы удобнее ориентироваться в своем коде, вы можете ставить комментарии в стиле языка C или C++, например:

 // ********** GENERAL **********

 80 sound   SOUND_GENERAL_FIRE        "Models\\Weapons\\DoubleShotgun\\Sounds\\Fire.wav", // Огонь
  81 texture TEXTURE_WALKER_GENERAL    "Models\\Enemies\\Walker\\Walker03.tex", // Текстура генерала
 82 texture TEXTURE_WALKER_GUN        "Models\\Enemies\\Walker\\GenRocketLauncher.tex", // Текстура оружия


Можно и на русском языке.

Также вы можете "отложить на потом" определенный участок кода с помощью комментария в стиле языка C:

/* 81 texture TEXTURE_WALKER_GENERAL    "Models\\Enemies\\Walker\\Walker03.tex",
  82 texture TEXTURE_WALKER_GUN        "Models\\Enemies\\Walker\\GenRocketLauncher.tex", */


Далее, добавим ссылку к текстовому файлу описания нового типа врага, получаемый в инертане:
После строки static DECLARE_CTFILENAME(fnmGeneral, "Data\\Messages\\Enemies\\WalkerBig.txt");
добавим код:
static DECLARE_CTFILENAME(fnmSergeant, "DataMP\\Messages\\Enemies\\WalkerGen.txt");

И после case WLC_SERGEANT: return fnmSergeant; добавим case WLC_GENERAL: return fnmGeneral;
С описанием покончено. Теперь мы переходим к предварительному кэшированию ресурсов( дабы консоль не ругалась :)).
После строки PrecacheClass(CLASS_PROJECTILE, PRT_WALKER_ROCKET); добавим следующий участок кода:


       if (m_EwcChar==WLC_GENERAL)
    {
      // sounds
      PrecacheSound(SOUND_GENERAL_FIRE);

      // model's texture
      PrecacheTexture(TEXTURE_WALKER_GENERAL);
      // weapon
      PrecacheTexture(TEXTURE_WALKER_GENGUN);
      // projectile
      PrecacheClass(CLASS_PROJECTILE, PRT_GENERAL_LASER);
      }

 



Все. Ошибки с предварительным кэшированием теперь больше не будут мучать нас в консоли.
А теперь - самое интересное:

 

 

 

  •  Часть 2. Редактируем функцию атаки


Возможно, самая вкусная часть этой статьи (-: Прописываем функцию атаки нашего монстрика:

После строк:

//      m_fLockOnEnemyTime = 0.25f;
//      autocall CEnemyBase::LockOnEnemy() EReturn;
    }

Добавим следующее:

 

 

 

 


if (m_EwcChar==WLC_GENERAL) { // Если наш монстр - Генерал, то...
      StartModelAnim(WALKER_ANIM_FIRERIGHT, AOF_LOOPING); // Стартует анимация стрельбы правой пушки
      ShootProjectile(PRT_GENERAL_LASER, FIRE_RIGHT_ARM*m_fSize, ANGLE3D(0, 0, 0)); // Выстрел снарядом
      PlaySound(m_soFire1, SOUND_GENERAL_FIRE, SOF_3D); // Играть звук выстрела генерала
      autowait (m_fShootWaitTime); // Ожидает определенное время, заданное пользователем
      autocall CEnemyBase::LockOnEnemy() EReturn;
      StartModelAnim(WALKER_ANIM_FIRELEFT, AOF_LOOPING); // Стартует анимация стрельбы левой пушки
      ShootProjectile(PRT_GENERAL_LASER, FIRE_LEFT_ARM*m_fSize, ANGLE3D(0, 0, 0)); // Выстрел снарядом
      PlaySound(m_soFire2, SOUND_GENERAL_FIRE, SOF_3D); // Играть звук выстрела генерала
    }

 

 

 


Как вы видите, я расписал практически все функции на комментарии.

 

 

 

-Сохраните документ-
Ctrl+S


С функцией атаки практически покончено. Остался один важный момент:

 

 

 

Чем же все-таки будет стрелять наш генерал?


Мы будем использовать новый вид снаряда - PRT_GENERAL_LASER.
Сейчас мы заходим в Projectile.es и прописываем там характеристики снаряда..

 

 

 

  • Часть 3. Создаем новый вид Projectile


Зайдя в Projectile.es ( он находится в папке weapons ) найдем строчку:
77 PRT_METEOR                "Meteor",
И добавим после нее наш вид снаряда:

// General Walker ->
78 PRT_GENERAL_LASER               "General Laser",
// <- General Walker


Добавили? Отлично! Приступаем к следующему шагу, предварительному кэшированию. Не бойтесь, тучу кода мы вставлять не будем, мы вставим всего лишь одну строчку.
Найдите:
case PRT_CYBORG_LASER:     
case PRT_CYBORG_BOMB:

И после этого вставьте туда наш вид Projectile.
Далее, снова ищем код:

 

 

 


 case PRT_CYBORG_LASER:
        lsNew.ls_colColor = C_dBLUE;
        lsNew.ls_rFallOff = 1.5f;
        lsNew.ls_plftLensFlare = NULL;
        break;

 

 


Проделайте аналогично, только с нашим новым видом.

 

 

 

  • Часть 3. Редактируем функцию PRT_GENERAL_LASER


Найдем комментарий:

/************************************************************
 *               CYBORG LASER / PROJECTILE                  *
 ************************************************************/

И после его }; вставляем нашу функцию..

 

 

 

 


void GeneralLaser(void) {
  // set appearance
  InitAsModel();
  SetPhysicsFlags(EPF_PROJECTILE_FLYING);
  SetCollisionFlags(ECF_PROJECTILE_MAGIC);
  SetFlags(GetFlags() | ENF_SEETHROUGH);
  SetComponents(this, *GetModelObject(), MODEL_CYBORG_LASER, TEXTURE_CYBORG_LASER, 0, 0, 0);
  ModelChangeNotify();
  // start moving
  LaunchAsPropelledProjectile(FLOAT3D(0.0f, 0.0f, -60.0f), (CMovableEntity*)(CEntity*)m_penLauncher);
  SetDesiredRotation(ANGLE3D(0, 0, 0));
  m_fFlyTime = 15.0f; // Время полета
  m_fDamageAmount = 100.0f; // Урон
  m_fSoundRange = 0.0f;
  m_bExplode = TRUE; // Взрывчатый?
  m_bLightSource = TRUE; // Освещаемый?
  m_bCanHitHimself = TRUE; // Может задеть сам себя?
  m_bCanBeDestroyed = FALSE; // Может быть уничтожен?
  m_fWaitAfterDeath = 0.0f;
  m_pmtMove = PMT_FLYING;
};

 

 

 

 


 

 

Далее, дадим ссылку на функцию
Найдем:
case PRT_CYBORG_LASER: CyborgLaser(); break;
И добавим:

case PRT_GENERAL_LASER: GeneralLaser(); break;
Вот мы и вставили нашу функцию огня. Но еще не все готово. Мы поработаем над частицами..
 
  • Часть 3.8. Создаем визуальные эффекты

Нам не нужен обычный лазер. Мы сделаем его взрывчатым! Следовательно что? Правильно! Ищем комментарий:
// projectile explosion

И добавляем туда наш тип Projectile:
case PRT_GENERAL_LASER: PlayerRocketExplosion(); break;

Готово! Теперь наш лазер взрывчатый. Но и это еще не все. Снова ищем участок кода:
// render particles
  void RenderParticles(void) {
    switch (m_prtType) {

И после него добавим:
case PRT_GENERAL_LASER: Particles_AfterBurner( this, m_fStartTime, 0.5f); break;

Ну и все. Теперь при полете снаряда вы заметите частички Afterburner'a.
С типом снаряда покончено окончательно. Возвращаемся к Walker.es

 
-Сохраните документ-
Ctrl+S
  • Часть 4. Работаем с переменными

Найдя комментарий

/************************************************************
                       *                       M  A  I  N                         *
 ************************************************************/

Добавим наши функции. Перед

    if (m_EwcChar==WLC_SERGEANT) {
      SetHealth(750.0f);
      m_fMaxHealth = 750.0f;
    } else {
      SetHealth(150.0f);
      m_fMaxHealth = 150.0f;
    }


добавьте строки:

if (m_EwcChar==WLC_GENERAL) {
      SetHealth(
m_iHealthOfGeneral);
      m_fMaxHealth =
m_iHealthOfGeneral;
    }

Все. Теперь, насколько вы знаете, мы можем спокойно регулировать здоровье в редакторе.

Далее. После

    // set your appearance
    SetModel(MODEL_WALKER);


Добавим характеристику нашего зверька
 
if (m_EwcChar==WLC_GENERAL) { // Если наш монстр - Генерал, то...
      m_fSize = 1.0f; // Его размер - 1.0f
      SetModelMainTexture(TEXTURE_WALKER_GENERAL); // Текстура
      AddAttachment(WALKER_ATTACHMENT_ROCKETLAUNCHER_LT, MODEL_ROCKETLAUNCHER, TEXTURE_WALKER_GENGUN); // Добавить пушку 1
      AddAttachment(WALKER_ATTACHMENT_ROCKETLAUNCHER_RT, MODEL_ROCKETLAUNCHER, TEXTURE_WALKER_GENGUN); // Добавить пушку 2
      GetModelObject()->StretchModel(FLOAT3D(1,1,1));
      ModelChangeNotify();
      CModelObject *pmoRight = &GetModelObject()->GetAttachmentModel(WALKER_ATTACHMENT_ROCKETLAUNCHER_RT)->amo_moModelObject;
      pmoRight->StretchModel(FLOAT3D(-1,1,1));
      m_fBlowUpAmount = 1E10f;
      m_iScore = m_iScore;
      m_fThreatDistance = m_fGeneralThreatDistance;
    }

Монстр готов полностью! Теперь осталось только нажать F7 и радоваться новому биомеханоиду. Но не забывайте, что мы добавили новые файлы, а именно - 2 текстуры:
Вы можете найти их здесь:
http://www.gamefront.com/files/20441458/Models.zip.
 
 
Happy Coding! Heming Hitrowski 2011.


Комментарии   

№ 22  |  09.07.2013  |  +1  
А где брать эти файлы .es?
Ответ Цитата

№ 20  |  27.02.2012  |  +3  
petr_kustov раз ты такой умный, выложи ка пару новых монстриков на сайт :З Сделанных за короткое время
Ответ Цитата

№ 18  |  05.10.2011  |  -2  
Я и без статьи добавлял, все это можно сделать без статьи просто по образцу, но 5 поставлю потому что статья хорошая для новичков =) :D
Ответ Цитата

№ 19  |  05.10.2011  |  +6  
Только не надо тут понтов.. <_<
Ответ Цитата

№ 16  |  12.07.2011  |  +4  
ЧЕРТ! Ты крут!! откуда взял? сам сделал?! :D
За такое плюс пологается?
Ответ Цитата

№ 17  |  20.07.2011  |  +3  
Вообще, написал сам.
Ответ Цитата

№ 14  |  26.06.2011  |  +3  
Шикарная статья! Помнится, я когда-то, хотел об этом написать, но как то руки не доходили, а ты описал лучше некуда)
Молодец.
Единственное..Синий текст на темном фоне вообще не видно.. Юзай более светлый оттенок.
Ответ Цитата

№ 15  |  27.06.2011  |  +1  
Большое спасибо!)
Насчет синего текста, я что-то не могу поменять.. Может, пора менять браузер
Ответ Цитата

№ 11  |  17.06.2011  |  0  
Кстати где находиться:

// render particles
void RenderParticles(void) {
switch (m_prtType) {

Найти немогу! :(
Ответ Цитата

№ 12  |  17.06.2011  |  +1  
нажми комбинацию Ctrl+F, введи в строку белую одну сточку слов и он найдёт, не забуть нажать Enter, чтобы он нашёл :)
Ответ Цитата

№ 13  |  17.06.2011  |  0  
Уууу! Спасиб! :D
Ответ Цитата

№ 7  |  16.06.2011  |  0  
Слушай, а как это делать надо, обязательно в новом моде или как-то по другому, я попробовать сделать хочу :)
Кстати для какой версии?
Ответ Цитата

№ 9  |  16.06.2011  |  0  
Примерно для обоих.
Ответ Цитата

№ 10  |  16.06.2011  |  -1  
кстати в XBOX моде там не Kleer Spawner, а Gizmo Spawner, и ещё после смерти этого биомеха из него куча лягушек этих повыскакивало :D
Ответ Цитата

№ 6  |  16.06.2011  |  0  
Круто! %)
Ответ Цитата

№ 5  |  15.06.2011  |  0  
Круто
Ответ Цитата

№ 3  |  15.06.2011  |  +1  
Friend!!! %)
Тоесть биомех будет за тя?! :)
МЕЧТАЮ О БОТЕ КОТОРЫЙ ЗА ТЕБЯ!!! %) %) %)
Ответ Цитата

№ 4  |  15.06.2011  |  +1  
Я создал такого монстра, который стреляет жизнями и броней. Только пока положение не могу настроить...
Ответ Цитата

№ 8  |  16.06.2011  |  +1  
:D
Ответ Цитата

№ 21  |  13.06.2012  |  +2  
Короче говоря, он ими срет :D
Ответ Цитата

Страницы: 1-10 11-12

Оставьте комментарий

Мини-профиль

Гость

Вы в группе: Гости
Ваш IP: 54.224.203.224

Информация

Прочее

Категории раздела

Croteam [3]
Материалы по студии разработчика игр CroTeam.
Интервью с разработчиками [9]
Интервью с разработчиками, а также их издателями.
Serious Sam 1 [10]
Статьи о Serious Sam 1
Serious Sam 2 [6]
Статьи о Serious Sam 2
Serious Sam HD [5]
Статьи о HD-серии, ремейков классических версий Сэма.
Serious Sam 3: BFE [9]
Статьи о Serious Sam 3: BFE
Уроки по Serious Editor 1 [55]
Уроки по Serious Editor 2 [2]
Самое серьёзное редактирование, на русском!
Уроки по Serious Editor 3 [33]
Уроки по работе с редактором.
Serious Engine [6]
Описание возможностей всех движков компании Croteam
Разное [26]
Всё что не подошло не под одну из вышеупомянутых категорий.
Serious Sam: Revolution [1]
Материалы по SS: Revolution, серьёзном обновлении классических Крутых Сэмов.
Serious Sam 1.05/1.07 SDK [10]
SDK - набор исходников для Serious Sam: The Second Encounter 1.05/1.07.

Голосование

Какой ваш любимый уровень в Serious Sam 3: BFE?
1. Страж времени
2. Лето в Каире
3. Последний человек на Земле
4. Затерянные храмы Нубии
5. Мощь подземного царства
6. Мрачная невеста
7. Немые загадки
8. Открывая Солнце
9. Свинцовая туча
10. Сломанные крылья
11. В паутину
12. Без укрытия

Статистика



На сайте: 5
Гостей: 5
Пользователей: 0