Работа с SDK. Введение новых параметров для врага


Информация о статье

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

Статья посвящена следующим вопросам:

  • Добавление в редактор возможности задания здоровья врага;
  • Добавление в редактор возможности выставить бессмертие врагам;
  • Добавление в редактор возможности выставить невидимость врагам;
  • Добавление в редактор возможности возможности выставить скорость передвижения врага;
  • Добавление в редактор возможности выставить кол-во очков за смерть врага;
  • Добавление в редактор возможности чтобы при каждом убийстве враги разлетались на куски;
  • Добавление в редактор возможности выставить кол-во куском мяса с врага;
  • Добавление в редактор возможности выставить снаряды врага(лазер, ракеты, гранаты...).
  • Добавление в редактор возможности включить полосу жизни врага.

Модернизация врага

Рассмотрим модернизацию врага на примере Зорга, или же на английской версии - Grunt.

1) Для добавления здоровья в редактор, необходимо указать соответствующую переменную после кода:

properties:

1 enum GruntType m_gtType "Type" 'Y' = GT_SOLDIER,

2 INDEX fHealth "Health" = 40,

Здесь мы объявили целочисленную переменную с именем fHealth, задали как она будет называться в редакторе в двойных кавычках: "Health"и задали некое начальное значение равное 40. Переменная есть - теперь нужно ее связать с здоровьем. Опуститесь ниже и найдите главную функцию:

Main(EVoid)

Найдите строки:

SetHealth(40.0f);
m_fMaxHealth = 40.0f;

И замените их на:

SetHealth(fHealth);
m_fMaxHealth = fHealth;

Далее найдите строки:

SetHealth(60.0f);
m_fMaxHealth = 60.0f;

Замените на:

SetHealth(fHealth);
m_fMaxHealth = fHealth;

Мы установили здоровье равное значению переменной как и у зорга-солдата так и у зорга-командира. Теперь можно запросто выставлять здоровье через редактор:


image hosting blogs journals

2) Добавим остальные интересующие нас переменные как показано на рисунке:

image hosting blogs journals

(на номера строк во втором окне не смотреть, у Вас они будут совсем другие)

Вот эти строки:

3 BOOL invisible "Invisible" = FALSE,
4 FLOAT speed "Speed" = 6.5,
5 BOOL alwaysBlobUp "Always BlowUp" = FALSE,
6 INDEX scorePerKill "Score" = 500,
7 enum SoldierWeapon m_weapon "Soldier Weapon" = Laser,
8 BOOL invulnerability "Invulnerability" = FALSE,
9 INDEX bodyParts "Body Parts" = 4,

Даже не пробуйте сейчас компилировать! Мы еще не все объявили, что необходимо для работы этого кода. Теперь по одному разберем.

3 BOOL invisible "Invisible" = FALSE,

Означает, что параметр может иметь два значения - "Истина"(TRUE) или "Ложь"(FALSE). Этот параметр отвечает за невидимость врага. Поэтому поставим по умолчанию чтобы враги были видимы. Не нарушаем игровой баланс. Вы можете поставить и TRUE чтобы усложнить игру. Следующий параметр:

4 FLOAT speed "Speed" = 6.5,

Отвечают за скорость врага. Если поставить 20 и более то на пустой местности от 10 таких врагов будет не так уж и легко уйти. Далее идет параметр, отвечающий за то, необходимо ли нанести определенный урон врагу, чтобы он разлетелся или достаточно всего одного последнего выстрела хоть даже с пистолета:

5 BOOL alwaysBlobUp "Always BlowUp" = FALSE,

Имеет тип как и невидимость, поэтому на нем останавливаться не будем. За кол-во очков, заработанных за убийство монстра будет отвечать эта переменная:

6 INDEX scorePerKill "Score" = 500,

Через строку идет еще две переменных:

8 BOOL invulnerability "Invulnerability" = FALSE,
9 INDEX bodyParts "Body Parts" = 4,

Они отвечают  за бессмертие врага и кол-во частей тела. Также на этом подробно останавливаться не будем - выше было рассмотрено объявление данных типов. Теперь нас интересует момент:

7 enum SoldierWeapon m_weapon "Soldier Weapon" = Laser,

Тип enum происходит от английского слова - enumeration(перечисление). Да, действительно этот тип представляет собою перечисление.

Вот как выглядит пример перечисления в редакторе:

image hosting blogs journals

Но в данном случае мы объявили всего лишь объект который будет хранить данные о выбранном типе оружия. Но сама структура перечисления должна быть описана ранее.

Вставьте следующий код в указанном месте, как на рисунке:

image hosting blogs journals

Вот этот код:

enum SoldierWeapon {
0 Laser "LASER",
1 Rocket "ROCKET",
};

Laser, Rocket - идентификаторы(Значения, которые может принимать переменная, в нашем случае -m_weapon). "LASER", "ROCKET" - текст, который будет отображаться в редакторе в меню выбора элемента перечисления.

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

3) Реализуем необходимый функционал для наших переменных. Для обеспечения неуязвимости вставим код как показано на картинке:

image hosting blogs journals

if (invulnerability==false){ CEnemyBase::ReceiveDamage(penInflictor, dmtType, fDamageAmmount, vHitPoint, vDirection);}

Данный код работает так если неуязвимость =ложь. То в таком случае код который отвечает за получение урона выполняется, в ином случае - нет. Немного опуститесь и вставьте участки кода в необходимые места, как это показано на картинке:


image hosting blogs journals

Код:

m_fAttackRunSpeed = FRnd() + speed;

Отвечает за скорость врага. Код:

m_fAttackDistance = 1000.0f;

Я поставил чтобы враги стреляли не только когда подбегут, а сразу же, когда увидели. Следующий момент также очень интересен:

if (alwaysBlobUp==FALSE)
{

m_fBlowUpAmount = 80.0f;
}
else
{
m_fBlowUpAmount = 0.1f;
}

Если переменная враги всегда разлетаюсь = ложь, то враг будет разлетаться только в случае, если ему нанесено 80 или более единиц урона, в ином случае - если менее 1 единицы урона.  На следующем коде подробно останавливаться не будем, он представляет привязку здоровья и очков за врага к переменным:

m_iScore = scorePerKill;
SetHealth(fHealth);
m_fMaxHealth = fHealth;

При установке флага невидимости данный код обеспечивает прозрачность врага:

if (invisible==TRUE)
{
GetModelObject()->mo_colBlendColor = C_WHITE|0x25;
}

Подобным образом Вы можете описать параметры и для командира, можете улучшить их, так как это командир. Я написал такие же параметры:

image hosting blogs journals

4) Теперь разберемся с оружием врага. Будет стрелять он лазером или ракетами. Для этого отредактируйте как на картинке указанный участок кода:

image hosting blogs journals

StartModelAnim(GRUNT_ANIM_FIRE, 0);

if (m_weapon==Rocket){
ShootProjectile(PRT_WALKER_ROCKET, FIREPOS_SOLDIER, ANGLE3D(0, 0, 0));
}
else
{

ShootProjectile(PRT_GRUNT_PROJECTILE_SOL, FIREPOS_SOLDIER, ANGLE3D(0, 0, 0));
}
PlaySound(m_soFire1, SOUND_FIRE, SOF_3D);

autowait(0.15f + FRnd()*0.1f);
StartModelAnim(GRUNT_ANIM_FIRE, 0);

if (m_weapon==Rocket){
ShootProjectile(PRT_WALKER_ROCKET, FIREPOS_SOLDIER, ANGLE3D(0, 0, 0));
}
else
{

ShootProjectile(PRT_GRUNT_PROJECTILE_SOL, FIREPOS_SOLDIER, ANGLE3D(0, 0, 0));
}

Рассмотрим как стреляет зорг-солдат, он останавливается и с определенным интервалом выстреливает два раза. Вот этот промежуток времени между выстрелами:

autowait(0.15f + FRnd()*0.1f);

Далее снова идет анимация выстрела:

StartModelAnim(GRUNT_ANIM_FIRE, 0);

И сам выстрел -ShootProjectile. И в зависимости от того m_weapon=Rocket(равно ли?). Выполяется либо выстрел лазером, либо выстрел ракетой:

PRT_GRUNT_PROJECTILE_SOL

PRT_WALKER_ROCKET

Результат виден на снимке экрана:


image hosting blogs journals

5) Рассмотрим добавление полосы жизни врагам. Итак, начнем с того, что большинство врагов являются наследниками от класса EnemyBase, в котором есть поле:

144 BOOL m_bBoss = FALSE,// set for bosses (for health display)

Именно это поле и отвечает за отображение полосы здоровья. Но, к сожалению, не у каждого монстра есть возможность скорректировать данное свойство, а как следует из кода, то по умолчанию стоит значение FALSE, следовательно полоса здоровья отображаться не будет. Данную проблему легко решить следующим образом: добавляем в класс нашего монстра новую переменную логического типа(BOOL), которую потом будем использовать для установки значения m_bBoss. Пример добавления приведен на следующем снимке:

image hosting blogs journals
Сам код, который нужно добавить:
12 BOOL m_bGruntBoss "Boss" 'B' = FALSE
Мы ввели новую переменную. Теперь необходимо связать эти две переменные - переменную родительского класса и переменную дочернего класса. Для этого в методе Main(EVoid) добавляем следующий код:
m_bBoss=m_bGruntBoss;
Например, добавим полосу зоргу-солдату, но не зоргу-коммандиру:
image hosting blogs journals
Если требуется добавить всем типам данного монстра то следует добавлять вне оператора switch(m_gtType) {}


Результат виден на следующем снимке:

image hosting blogs journals

 

Заключение

На данный момент это вся информация, которую я хотел бы рассказать в данной статье. Подведем итоги.

Данная статья помогла:

* Расширить параметры врага. Это видно со следующего снимка:

image hosting blogs journals

А именно реализовать задачи, поставленные вначале.

* Улучшить навыки в поиске необходимого кода(разбираться в коде)

* Узнать больше о синтаксических конструкциях языка С++, а также о конструкциях, которые используются в SDK.

На момент написания статьи на сайте почти нет информации по SDK. Я надеюсь, что данная статья поможет новичку быстрей сориентироваться в коде и начать разработку своей модификации. А для тех, кто уже начал делать модификации данная статья может помочь немного повторить материал.

Программа для создания папок модификации:

http://serioussite.ru/load/ssfmodcreator_v1_0/26-1-0-722

См. также "Работа с полями настроек игры(сессии)":

http://serioussite.ru/publ/rabota_s_sdk_rabota_s_poljami_nastroek_igry_sessii/6-1-0-56

Удачи в создании модификаций!  

 



Комментарии   

[Материал]  |  № 22  |  06.11.2011  |  0  
Cпасибо за статью) :D
Ответ Цитата

[Материал]  |  № 18  |  21.11.2010  |  -2  
А можете мне сказать как сделать свойство BOT - чтобы
монстор был за тебя???
(Как в Akazuki mod 11) HELP HELP HELP
Ответ Цитата

[Материал]  |  № 19  |  21.11.2010  |  0  
Я этим еще не занимался, поэтому советую тебе обратиться сюда:
http://serioussite.ru/forum/5-447-6
Ответ Цитата

[Материал]  |  № 16  |  09.11.2010  |  +2  
СУПЕР!!! ЗОРГИ РАКЕТАМИ ПАЛЯТ! :)
Ответ Цитата

[Материал]  |  № 17  |  09.11.2010  |  +1  
Да, разобрался? :)
Ответ Цитата

[Материал]  |  № 20  |  19.02.2011  |  0  
я нет у меня постоянно ошибку пишут, предётся мне плюнуть нафиг на СДК, который меня достал с одной и той же ошибкой >( :o :o :o :o
Ответ Цитата

[Материал]  |  № 21  |  25.02.2011  |  0  
Не стоит так близко к сердцу воспринимать :)
Ответ Цитата

[Материал]  |  № 15  |  06.11.2010  |  +1  
Статья предусматривает то, что Вы умеете создавать директории для модов, а также, что у Вас имеется Visual C++ 6.0 и он полностью настроен на работу с SDK.
Ответ Цитата

[Материал]  |  № 14  |  06.11.2010  |  0  
а куда сохранять измение
Ответ Цитата

[Материал]  |  № 13  |  05.11.2010  |  +2  
ОТЛИЧНО!!!!! +100 :D
Ответ Цитата

[Материал]  |  № 11  |  04.11.2010  |  -2  
а можно не в моде делать это а в игре самой
Ответ Цитата

[Материал]  |  № 12  |  04.11.2010  |  0  
Конечно же можно! Только сделай предварительно BackUp своих оригинальных библиотек.
Внимание! Ты не сможешь играть в сетевой игре с другими игроками, которые играют не с твоими библиотеками! Так, что лучше используй как модификацию, а папку bin в корневой директории игры оставь без изменений.
Ответ Цитата

[Материал]  |  № 8  |  31.10.2010  |  +2  
Mechanixx, круто!
Молодец! COOL
Ответ Цитата

[Материал]  |  № 7  |  31.10.2010  |  -7  
Я это уже умею.
Ответ Цитата

[Материал]  |  № 9  |  03.11.2010  |  +6  
Ты этого не умеешь)Только прочитал статью - уже умеешь)
Ответ Цитата

[Материал]  |  № 10  |  03.11.2010  |  0  
Кто знает...
Может он это и имел ввиду, но был очень краток. :)
Ответ Цитата

[Материал]  |  № 6  |  28.10.2010  |  +1  
--uGh--zAn--, отлично! :)
ZIM, спасибо :)
Некоторые моменты из статьи могут быть полезны и человеку, который уже разбирается в SDK. Чтобы не искать некоторые функции, которые дает эта статья, у классов врагов самостоятельно. GLASSES
Ответ Цитата

[Материал]  |  № 5  |  26.10.2010  |  +3  
Супер статья!!!
Ответ Цитата

[Материал]  |  № 4  |  25.10.2010  |  +2  
Мне пригодилось! :D COOL
Ответ Цитата

[Материал]  |  № 3  |  25.10.2010  |  +2  
Спасибо. Старался :)
Ответ Цитата

[Материал]  |  № 2  |  24.10.2010  |  +2  
КРУТОООООООО :) :) ^_^
Отлично поработал!!! :D
10000000000000000000000++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++
Ответ Цитата

[Материал]  |  № 1  |  23.10.2010  |  +1  
GJ)
Ответ Цитата

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

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

Гость

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

Сейчас обсуждают

Fallgor4
Run4eg36
Mindbreak6896
logintema5611686
Alfeos15
Ar2R-devil-PiNKy1
Ar2R-devil-PiNKy1
zorgpro23
PewPewGal4
Gnaar2458

МЕМЫ

ST27 16 21

Файлы

extreazz137
341 33 3

DarkWolf
6072 1592 45

freeknik
15532 3912 11

yrroodd
2770 719 21

D@rket
2232 415 22

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

Croteam [4]
Материалы по студии разработчика игр CroTeam.
Интервью с разработчиками [9]
Интервью с разработчиками, а также их издателями.
Serious Sam 1 [9]
Статьи о Serious Sam 1
Serious Sam 2 [6]
Статьи о Serious Sam 2
Serious Sam HD [4]
Статьи о HD-серии, ремейков классических версий Сэма.
Serious Sam 3: BFE [10]
Статьи о Serious Sam 3: BFE
Уроки по Serious Editor 1 [60]
Уроки по Serious Editor 2 [3]
Самое серьёзное редактирование, на русском!
Уроки по Serious Editor 3 [40]
Уроки по работе с редактором.
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.

Видео

СЕКРЕТНЫЙ ЗАВОД ЗОМБИ: эпичный путь к спасению - Aftermath (Serious Sam Map) №7
48 0.0

ГЕРЦ ПАЛАЧ | Serious Sam: Hell Encounter Impossible+++ | #11 | [ФИНАЛ]
31 5.0

Динамическая смена музыки
80 0.0

ЦЕРКОВЬ СТРАДАНИЙ | Serious Sam: Hell Encounter Impossible+++ | #10
60 5.0

Metal Gear Ray в Serious Sam
158 4.4

Статистика



На сайте: 26
Гостей: 25
Пользователей: 1
Кутё