Вернуться   Форум команды Magic Team > Создание модов > Модостроение к Gothic

Важная информация

Модостроение к Gothic Как делаются моды к Готике...

Ответ
 
Опции темы Опции просмотра
Старый 18.03.2006, 14:33   #11
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

Ну здесь всё для новичко должно быть понятно.Хотя за написание респект..
DEDROIT вне форума   Ответить с цитированием
Старый 18.03.2006, 15:12   #12
Новичок
 
Аватар для Mengos
 
Регистрация: 25.02.2006
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для Mengos с помощью ICQ
По умолчанию Скриптинг


instance ITAR_01_mage(C_Item)
{
name = "роба мага";
mainflag = ITEM_KAT_ARMOR;
flags = 0;
protection[PROT_EDGE] = 100;
protection[PROT_BLUNT] = 100;
protection[PROT_POINT] = 100;
protection[PROT_FIRE] = 50;
protection[PROT_MAGIC] = 50;
value = value_itar_kdw_h;
wear = WEAR_TORSO | WEAR_EFFECT;
effect = "SPELLFX_FIREARMOR";
visual = "ItAr_KdW_H.3ds";
visual_change = "Armor_KdW_H.asc";
visual_skin = 0;
material = MAT_LEATHER;
on_equip = equip_fly;
on_unequip = unequip_fly;
description = name;
text[1] = NAME_Prot_Edge;
count[1] = protection[PROT_EDGE];
text[2] = NAME_Prot_Point;
count[2] = protection[PROT_POINT];
text[3] = NAME_Prot_Fire;
count[3] = protection[PROT_FIRE];
text[4] = NAME_Prot_Magic;
count[4] = protection[PROT_MAGIC];
text[5] = NAME_Value;
count[5] = value;
};

func void equip_fly()
{
Mdl_ApplyOverlayMds(self,"humans_skeleton_fly .mds");
};

func void unequip_fly()
{
Mdl_RemoveOverlayMds(self,"humans_skeleton_fl y.mds");
};
Mengos вне форума   Ответить с цитированием
Старый 17.06.2006, 19:47   #13
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

Расмотрим такое действие.Напримен ГГ нужно за три дня что-то принести,если он не принесёт за три дня,то не выполнит квест..
Диалог писать не буду и так много писал,напишу только условия.
Когда ГГ согласился взять задания(ему сказали принести за 3 дня например 5 заготовок) ,то в конце этого диалога нужно поставить например
zagotovka_RepairDay = Wld_GetDay();(с этого момента началось время отсчёта)
И когда у нас есть 5 заготовок и мы уложились за 3дня,то в условии нужно написать условие что есть 5 заготовок и
if( (Wld_GetDay() - zagotovka_RepairDay) <= 3)
И тогда появиться нужный диалог,в противном случае else и провал миссии.
Тоесть мы ввели некий счётчик,где zagotovka - переменная(нужно прописать Story_Globals).
DEDROIT вне форума   Ответить с цитированием
Старый 17.06.2006, 19:49   #14
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

ТУТОР МЕНГУСА
Амулет превращения в скелета (я пока не проверял, всё-ли будет правильно работать)

var int old_humans_guilden;

instance ITAM_2(C_Item)
{
name = "Амулет";
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_AMULET;
value = 8000;
visual = "ItAm_Hp_01.3ds";
material = MAT_STONE;
on_equip = Equip_ITAM_2;
on_unequip = UnEquip_ITAM_2;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = name;
text[5] = NAME_Value;
count[5] = value;
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};

func void Equip_ITAM_2()
{
old_humans_guilden = self.guild;
if(old_humans_guilden != GIL_SKELETON) // нужно, чтобы old_humans_guilden = hero.guild срабатывало раньше, чем self.guild = GIL_SKELETON
{
Npc_SetTrueGuild(self,GIL_SKELETON);
self.guild = GIL_SKELETON;
AI_UnequipArmor(self);
Mdl_SetVisual(self,"HUMANS.MDS");
Mdl_SetVisualBody(self,"Ske_Body",DEFAUL T,DEFAULT,"",DEFAULT,DEFAULT,-1);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_skeleton.mds ");
Wld_PlayEffect("spellFX_LIGHTSTAR_ORANGE&quot ;,hero,hero,0,0,0,FALSE);
Snd_Play("SKE_DIE_A1");
};
};

func void UnEquip_ITAM_2()
{
Npc_SetTrueGuild(self,old_humans_guilden);
self.guild = old_humans_guilden;
AI_UnequipArmor(self);
Mdl_SetVisual(self,"HUMANS.MDS");
Mdl_SetVisualBody(self,"hum_body_Naked0" ,9,0,"Hum_Head_Pony",Face_N_Player,0,NO_ ARMOR);
Mdl_SetModelFatness(self,0);
Mdl_RemoveOverlayMds(self,"Humans_skeleton.md s");
Wld_PlayEffect("spellFX_LIGHTSTAR_ORANGE&quot ;,hero,hero,0,0,0,FALSE);
Snd_Play("SFX_HealObsession");
};
DEDROIT вне форума   Ответить с цитированием
Старый 17.06.2006, 19:50   #15
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

ТУТОР ВенДиго
ЧАСТЬ ПЕРВАЯ

Итемки - это предметы инвентаря. В данном туторе описывается не создание
качественно новой модели(это дело МАХ'а, может Рал научит. Кстати очень
хотелось бы, я сам не умею моделить ), а создание предмета на базе
имеющихся в игре моделей и текстур, со своими индивидуальными
характеристиками.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ПЕРВАЯ - дифференциация.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
В Готике существует 11 основных типов итемок. Все они имеют один общий
принцип построения скрипта, но в то же время качественно отличаются друг от
друга(кроме Amulette и Rings - они почти одинаковые).
Для простоты приведу след. Таблицу:

Тип предмета Mainflag Flag Код предмета Файлы

Амулеты ITEM_KAT_MAGIC ITEM_AMULET ItAm_
IT_Addon_Amulette.d
IT_Amulette.d

Трофеи ITEM_KAT_NONE ITEM_MULTI ItAt_ IT_AnimalTrophy.d

Доспехи ITEM_KAT_ARMOR 0 ItAr_ IT_Addon_Armor.d
IT_Armor.d

Еда ITEM_KAT_FOOD ITEM_MULTI ItFo_ IT_Addon_Food.d
IT_Food.d

Ключи ITEM_KAT_NONE 0 ItKe_ IT_Addon_Keys.d
IT_Keys.d

Оружие ближнего боя ITEM_KAT_NF ??? ItMw_ IT_Melee_Weapons.d

Оружие дальнего боя ITEM_KAT_MUN ??? ItRw_ IT_Ranged_Weapons.d

Напитки ITEM_KAT_POTIONS ITEM_MULTI ItPo_ IT_Addon_Potions.d
IT_Potions.d

Кольца ITEM_KAT_MAGIC ITEM_RING ItRi_ IT_Ringe.d

Руны ITEM_KAT_RUNE 0 ItRu_ IT_Addon_Runes.d IT_Runen.d

Книги и письма ITEM_KAT_DOCS ??? ItWr_ IT_Addon_Written.d
IT_Written.d



Создавать отдельный файл под итемку не нужно. Чтобы "написать" предмет,
нужно писать с крипт в соответствующем файле(из вышеприведённой таблицы). О
флагах и кодах позже.


Ну ещё есть предметы, относящиеся к типу "разное". Отмычки, табак, мотыга,
кувшин и др. Их можно прописывать в IT_Addon_Misc.d и IT_Misc.d
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ВТОРАЯ - общие.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Для всех итемок характерно следующее:

Две области. Первая - описывающая внешний фид предмета и его
характеристики. Вторая - отвечающая за вывод текста, который мы будем
видеть в инвентаре при выборе предмета.
Для некоторых типов(книги, напитки, некоторые оружия) существует ещё одна,
промежуточная область, которая отвечает за условия, приписанные переменные,
явления, происходящие при использовании предмета.
Чёткого разделения на области в скриптах нет! Оно воображаемое и мной
выдуманное. Просто так легче и упорядоченнее.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ТРЕТЬЯ - основа.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Начнём с основы создания предметов. Со скелета, который характерен абсолютно
для всех типов итемок.

INSTANCE COD_Name (C_Item) //Где COD - Код предмета(см. таблицу),
Name - имя будщей итемки(!по-английски!)
{
name = "имя"; //Это название вашего предмета,
надпись, которая будет отображаться, когда он в фокусе. Сдесь можно
по-русски писать. Только не забывайте ковычки и ";".

mainflag = Flag_Predmeta; //Это флаг предмета. См. таблицу.
flag = Flag; //Это тоже флаг, в таблице не
перечислены флаги оружия и писем не потому что я их не знаю, а потому что
их несколько:

Оружие ближнего боя: ITEM_SWD
(одноручный меч)
ITEM_2HD_SWD (двуручный меч)
ITEM_AXE (одноручный топор)
ITEM_2HD_AXE (двуручный топор)

Оружие дальнего боя: ITEM_BOW (лук)
ITEM_CROSSBOW
(арбалет)
ITEM_CROSSBOW|ITEM_MULTI (стрелы и болты)

Письмена: 0
(нейтральные листовки и книги)
ITEM_MISSION|ITEM_MULTI (карты)

К предметам, учавствующим в основной
сюжетной линии и каих-либо квестах применяют флаг ITEM_MISSION;

value = 250; //Цена предмета
visual = "Файл визуализации.3DS"; //Названия визуализации возьмите из
других скриптов - это самый простой вариант. Например, для обычного
крестьянского кинжала он будет выглядеть так "Itmw_005_1h_dagger_01.3DS";
material = MAT_METAL; //Материал, из которого сделан предмет.
В данном случае из металла. Ещё есть MAT_Wood(дерево), MAT_LEATHER(кожа),
MAT_GLAS(стекло) и MAT_STONE(камень),


//Здесь заканчивается первая область и начинается вторая, ответственная за
выво текста.

descriptions = name; //То, что отображается на самой верхней строке. В
данном случае имя оружия, которое вы написали в функции name. Сюда можно
написать и что-нибудь своё, взяв в кавычки.

TEXT[1] = "cвой текст"; //Здесь вы можете написать описание этого предмета.
Если описания не будет, эти строки вообще не пишем.
TEXT[2] = функция; //Используется для ввода функций типа сколько нужно
силы или ловкости, к чему и что прибавляет, количество урона для оружия,
зашиты для доспехов и т.д. и т.п. Более подробно буду останавливаться когда
буду описывать создание отдельных типов(далее).
TEXT[3] = функция; //Аналогично TEXT[2]
TEXT[4] = функция; //Аналогично TEXT[2], но эта строка используется
редко
TEXT[5] = NAME_VALUE; //Функция цены предмета

COUNT[2] = переменная; //Назначается значение функции из TEXT[2]. Понимаю,
пока не всё ясно, но позже всё встанет на свои места
COUNT[3] = переменная; //Аналогично
COUNT[4] = переменная; //Аналогично
COUNT[3] = value; //Определяет значение предмета.

Вот в принципе и всесь скелет. Если Вы хотите привязать к предмету какую
либо функцию, например постоянное увеличение силы на 20, дописываем
следующее:

on_equip = Equip_name; //Где name полностью совпадает с именем
предмета. Эта функция означает одевание предмета.
on_unequip = UnEquip_name; //Снятие предмета

TEXT[1] = "Этот предмет даёт небывалую силу";
TEXT[2] = NAME_Bonus_Str;
COUNT[2] = 20;
};

Теперь приписываем само повышение силы:
{
FUNC VOID Equip_Name()
{
Npc_ChangeAttribute(self,ATR_STRENGTH,+ 20);
};


FUNC VOID UnEquip_Name()
{
Npc_ChangeAttribute(self,ATR_STRENGTH,- 20);
};

Готово! Вот пример моей итемки. Это квестовый лук.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItRw_KvintBow (C_Item)
{
name = "Лук Квинта";
mainflag = ITEM_KAT_FF;
flags = ITEM_BOW;
value = Value_KvintBow;
visual = "ItRw_Bow_H_04.mms";
material = MAT_WOOD;
munition = ItRw_Arrow;

cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = Condition_KvintBow;

damageTotal = damage_KvintBow;
damagetype = DAM_POINT;

description = name;

TEXT[0] = "Этот лук сделан Виктором";
TEXT[1] = "по заказу Квинта";
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Dex_needed; COUNT[3] = cond_value[2];
TEXT[5] = NAME_Value; COUNT[5] = value;
};

Примите во внимание, что после damagetotal(повреждения), value(цена) и
cond_value[2](cтоимость ловкости) стоят не числа, а функции. Чтобы
приписать числа к этим функциям(т.е. скока именно дамаг, цена, и ст-ть
ловкости) нужно в файле Items\Tuning_Ranged_Weapons.d дописать следующее:

const int damage_KvintBow = 130; //Повреждения 180
const int Condition_KvintBow = 90; //Требует ловкости 90
const int Value_KvintBow = 1800; //стоит 1800

КОНЕЦ! Но тутор далеко не полный. Просто решил вынести основное на ваш суд.
Позже(может дня через два-три) к тутору будут добавлены пояснения о
создании каждого типа предметов.

ЧАСТЬ ВТОРАЯ

Так, теперь по-порядку. Создание определённого предмета.

1.АМУЛЕТЫ

Про флаги, имена, текст распространяться не буду - надеюсь это уже
понятно.
Вообще в игре есть 2 вида амулетов(резист к защите и к умениям, ну ещё
квестовые). Но можно сделать ещё комбинированные, если нужно(наприм. +20 к
защите от магии и +10 к ловкости) или просто как украшения, именные, и всё,
на что фантазии хватит - а сделать МОЖНО!

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItAm_Prot_Fire(C_Item)
{
name = "Амулет из жерла вулкана";

mainflag = ITEM_KAT_MAGIC;
flags = ITEM_AMULET;

value = 10000;

visual = "ItAm_Prot_Fire_01.3ds";

visual_skin = 0;
material = MAT_METAL;

wear = WEAR_EFFECT; //Не помню зачем... пусть бедет.
on_equip = Equip_Prot_Fire;
on_unequip = UnEquip_Prot_Fire;

description = name;

TEXT[2] = "Защита от огня";
COUNT[2] = 50;
TEXT[5] = NAME_Value;
COUNT[5] = 10000;

INV_ZBIAS = INVCAM_ENTF_AMULETTE_STANDARD; //Чего не знаю, того не знаю.
Кажется месторасположение в ивентаре. Но не точно. В любом случае эту
строку не изменяйте.

};

FUNC VOID Equip_Prot_Fire()
{
self.protection [PROT_FIRE] += 50;
};


FUNC VOID UnEquip_Prot_Fire()
{
self.protection [PROT_FIRE] -= 50;
};

Это амулет для защиты от огня на 50 едениц.
Как привязать к предмету повышение хар-ки вы уже знаете.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.ТРОФЕИ

Для примера возьмём мясо какого-нибудь особенного мясного жука, при
съедании которго прибавляется +1 к силе.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItAt_Meatbugflesh_Str (C_Item)
{
name = "Мясо жука-убийцы";

mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;

value = 200;

visual = "ItAt_Meatbugflesh.3DS";
material = MAT_LEATHER;
scemeName = "FOODHUGE";
on_state[0] = Use_Meatbugflesh_Str; //Процедура использования вещи

description = name;
TEXT[1] = NAME_Bonus_HP; COUNT[1] = 10;
TEXT[2] = NAME_Bonus_Str; COUNT[2] = 1;
TEXT[5] = NAME_Value; COUNT[5] = value;
};

FUNC VOID Use_Meatbugflesh_Str()
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, 10);
Npc_ChangeAttribute (self, ATR_STRENGTH, 1);
PrintScreen ("Сила +1", -1, 45, FONT_SCREEN, 2);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

3.ДОСПЕХИ

Создаём модифицированные доспехи из пластин ползунов, по сюжету, наприм.
окраплёные кровью Инноса
Просто добавляем защиты побольше к старым и привязываем увеличение плюс
манны на 100.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

INSTANCE ITAR_DJG_Crawler_Innos (C_Item)
{
name = "Ползунки Инноса";

mainflag = ITEM_KAT_ARMOR;
flags = 0;

protection [PROT_EDGE] = 170;//Защита от острия
protection [PROT_BLUNT] = 170;//Защита от тупого оружия
protection [PROT_POINT] = 170;//защита от стрел
protection [PROT_FIRE] = 115;//Защита от огня


value = 30000;

wear = WEAR_TORSO;

visual = "ItAr_Djg_Crawler.3ds";
visual_change = "Armor_Djg_Crawler.asc";
visual_skin = 0;
material = MAT_LEATHER;

on_equip = Equip_ITAR_DJG_Crawler_Innos;
on_unequip = UnEquip_ITAR_DJG_Crawler_Innos;

description = name;

TEXT[1] = NAME_Prot_Edge;
COUNT[1] = protection [PROT_EDGE];

TEXT[2] = NAME_Prot_Point;
COUNT[2] = protection [PROT_POINT];

TEXT[3] = NAME_Prot_Fire;
COUNT[3] = protection [PROT_FIRE];

TEXT[4] = NAME_Bonus_Mana;
COUNT[4] = 100;

TEXT[5] = NAME_Value;
COUNT[5] = value;
};
FUNC VOID Equip_ITAR_DJG_Crawler_Innos()
{
if Npc_IsPlayer (self) //Условие если одеты на ГГ
{
MCArmor_Equipped = TRUE;

if (MC_Equipped == TRUE)
{
self.protection[PROT_EDGE] += 170;
self.protection[PROT_BLUNT] += 170;
self.protection[PROT_POINT] += 170;
self.protection[PROT_FIRE] += 115;
Npc_ChangeAttribute (self, ATR_MANA, 25);
self.aivar[REAL_MANA] = self.aivar[REAL_MANA], +25;

};
};
};
FUNC VOID UnEquip_ITAR_DJG_Crawler_Innos()
{
if Npc_IsPlayer (self)
{
MCArmor_Equipped = FALSE;

if (MC_Equipped == TRUE)
{
self.protection[PROT_EDGE] -= 170;
self.protection[PROT_BLUNT] -= 170;
self.protection[PROT_POINT] -= 170;
Npc_ChangeAttribute (self, ATR_MANA, 25);
self.aivar[REAL_MANA] = self.aivar[REAL_MANA], -25;
};
};
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

4.Провиант

Случай такой же, как и с мясом жука-убийцы

5.Ключи

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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItKe_Key_PapaKarlo(C_Item)
{
name = "Золотой ключик от каморки папы Карло";

mainflag = ITEM_KAT_NONE;
flags = 0;

value = 500;

visual = "ItKe_Key_01.3ds";
material = MAT_METAL;

description = name;

TEXT[2] = "Этот ключь открывает замок";
TEXT[3] = "за нарисованным чайником";

};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

6. Оружие ближнего боя.

Делаем супер-меч с дамагом 300 и прибавке к владению двурушником +50%

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

INSTANCE ItMw_Zorn_of_god (C_Item)
{
name = "Месть богов";

mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;

value = 20000;

damageTotal = 300; //Общий урон
damagetype = DAM_EDGE; //Тип повреждений. В данном случае
лезвием.


cond_atr[2] = ATR_STRENGTH; //Что требует. В данном
случае силы. Ловкость - cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = 205; //Стоимость силы.
visual = "ItMw_1H_Blessed_03.3DS";

on_equip = Equip_Innos_of_GOD;
on_unequip = UnEquip_Innos_of_GOD;

description = name;
TEXT[1] = NAME_Damage; COUNT[1] = damageTotal;
TEXT[2] = NAME_Str_needed; COUNT[2] = cond_value[2];
TEXT[3] = "К двуручному умению";
COUNT[3] = 50;
TEXT[4] = NAME_TwoHanded;
TEXT[5] = NAME_Value; COUNT[5] = value;
};

FUNC VOID Equip_Innos_of_GOD()
{
B_AddFightSkill (self, NPC_TALENT_1H, 50);
};


FUNC VOID UnEquip_Innos_of_GOD()
{
B_AddFightSkill (self, NPC_TALENT_1H, -50);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

7.Оружие дальнего боя.

см. пример "Лук Квинта".

8.Напитки.
"Усложняем номер" (С)
Делаем настойку из крови дракона, дающую +25 к силе и ловкости, но только
ОНД.

/////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItPo_DragonsBlood(C_Item)
{
name = "Настойка из крови дракона";

mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;

value = 7000;

visual = "ItMi_Flask.3ds";
material = MAT_GLAS;
on_state[0] = UseItPo_DragonsBlood;
scemeName = "POTIONFAST";

wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";

description = name;

TEXT[1] = "???"; //В игре действие будет неизвестно

TEXT[5] = NAME_Value;
COUNT[5] = value;

};

FUNC VOID UseItPo_DragonsBlood()
{
IF (hero.guild == GIL_DJG)
{
Npc_ChangeAttribute (self, ATR_STRENGTH ,25);
self.aivar[REAL_STRENGTH] = self.aivar[REAL_STRENGTH] + 25;
Npc_ChangeAttribute (self, ATR_DEXTERITY,25);
self.aivar[REAL_DEXTERITY] = self.aivar[REAL_DEXTERITY] + 25;
PrintScreen ("Я стал сильнее", -1, 45, FONT_SCREEN, 2);
//Выводит строку текста "Я стал сильнее" на 2 секунды.

}
else
{

Npc_ChangeAttribute (self, ATR_STRENGTH ,0);
self.aivar[REAL_STRENGTH] = self.aivar[REAL_STRENGTH] + 0;
Npc_ChangeAttribute (self, ATR_DEXTERITY,0);
self.aivar[REAL_DEXTERITY] = self.aivar[REAL_DEXTERITY] + 0;
PrintScreen ("ничего не произошло", -1, 45, FONT_SCREEN,
2);
};
};
/////////////////////////////////////////////////////////////////////////////////////////////

9. Кольца

Аналогично амулетам.

10.Руны.

Абсолют новые руны сделать скриптово Вы не можете, т.к. для этого нужны
новая визуализация и эффекты.
Можно только модифицировать кол-во манны, которое требуется для заклинания
и его повреждение.

11.Книги

/////////////////////////////////////////////////////////////////////////////////////////////
INSTANCE ItWr_123 (C_Item)
{
name = "Книга";
mainflag = ITEM_KAT_DOCS;
flags = 0;
value = 500;
visual = "ItWr_Book_02_05.3ds";
material = MAT_LEATHER;
scemeName = "MAP";
on_state[0] = Use_Book;
description = name;
TEXT[2] = "Это книга для тутора по скриптам";
TEXT[3] = "В летописях строителей.";
TEXT[5] = NAME_Value;
COUNT[5] = value;
};

FUNC VOID Use_Book()//С этой функции и далее прописывается непосредственно
текст книги.
{

var int nDocID;//Переменная

nDocID = Doc_Create();//DocManager
Doc_SetPages(nDocID, 2);//Сколько страниц в книге (листать книги в готике
нельзя, поэтому диапозон страниц не велик - от 1 до 2)
Doc_SetPage (nDocID, 0, "BOOK_MAGE_L.tga" , 0);//Текстура первой страницы
Doc_SetPage (nDocID, 1, "BOOK_MAGE_R.tga" , 0);//Текстура второй страницы

//1.Seite //Для первой страницы

Doc_SetMargins ( nDocID, 0, 275, 20, 30, 20, 1 );//Ограничение текста.
Своеоьразная рамка, куда помещён текст. Для опытных.
Doc_SetFont ( nDocID, 0, FONT_BookHeadline );//Шрифт. В данном случае
крупный жирный(для заголовков)
Doc_PrintLine ( nDocID, 0, "Каляка-баляка"); //Сам текст
Doc_SetFont ( nDocID, 0, FONT_Book); //Обычный шрифт
Doc_PrintLine ( nDocID, 0, ""); //Пропуск строки
Doc_PrintLines ( nDocID, 0, "Каляка баляка"); //Текст
Doc_PrintLine ( nDocID, 0, ""); //Пропуск строки
Doc_PrintLines ( nDocID, 0, "Каляка баляка"); //И так далее и т.п.
Можете пропускать строки, не пропускать... и писать что угодно.

//2.Seite //Тоже самое, только для второй страницы.

Doc_SetMargins ( nDocID, -1, 30, 20, 275, 20, 1 );
Doc_SetFont ( nDocID, 1, FONT_BookHeadline );
Doc_PrintLine ( nDocID, 1, "НАЧАЛО");
Doc_SetFont ( nDocID, 1, FONT_Book);
Doc_PrintLine ( nDocID, 1, "");
Doc_PrintLine ( nDocID, 1, "The end!");
Doc_PrintLine ( nDocID, 1, "");
Doc_PrintLines ( nDocID, 1, "КОНЕЦ!");

Doc_Show ( nDocID);
};
/////////////////////////////////////////////////////////////////////////////////////////////

Вот и весь тутор. Все функции и предметы проверены в игре лично ВенДиго
(С).
Автор: ВенДиго(С).
DEDROIT вне форума   Ответить с цитированием
Старый 17.06.2006, 19:51   #16
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

И ЕЩЁ ОДИН ТУТОР МЕНГУСА
Описание создание мощного оружия.
В файле
IT_Addon_Weapons.d
Пишем

prototype DeathWeaponPrototype(C_Item)
{
name = "Темная смерть";
mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;
damagetype = DAM_EDGE;
range = Range_Orkschlaechter;
cond_atr[2] = ATR_STRENGTH;
cond_value[2] = DeathSWDCond;
visual = "ItMw_065_1h_sword_bastard_04.3DS";
effect = "SPELLFX_CROSSBOW";
on_equip = Equip_1H_05;
on_unequip = UnEquip_1H_05;
description = name;
text[2] = NAME_OneHanded;
text[3] = NAME_Damage;
count[3] = damageTotal;
text[4] = "Заряд меча";
text[5] = NAME_Value;
count[5] = value;
};

instance ItMw_DeathWeapon(DeathWeaponPrototype)
{
value = 500;
damageTotal = DeathSWDDamage;
count[3] = damageTotal;
text[4] = "Выглядит странно";
count[5] = value;
};

instance ItMw_DeathWeapon_Upgraded(DeathWeaponPrototype)
{
value = 1500;
damageTotal = DeathSWDDamage;
count[3] = damageTotal;
count[4] = DeathSWDPoints;
count[5] = value;
};

// создаем подзарядник
instance ItMi_C2(C_Item)
{
name = "камень";
mainflag = ITEM_KAT_NONE;
flags = ITEM_MISSION;
value = 2;
visual = "ItMi_Aquamarine.3ds";
scemeName = "MAPSEALED";
material = MAT_LEATHER;
on_state[0] = UseC2;
description = "Магический камень";
text[0] = "Заряжает меч";
text[1] = "Темная Смерть";
text[2] = "";
text[3] = "";
text[4] = "";
text[5] = NAME_Value;
count[5] = value;
};

func void UseC2()
{
DeathSWDPoints += 10;// +10 пунктов
DeathLevel += 1; //+ 1 повреждений в секунду
ItMw_DeathWeapon_Upgraded.count[4] = DeathSWDPoints;// обновить текст
};





тут вроде-бы всё понятно, идем дальше...
в файле
Story_Globals.d
прописываем в конец

Код

const int DeathLevel = 1;//повреждения в секунду
const int DeathSWDPoints = 7;// пункты повреждений
const int DeathSWDDamage = 30;// повреждения меча (можно хоть 1000000)
const int DeathSWDCond = 30;// требуется силы (можно хоть 1000000)




А сейчас настанет самое интересное....

в файле
B_BeliarsWeaponSpecialDamage.d
пишем в конец



Код

func int GetDamSword(var C_Npc Get_dam) // ф-ция расчета повреждений
{
var int getDamage;
var int Dam1age;
var int dam_weap;
var int rnd_1;
var int critical;
var int rnd_2;
var int crit_1;
var int crit_2;
/*****************переменная Dam_weap равна повреждениям оружия, которое в руках у гг*******************/
//----------------------------------------------
var C_Item DamOfWeapon;
DamOfWeapon = Npc_GetReadiedWeapon(Get_dam);
dam_weap = DamOfWeapon.damageTotal;
//----------------------------------------------
rnd_1 = Hlp_random(25) + 1;
rnd_2 = Hlp_random(5) + 1;
critical = Hlp_random(120);
crit_1 = Get_dam.level;
crit_2 = get_Dam.attribute[atr_STRENGTH];
Dam1age = Get_dam.hitchance[NPC_TALENT_1h];
//формулы расчета
if(Dam1age > critical)
{
getDamage = (dam_weap) + ((crit_1 + Crit_2 + dam1age + DeathLevel) / 25) + (rnd_1 + rnd_2);//КРИТИЧЕСКОЕ ПОВРЕЖДЕНИЕ
}
else if(Dam1age >= critical - 25)
{
getDamage = (dam_weap / 2) + ((crit_1 + Crit_2 + dam1age + DeathLevel) / 50) + (rnd_1 / rnd_2);// среднее
}
else
{
getDamage = (dam_weap / 3) + ((crit_1 + Crit_2 + dam1age + DeathLevel) / 75) - (Crit_1 / ((rnd_1 / rnd_2) + (rnd_1 - rnd_2) + 1));// минимальное
};
if(getdamage < 35)// повреждения меньше 35
{
getDamage = 35;// повреждения равны 35
};
return getDamage; //возвращаем GetDamage
};

func void B_DeathWeaponSpecialDamage(var C_Npc oth,var C_Npc slf)//ф-ция спец повреждения
{
var int Damage_swd;
var C_Item ReadyWeap; // переменная
ReadyWeap = Npc_GetReadiedWeapon(oth); // ЭТО -> Оружие которое мы держим в руках
if(Hlp_IsItem(ReadyWeap,ItMw_DeathWeapon_Upgraded) == TRUE) //это оружие -> наш меч
{
var int specVozd;//рэндомная переменная для спец. воздействия ->1
var int specDamage;//рэндомная переменная для спец. повреждения ->2
SpecVozd = Hlp_random(100) + 1;//1
SpecDamage = Hlp_random(100) + 1;//2
if(DeathSWDPoints >= 1)// пунктов повреждения больше, чем 0
{
Damage_swd = GetDamSword(oth); //рассчитать повреждения
if(specDamage <= 80)//если переменная (2) равна или меньше 80 ->
{
Wld_PlayEffect("spellFX_BELIARSRAGE_target_Cl oud",slf,slf,0,0,0,FALSE);//спецэффекты
Wld_PlayEffect("spellFX_WindFist",slf,sl f,0,0,0,FALSE);
Wld_PlayEffect("spellFX_PalDestroyEvil", slf,slf,0,0,0,FALSE);
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE&q uot;,oth,oth,0,0,0,FALSE);
B_magicHurtNpc(oth,slf,Damage_swd);//наносим врагу повреждение
DeathSWDPoints -= 1;//пункты повреждения уменьшаются на 1
ItMw_DeathWeapon_Upgraded.count[4] = DeathSWDPoints;//обновить текст.
};
if((oth.attribute[atr_mana] < oth.attribute[atr_mana_max]) && (slf.attribute[atr_mana] > (Damage_swd / 9)))//у гг мана меньше максимальной и у жертвы маны больше, чем повреждения меча разделённые на 9 -> пьём ману
{
oth.attribute[atr_mana] += (Damage_swd / 20);// slf.attribute[atr_mana] -= (Damage_swd / 10);//
};
if((oth.attribute[atr_hitpoints] < oth.attribute[atr_hitpoints_max]) && (slf.attribute[atr_hitpoints] >= (Damage_swd / 9))) )))//у гг жизнь меньше максимальной и у жертвы жизнь больше, чем повреждения меча разделённые на 9 -> пьём жизнь

{
oth.attribute[atr_hitpoints] += (Damage_swd / 20);
B_magicHurtNpc(oth,slf,Damage_swd / 10);
};
if((specVozd >= 20) && (DeathSWDPoints >= 5))// переменная (1) меньше или равна 20 **UND** Пнктов повреждения больше, чем 4
{
DeathSWDPoints -= 5;//пункты повреждения уменьшаются на 5
AI_StartState(self,ZS_SwdDeath,0,"");//спец. воздействие (см. ниже)
ItMw_DeathWeapon_Upgraded.count[4] = DeathSWDPoints;//обновить текст.
};
};
};
};






в B_AssessDamage.d
und
в B_mm_AssessDamage.d


Код

после

B_BeliarsWeaponSpecialDamage(other,self);
пишем
B_DeathWeaponSpecialDamage(other,self);





Создаем в папке AI/MAGIC/ZS_Magic
файл
ZS_SwdDeath.d
с таким содержимым




Код

func void B_StopSwdDeath()// оканчиваем эффект
{
Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagic );
Npc_ClearAIQueue(self);
AI_Standup(self);
if(self.guild < GIL_SEPERATOR_HUM)
{
B_AssessDamage();
AI_ContinueRoutine(self);
}
else
{
Npc_SetTempAttitude(self,ATT_HOSTILE);
AI_ContinueRoutine(self);
};
};

func int ZS_SwdDeath()
{
Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopSwd Death);// при повреждениях магией -> оканчиваем эффект
if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE))
{
AI_Standup(self);
}
else
{
AI_StandupQuick(self);
};
if(self.guild < GIL_SEPERATOR_HUM)
{
Npc_PlayAni(self,"S_FIRE_VICTIM");
};
return TRUE;
};

func int ZS_SwdDeath_Loop()
{
Npc_PercEnable(self,PERC_ASSESSMAGIC,B_StopSwdDeat h);
if(Npc_GetStateTime(self) == 1)//нпц находится в положении 1-у ИГРОВУЮ секунду
{
Npc_SetStateTime(self,0);// обнуляем время
B_MagicHurtNpc(other,self,DeathLevel);// наносим повреждения , равные переменной DeathLevel (см. начало), т.е. за 15 секунд на 1-м уровне повреждений (DeathLevel) Наносятся 15 повреждений
Self.aivar[AIV_DeathSwdVozdTime] += 1;// прошла 1 секунда (РЕАЛЬНОГО ВРЕМЕНИ!)
};
if(Self.aivar[AIV_DeathSwdVozdTime] >= 15)// 15 секунд прошло
{
Npc_SetStateTime(self,0);
B_MagicHurtNpc(other,self,DeathLevel * 2);// наносим повреждения вдвое большие, чем переменная DeathLevel (см. начало)
Self.aivar[AIV_DeathSwdVozdTime] = 0;// обнуляем аивар
/****************заканчиваем спец. воздействие*******************/
Npc_ClearAIQueue(self);
AI_Standup(self);
return LOOP_END;
/************************************************** ***************/
};
if(self.guild < GIL_SEPERATOR_HUM)// если гильдия людей -> проигрываются анимации и положение(состояние?) тела нпц - BS_UNCONSCIOUS
{
AI_PlayAniBS(self,"T_STAND_2_SUCKENERGY_VICTI M",BS_UNCONSCIOUS);
AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM&qu ot;,BS_UNCONSCIOUS);
};
if(self.attribute[ATR_HITPOINTS] <= 0)// если здоровья меньше 1 -> заканчиваем спец. воздействие
{
Npc_ClearAIQueue(self);
AI_Standup(self);
return LOOP_END;
};
return LOOP_CONTINUE;// продолжаем
};

func void ZS_SwdDeath_End()
{
Npc_ClearAIQueue(self);
AI_Standup(self);
if((self.guild < GIL_SEPERATOR_HUM) && (self.attribute[ATR_HITPOINTS] >= 1))// здоровья > 0 UND у НПЦ Гильдия людей
{
AI_StartState(self,ZS_Flee,0,"");//нпц убегает
};
};

в файле AI/AI_INTERN/AI_constants.d
после
const int AIV_SuckEnergyStateTime = 79;
пишем
const int AIV_DeathSwdVozdTime = 94; // аивар для времени спец. воздействия






в Gothic.src


Код

после
AI\MAGIC\ZS_MAGIC\ZS_MAGICBURN.D
пишем
AI\MAGIC\ZS_MAGIC\ZS_SwdDeath.Dпотом прописываем меч в инвентаре у гг вместе с подзарядниками

DEDROIT вне форума   Ответить с цитированием
Старый 17.06.2006, 21:44   #17
Готоман
Ученик
 
Аватар для S.V-2
 
Регистрация: 08.06.2006
Сообщений: 149
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для S.V-2 с помощью ICQ
По умолчанию Скриптинг

Вопрос может показаться не уместным, как создать фаил .d - в блокноте?

Цитата:
Заходим в
Gothic II\_work\Data\Scripts\Content\Story\NPC
и создаём там файл
NONE_1000_DEDROIT.d
что-то я не понял? Если в блокноте, то как переименовать его расширение (.txt). Может с помощью какой программы, дайте ссылку скачать.
S.V-2 вне форума   Ответить с цитированием
Старый 17.06.2006, 22:15   #18
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

S.V-2
Я лично не создаю файл,я скопирую существующий Готики и переименоваю и пользуюсь.
DEDROIT вне форума   Ответить с цитированием
Старый 19.06.2006, 16:28   #19
Готоман
Посвященный
 
Аватар для LeGuDaa
 
Регистрация: 01.02.2006
Адрес: Бухарест
Сообщений: 382
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для LeGuDaa с помощью ICQ
По умолчанию Скриптинг

Немного глупый вопрос... Точнее даже два...
1. Все итемки лежат в одном файле? То есть все амулеты в одном, все кольца в одном и тд, так?
2. Как допустим ввести в игру монстра? Допустим я хочу сделать падальщика с такими-то атрибутам, допустим \"падальщик всех падальщиков\" и появить его допустим... да не важно... Вопщем суть вопроса: Как вставлять в игру монстров?
LeGuDaa вне форума   Ответить с цитированием
Старый 19.06.2006, 21:27   #20
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,379
Сказал(а) спасибо: 34
Поблагодарили 223 раз(а) в 64 сообщениях
Отправить сообщение для DEDROIT с помощью ICQ
По умолчанию Скриптинг

LeGuDaa
1)Все лежат в разных.(но в одной папке Items),а в файлах разных.
2)ПРопиши своего монстра в стартопе и всё.
DEDROIT вне форума   Ответить с цитированием
Ответ

Метки
доп.программы, полезная информация, скриптинг, советы, ссылки


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:36. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Magic Team© 2006-2013, The development and modification