DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
И так, я начну:
Заходим в
Gothic II\_work\Data\Scripts\Content\Story\NPC
и создаём там файл
NONE_1000_DEDROIT.d

где
NONE – принадлежность к гильдии (в данном случае нейтрал,без гильдии).
1000 – уникальный порядковый номер НПС.
DEDROIT – имя вашего НПС.

Вот содержимое файла:

instance NONE_1000_DEDROIT (Npc_Default) //это создание персонажа (инстанции) от общего прототипа НПС
{
//-------------
//Данные персонажа
//-------------
name = "Арес"; //Имя нпс.
guild = GIL_NONE; //Принадлежность к гильдии.
npctype = NpcType_Friend; //Это отношение к главному герою(в нашем случае дружелюбный).
flags = 0; //Определяет "бессмертие" НПС. 0 - смертный, Npc_Flag_Immortal - бессмертный, Npc_Flag_Ghost - призрак.
id = 1000; //Порядковый номер персонажа.
level = 25; //Уровень НПС.
voice = 6; //Голос персонажа.
//-------------
//Аттрибуты
//--------------------
attribute[ATR_STRENGTH] = 170; //Сила
attribute[ATR_DEXTERITY] = 150; //Ловкость
attribute[ATR_MANA_MAX] = 110; //Максимальная мана
attribute[ATR_MANA] = 110; //Текущая мана
attribute[ATR_HITPOINTS_MAX] = 200; //Максимальное здоровье
attribute[ATR_HITPOINTS] = 200; //Текущее здоровье
//-------------
//Защита
//----------------------
protection [PROT_BLUNT] = 0; //От тупого оружия
protection [PROT_EDGE] = 0; //От лезвия
protection [PROT_POINT] = 0; //От стрел
protection [PROT_FIRE] = 0; //От огня
protection [PROT_FLY] = 0; //От падения
protection [PROT_MAGIC] = 0; //От магии
//-------------
//Урон
//------------------------
damage [DAM_INDEX_BLUNT] = 0; //Тупым оружием
damage [DAM_INDEX_EDGE] = 0; //Лезвием
damage [DAM_INDEX_POINT] = 0; //Стрелами
damage [DAM_INDEX_FIRE] = 0; //Огнем
damage [DAM_INDEX_MAGIC] = 0; //Магией
//-------------
//Таланты
//---------------------
HitChance [NPC_TALENT_1H] = 60; //Владение Одноручником
HitChance [NPC_TALENT_2H] = 50; //Владение Двуручником
HitChance [NPC_TALENT_BOW] = 60; //Умение обращаться с Луком
HitChance [NPC_TALENT_CROSSBOW] = 30; //Умение обращаться с Арбалетом
Npc_SetTalentSkill (self, NPC_TALENT_PICKLOCK, 1); //Взлом замков
Npc_SetTalentSkill (self, NPC_TALENT_SNEAK, 1);//Подкрадывание
Npc_SetTalentSkill (self, NPC_TALENT_ACROBAT, 1); //Акробатика
//Значение 1 - выучено, 0 - невыучено.
//-------------
//Визуализация
//------------------
Mdl_SetModelFatness (self, 0); //Это как будет выглядеть персонаж толстым или худым.
Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds"); //оверлей анимаций.
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_N_NormalBart03, BodyTex_N, ITAR_Bau_M);
//Male - мужской пол, Female - женский пол.
//Hum_Head_FatBald->вид головы.
//Face_N_NormalBart03->лицо вашего персонажа.
//BodyTex_N->текстура тела.
//ITAR_Bau_M->доспехи, одетые на персонажа.
//---------------
//Экипировка
//--------------------
EquipItem (self, ItMW_Addon_Stab01); //то, что надето на персонаже(в дано случаи волчий нож)!
EquipItem (self, ItRw_Addon_MagicBow); //Магический лук
//Все вещи,которыесть в игре можно посмотреть в папке Items.
//----------------
//Инвентарь
//--------------------
CreateInvItems (self, ItAm_Prot_Fire_01, 2); //Это то что будет находится в Инвентаре(в данном случаи амулет огня).
//Как я уже и сказал все вещи можно посмотреть в папке Items.
//---------------
//Чувства
//-----------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR; //Зрение, обаняние, слух.
senses_range = 2000; //Расстояние действия чувств !
//----------------
//Искусственный интеллект
//------
fight_tactic = FAI_HUMAN_STRONG; //Эта функция отвечает,за то как будет драться нпс,ещё есть FAI_HUMAN_MASTER и FAI_HUMAN_COWARD!
daily_routine = rtn_start_1000; //Ввод распорядка дня.
};
//----------------
//Распорядок дня
//---------------
func void rtn_start_1000() //функция распорядка дня
{
TA_Smoke_Joint (8, 0, 22, 0, "NW_FARM1_OUT_01");
TA_Smoke_Joint (22, 0, 8, 0, "NW_FARM1_OUT_01");
};
//TA_Smoke_Joint->стоит и курит болотник!
//8, 0, 22, 0->время, в течении которого нпс совершает действие.
//NW_FARM1_OUT_01->название вайпоинта,где будет стоять ваш нпс (В даном случае возле Лобарта)!
//Самый быстрый способ посмотреть нужный вам вейпоинт,это зайти в Spacer и полетать по нему! Вот так приблизительно должен выглядеть скрипт без комментариев:

instance NONE_1000_DEDROIT (Npc_Default)
{
//-------------
//Данные персонажа
//-------
name = "Арес";
guild = GIL_NONE;
npctype = NpcType_Friend;
level = 25;
voice = 6;
id = 1000;
//-------------
//Аттрибуты
//---------------
attribute[ATR_STRENGTH] = 170;
attribute[ATR_DEXTERITY] = 150;
attribute[ATR_MANA_MAX] = 110;
attribute[ATR_MANA] = 110;
attribute[ATR_HITPOINTS_MAX] = 200;
attribute[ATR_HITPOINTS] = 200;
//-------------
//Визуализация
//------------
Mdl_SetModelFatness (self, 0);
Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds");
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_N_NormalBart03, BodyTex_N, ITAR_Bau_M);
//-------------
//Таланты
//----------------
HitChance [NPC_TALENT_1H] = 60;
HitChance [NPC_TALENT_2H] = 50;
HitChance [NPC_TALENT_BOW] = 60;
HitChance [NPC_TALENT_CROSSBOW] = 30;
//-------------
//Инвентарь
//---------------
CreateInvItems (self, ItAm_Prot_Fire_01, 2);
EquipItem (self, ItMW_Addon_Stab01);
EquipItem (self, ItRw_Addon_MagicBow);
//-------------
//Чувства
//-------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR;
senses_range = 2000;
//-------------
//АИ
//------------------------
fight_tactic = FAI_HUMAN_MASTER;
daily_routine = Rtn_Start_1000;
};
func void Rtn_Start_1000()
{
TA_Smoke_Joint (8,0,22,0,"NW_FARM1_OUT_01");
TA_Smoke_Joint (22,0,8,0,"NW_FARM1_OUT_01");
};Теперь вставляем нпс в игру!

Открываем файл Gothic II\_work\Data\Scripts\Content\Story\StartUp.d Находим в нём строку Wld_InsertNpc(BAU_950_Lobart,”NW_FARM1_OUT_01”);
дописываем ниже Wld_InsertNpc(NONE_1000_DEDROIT,”NW_FARM1_OUT_01”);
Открываем прогу Spacer(она находится в Gothic II\System)
Нажимаем World\Reparse Script(заменить скрипты), выбираем Gothic.src и нажимаем открыть. Будет идти компиляция скриптов.
Всё теперь заходим в игру,только обязательно начинаем игру с начала!И вооля !!

Примечание: Если во время компиляции будут ошибки,вы должны их исправить и произвести компиляцию заново. Убедитесь, что файл NONE_1000_DEDROIT.d включен в процесс компиляции (добавлен в gothic.src либо как STORY\NPC\*.d, либо как Story\NPC\NONE_1000_DEDROIT.d).

Список распорядка дня нпс:

TA_Announce_Herold – Объявления Герольда
TA_Circle – Ритуал в Круге солнца
TA_Concert – Концерт InExtremo в аддоне
TA_Cook_Cauldron – Приготовление пищи в котле
TA_Cook_Pan – Приготовление пищи на сковороде
TA_Cook_Stove – Приготовление пищи в печи
TA_Dance – Танцы НПС
TA_FleeToWp – НПС убегает на свою точку
TA_Follow_Player – НПС следует за ГГ
TA_Ghost – Поведение призраков
TA_GhostWusel – Поведение Радемеса
TA_Guard_Hammer – Охрана Святого молота
TA_Guard_Passage – Охрана прохода
TA_Guide_Player – ГГ следует за НПС
TA_Pee – НПС справляет малую нужду
TA_Pick_FP – НПС бродит по PICK фрипоинтам (что-то ищет или собирает)
TA_Pick_Ore – Добыча руды
TA_Play_Lute – Игра на лютне
TA_Potion_Alchemy – Приготовление алхимических напитков
TA_Practice_Magic – Тренировка магии (не используется)
TA_Practice_Sword – Упражнения с мечом
TA_Pray_Innos – Молитва статуям Инноса
TA_Pray_Innos_FP – Молитва Инносу на заданной точке PRAY
TA_Pray_Sleeper – Молитва статуям Белиара (не используется)
TA_Pray_Sleeper_FP – Молитва Белиару на заданной точке PRAY (не используется)
TA_Preach_Vatras – Проповедь Ватраса
TA_Rake_FP – Работа в поле
TA_Read_Bookstand – Чтение книг
TA_RangerMeeting – Собрание “Кольца Воды” у Орлана
TA_Repair_Hut – Ремонт хижины
TA_Roast_Scavenger – Барбекю из Падальщика
TA_RunToWP – НПС бежит на охраняемую точку
TA_Saw – Распиловка древесины
TA_Sit_Bench – Сидеть на скамье
TA_Sit_Campfire – Сидеть у костра
TA_Sit_Chair – Сидеть на стуле
TA_Sit_Throne – Сидеть на троне
TA_Sleep – Спать на кровати
TA_Sleep_Deep – Очень крепко спать на кровати (не используется)
TA_Smalltalk – Мини диалог между НПС
TA_Smith_Anvil – Использование наковальни (ковка оружия)
TA_Smith_Cool – Закалка заготовки оружия
TA_Smith_Fire – Разогрев заготовки оружия в горне
TA_Smith_Sharp – Заточка оружия
TA_Smoke_Joint – Курение болотника
TA_Smoke_Waterpipe – Курение кальяна
TA_Spit_Fire – Игра с факелами (не используется)
TA_Stand_ArmsCrossed – Стоять скрестив руки
TA_Stand_Dementor – Состояние ожидания Черных магов (Ищущие)
TA_Stand_Drinking – Пить самогон стоя
TA_Stand_Eating – Употреблять пищу стоя
TA_Stand_Guarding – Охрана территории
TA_Stand_Sweeping – Уборка территории
TA_Stand_WP – Стоять на вайпоинте
TA_Stomp_Herb – Толочь траву
TA_Study_WP – Заниматься науками (передача листа бумаги (записки) ГГ)
TA_Sweep_FP – Работа щеткой
TA_Wash_FP – Умываться (не используется)

Есть ещё одна функция распорядка дня (не оформлена через ТА)
ZS_Bandit – Поведение бандита

Полный список гильдий:

NONE – нейтрал, без гильдии.
BAU – крестьянин;
BDT – бандит;
KDW – маг воды;
MIL – милиция;
PIR – пират;
VLK – горожанин;
DJG – охотник на драконов;
KDF – маг огня;
NOV – послушник;
PAL – паладин;
SLD – наёмник;

Список бронь, которые есть в игре:

ITAR_MIL_L,Легкие доспехи стражника
ITAR_MIL_M,Тяжелые доспехи стражника
ITAR_PAL_M,Доспехи рыцаря
ITAR_PAL_H,Доспехи паладина
ITAR_SLD_L,Легкие доспехи наемника
ITAR_SLD_M,Средние доспехи наемника
ITAR_SLD_H,Тяжелые доспехи наемника
ITAR_DJG_Crawler,Доспехи из панцирей ползунов
ITAR_DJG_L,Легкие доспехи ОнД
ITAR_DJG_M,Средние доспехи ОнД
ITAR_DJG_H,Тяжелые доспехи ОнД
ITAR_DJG_BABE,Кольчуга охотницы за драконами
ITAR_NOV_L,Ряса послушника
ITAR_KDF_L,Мантия Мага Огня
ITAR_KDF_H,Тяжелая мантия Мага Огня
ITAR_Leather_L,Кожаные доспехи
ITAR_BDT_M,Средняя бандитская кольчуга
ITAR_BDT_H,Тяжелая бандитская кольчуга
ITAR_RANGER_Addon,Кольчуга ‘Кольца Воды’
ITAR_Fake_RANGER,Разорванная кольчуга
ITAR_KDW_L_Addon,Легкая мантия Магов Воды
ITAR_KDW_H,Мантия Мага Воды
ITAR_PIR_L_Addon,Одежда пирата
ITAR_PIR_M_Addon,Доспехи пирата
ITAR_PIR_H_Addon,Одежда капитана
ITAR_VLK_L,Одежда горожанина
ITAR_VLK_M,Одежда горожанина
ITAR_VLK_H,Одежда горожанина
ITAR_VlkBabe_L,Одежда горожанки 1
ITAR_VlkBabe_M,Одежда горожанки 2
ITAR_VlkBabe_H,Одежда горожанки 3
ITAR_BAU_L,Одежда крестьянина 1
ITAR_BAU_M,Одежда крестьянина 2
ITAR_BauBabe_L,Одежда крестьянки 1
ITAR_BauBabe_M,Одежда крестьянки 2
ITAR_Bloodwyn_Addon,Кольчуга Бладвина
ITAR_FireArmor_Addon,Магическая кольчуга
ITAR_MayaZombie_Addon,Древняя кольчуга
ITAR_OreBaron_Addon,Броня барона
ITAR_Raven_Addon,Кольчуга Равена
ITAR_Thorus_Addon,Тяжелая кольчуга гардиста
ITAR_BARKEEPER,Одежда трактирщика
ITAR_CorAngar,Кольчуга Кор Ангара
ITAR_Dementor,Темная накидка
ITAR_Diego,Кольчуга Диего
ITAR_Governor,Накидка гор. советника
ITAR_JUDGE,Одежда судьи
ITAR_LESTER,Роба Лестера
ITAR_SMITH,Одежда кузнеца
ITAR_XARDAS,Мантия Темных Искусств
ITAR_Prisoner,Одежда заключенного
ITAR_PAL_SKEL,Древняя кольчуга
NO_ARMOR,Нет доспех
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Теперь попробуем создать диалог:
Пример №1.

В папке
Gothic II\_work\Data\Scripts\Content\Story\Dialoge
создаём файл
DIA_NONE_1000_Dedroit.d
(файл с диалогом – допустим, убить кого-нибудь)!

Вот содержимое этого файла:

instance DIA_Dedroit_q (C_Info)
{
npc = NONE_1000_Dedroit; //ваш нпс
nr = 2;
condition = dia_Dedroit_q_condition;
information = dia_Dedroit_q_info;
permanent = FALSE;
important = FALSE; //если false то диалог начинаете вы,если TRUE нпс начинает разговор с вами!
description = "Я могу чем нибудь помочь?";
};

func int dia_Dedroit_q_condition()
{
return TRUE;
};

func void dia_Dedroit_q_info()
{
AI_Output(other,self,"DIA_Dedroit_q_15_00"); //Я могу чем нибудь помочь?
AI_Output(self,other,"DIA_Dedroit_q_3_01"); //Да ты можешь мне почь!Ты бы мог бы убить Вино?
Info_ClearChoices(DIA_Dedroit_q);
Info_AddChoice(dia_Dedroit_q,"Нет я не буду тебе помогать.",dia_Dedroit_q_w); //Это варианты ответов,которые будут отображаться в меню диалога!
Info_AddChoice(dia_Dedroit_q,"Хорошо я убью Вино",dia_Dedroit_q_e); //Это второй вариант ответа!
};

//Если он отказывается помогать ,то
func void dia_Dedroit_q_w()
{
AI_Output(other,self,"dia_Dedroit_q_w_15_00"); //Я не буду помогать тебе!
AI_Output(self,other,"dia_Dedroit_q_w_03_01"); //Тогда не жди и отменя помощи.
};

//Если игрок соглашается,то
func void dia_Dedroit_q_e()
{
AI_Output(other,self,"dia_Dedroit_q_e_15_00"); //Хорошо я погу тебе.
AI_Output(self,other,"dia_Dedroit_q_e_03_01"); //Вот и отлично,еслт ты его убьёшь я щедро вознагрожу тебя!
Log_CreateTopic(TOPIC_KillVino,LOG_MISSION);
Log_SetTopicStatus(TOPIC_KillVino,LOG_Running); //дневник
B_LogEntry(TOPIC_KillVino,"Арес попросил меня убить Вино."); //запись в дневнике
MIS_KillVino = LOG_Running; //Это означает,что миссия началась!
};

instance DIA_Dedroit_q2 (C_Info)
{
npc = NONE_1000_Dedroit;
nr = 1;
condition = dia_Dedroit_q2_condition;
information = dia_Dedroit_q2_info;
permanent = FALSE;
important = FALSE;
description = "Я убил Вино.";
};

func int dia_Dedroit_q2_condition()
{
if(Npc_IsDead(Vino) && (MIS_KillVino == LOG_Running))
//это означает,что если Вино мёртв то начинается этот диалог!
{
return TRUE;
};
};

func void dia_Dedroit_q2_info()
{
AI_Output(other,self,"dia_Dedroit_q2_info_15_00"); //Я убил Вино.
AI_Output(self,other,"dia_Dedroit_q2_info_3_01"); //Великолепно, как я и обещал - мой подарок!
MIS_KillVino = LOG_SUCCESS; //миссия завершена
Log_SetTopicStatus(TOPIC_KillVino,LOG_SUCCESS);
B_LogEntry(TOPIC_KillVino,"Я убил вино, а Арес как и обещал дал мне подарок."); //запись в дневнике
B_GivePlayerXP(500); //количество получаемого опыта,в даном случае - 500.
b_giveinvitems(self,other,ItMW_Addon_Stab03,1); //непись даёт нам подарок посох воды!
};

instance NONE_1000_Dedroit_EXIT(C_Info)
{
npc = NONE_1000_Dedroit;
nr = 999;
condition = NONE_1000_Dedroit_EXIT_Condition;
information = NONE_1000_Dedroit_EXIT_Info;
permanent = TRUE;
description = "Конец";
};

func int NONE_1000_Dedroit_EXIT_Condition()
{
return TRUE;
};

func void NONE_1000_Dedroit_EXIT_Info()
{
AI_StopProcessInfos(self);
};Вот так должен выглядеть наш диалог без комментариев:

instance DIA_Dedroit_q (C_Info)
{
npc = NONE_1000_Dedroit;
nr = 2;
condition = dia_Dedroit_q_condition;
information = dia_Dedroit_q_info;
permanent = FALSE;
important = FALSE;
description = "Я могу чем нибудь помочь?";
};
func int dia_Dedroit_q_condition()
{
return TRUE;
};
func void dia_Dedroit_q_info()
{
AI_Output(other,self,"DIA_Dedroit_q_15_00"); //Я могу чем нибудь помочь?
AI_Output(self,other,"DIA_Dedroit_q_3_01"); //Да ты можешь мне почь!Ты бы мог бы убить Вино?
Info_ClearChoices(DIA_Dedroit_q);
Info_AddChoice(dia_Dedroit_q,"Нет я не буду тебе помогать.",dia_Dedroit_q_w);
Info_AddChoice(dia_Dedroit_q,"Хорошо я убью Вино",dia_Dedroit_q_e);
};
func void dia_Dedroit_q_w()
{
AI_Output(other,self,"dia_Dedroit_q_w_15_00"); //Я не буду помогать тебе!
AI_Output(self,other,"dia_Dedroit_q_w_03_01"); //Тогда не жди и отменя помощи.
AI_StopProcessInfos(self);
};
func void dia_Dedroit_q_e()
{
AI_Output(other,self,"dia_Dedroit_q_e_15_00"); //Хорошо я погу тебе.
AI_Output(self,other,"dia_Dedroit_q_e_03_01"); //Вот и отлично,еслт ты его убьёшь я щедро вознагрожу тебя!
Log_CreateTopic(TOPIC_KillVino,LOG_MISSION);
Log_SetTopicStatus(TOPIC_KillVino,LOG_Running);
B_LogEntry(TOPIC_KillVino,"Арес попросил меня убить Вино.");
MIS_KillVino = LOG_Running;
AI_StopProcessInfos(self);
};
instance DIA_Dedroit_q2 (C_Info)
{
npc = NONE_1000_Dedroit;
nr = 1;
condition = dia_Dedroit_q2_condition;
information = dia_Dedroit_q2_info;
permanent = FALSE;
important = FALSE;
description = "Я убил Вино.";
};
func int dia_Dedroit_q2_condition()
{
if(Npc_IsDead(Vino) && (MIS_KillVino == LOG_Running))
{
return TRUE;
};
};
func void dia_Dedroit_q2_info()
{
AI_Output(other,self,”dia_Dedroit_q2_info_15_00”); //Я убил вино.
AI_Output(self,other,”dia_Dedroit_q2_info_3_01”); //Великолепно,как я и обещал мой подарок!
MIS_KillVino=LOG_SUCCESS;
Log_SetTopicStatus(TOPIC_KillVino,LOG_SUCCESS);
B_LogEntry(TOPIC_KillVino,”Я убил вино,а арес как и обещал дал мне подарок.”);
B_GivePlayerXP(500);
b_giveinvitems(self,other,ItMW_Addon_Stab03,1);
};
instance NONE_1000_Dedroit_EXIT(C_Info)
{
npc = NONE_1000_Dedroit;
nr = 999;
condition = NONE_1000_Dedroit_EXIT_Condition;
information = NONE_1000_Dedroit_EXIT_Info;
permanent = TRUE;
description = “Конец”;
};
func int NONE_1000_Dedroit_EXIT_Condition()
{
return TRUE;
};
func void NONE_1000_Dedroit_EXIT_Info()
{
AI_StopProcessInfos(self);
};
Дальше заходим в Story_Globals и в самом конце прописываем
var int MIS_KillVino;
Потом заходим допустим в
LOG_Constants_Yoly
(находится в папке \Story\Log_Entries)
и в самом конце прописываем
const string TOPIC_KillVino= “Убийство Вино”;

Удаляем существующие Ou.bin и Ou.csl, находятся в Gothic II\_work\Data\Scripts\Content\Cutscene.
Потом запускаем Spacer2, выбираем окно Output-units->update (ждем) и потом Output-units->save. Нажимаем World->Reparse Script->gothic.src.

Скомпилировать gothic.dat и ou.bin можно также прогой от Vam’а.

Убедитесь, что файл DIA_NONE_1000_DEDROIT.d включен в процесс компиляции (добавлен в gothic.src либо как STORY\DIALOGE\DIA*.d, либо как Story\Dialoge\DIA_NONE_1000_DEDROIT.d).

Пример №2
Давайте создадим миссию допустим что-то принести:

В том файле пишем:

instance DIA_DEDEROIT_q3 (C_Info)
{
npc = NONE_1000_Dedroit;//имя непися
nr = 1; //важность,т.е в где будет стоять строка в начале в конце в середине.
condition = dia_DEDEROIT_q3_condition;
information = dia_DEDEROIT_q3_info;
permanent = FALSE;
important = FALSE;
description = "Я могу ещё чем нибудьпомочь"; //То что отображается в меню дилога
};
func int dia_DEDEROIT_q3_condition()
{
if(Npc_KnowsInfo(other, DIA_DEDROIT_q2)) //условие когда начнётся диалог,в нашем случаи после разговора о убийстве Вино
{
return TRUE;
};
};
func void dia_DEDEROIT_q3_info()
{
AI_Output(other,self,"DIA_DEDEROIT_q_15_00"); //Я могу ещё чем нибудьпомочь
AI_Output(self,other,"DIA_DEDEROIT_q_03_01"); //Да ты бы мог мне принести кольцо защиты от пламени!
Info_ClearChoices(DIA_DEDEROIT_q3);
Info_AddChoice(dia_DEDEROIT_q3,"Хорошо я принесу.",dia_DEDEROIT_q3_w); //Варианты ответов
Info_AddChoice(dia_DEDEROIT_q3,"Нет, забудь",dia_DEDEROIT_q3_e); //Варианты ответов
Info_AddChoice(dia_DEDEROIT_q3,"Ты мне уже надоел.",dia_DEDEROIT_q3_r); //Варианты ответов
};
//Если игрок соглашается
func void dia_DEDEROIT_q3_w()
{
AI_Output(other,self,"dia_DEDEROIT_q3_w_15_00"); //Хорошо я принесу тебе кольцо.
AI_Output(self,other,"dia_DEDEROIT_q3_w_03_01"); //Вот и отлично!
AI_StopProcessInfos (self);
Log_CreateTopic(TOPIC_q_r,LOG_MISSION);//дневник.
Log_SetTopicStatus(TOPIC_q_r,LOG_Running);//дневник(миссия началась)!
B_LogEntry(TOPIC_q_r,"Нужно принести кольцо для Ареса"); //запись в дневнике.
};
//если игрок отказывается
func void dia_DEDEROIT_q3_e()
{
AI_Output(other,self,"dia_DEDEROIT_q3_e_15_00"); //Нет, забудь.
AI_Output(self,other,"dia_DEDEROIT_q3_e_03_01"); //Ну и ладно!
AI_StopProcessInfos (self);
};
//Если игрок говорит третий вариант ответа
func void dia_DEDEROIT_q3_r()
{
AI_Output(other,self,"dia_DEDEROIT_q3_r_15_00"); //Забудь!
AI_Output(self,other,"dia_DEDEROIT_q3_r_03_01"); //Тогда умри!
AI_StopProcessInfos (self);
B_Attack(self,other,AR_NONE,1);//функция атаки,после разговора непись будет вас атаковать
};
instance DIA_DEDEROIT_q4 (C_Info)
{
npc = NONE_1000_Dedroit;//опятьже имя
nr = 1;
condition = dia_DEDEROIT_q4_condition;
information = dia_DEDEROIT_q4_info;
permanent = FALSE;
important = FALSE;
description = "Вот, я прнёс тебе кольцо";//отображение в меню диалога
};
func int dia_DEDEROIT_q4_condition()
{
if(Npc_HasItems(other, ItRi_Prot_Fire_01)>= 1) //он начнётся если привас будет это кольцо
{
return TRUE;
};
};
func void dia_DEDEROIT_q4_info()
{
AI_Output(other,self,"DIA_DEDEROIT_q4_15_00"); //Вот, я прнёс тебе кольцо!
AI_Output(self,other,"dia_DEDEROIT_q4_03_01"); //Отлично!
b_giveinvitems(other,self, ItRi_Prot_Fire_01,1);//вы отдаёте это кольцо!
B_GivePlayerXP(250);//это сеолько опыта вы получили
Log_SetTopicStatus(TOPIC_q_r,LOG_SUCCESS);//миссия закончена
B_LogEntry(TOPIC_q_r,"Я отдал Арксу кольцо.");//запись в дневнике
};TOPIC_q_r прописываем в \Story\Log_Entries\LOG_Constants_Yoly.d
и в конце прописываем const string TOPIC_q_r= “Кольцо для Ареса”;

А дальше тоже самое со Spacer’ом или прогой от Vam’a (написано выше)!
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Итак давайте подведём обобщение, создадим что-то типа мини мода. В него будет входить 2 новых НПС, 1 задание, новое оружие,новое письмо.

Всё что будет приведено ниже делается с помощью декомпилятора.

1) Давайте создадим новый меч;
Для этого заходим в DECOMPILED\_work\data\Scripts\_decompiled\Items
и открываем файл IT_Melee_weapons

там создаём скрипт:

instance ItMw_2h_Sld_Sword2(C_Item)
{
name = "Магический меч Тима";

mainflag = ITEM_KAT_NF;
flags = ITEM_2HD_SWD;

material = MAT_METAL;
wear = WEAR_EFFECT;
effect = "SPELLFX_CROSSBOW";

value = Value_Sld2hSchwert;

damageTotal = Damage_Sld2hSchwert;
damagetype = DAM_EDGE;
range = Range_Sld2hSchwert;

cond_atr[2] = ATR_STRENGTH;
cond_value[2] = Condition_Sld2hSchwert;

visual = "ItMw_035_2h_sld_sword_01.3DS";

description = name;

text[2] = NAME_Damage;
count[2] = damageTotal;
text[3] = NAME_Str_needed;
count[3] = cond_value[ 2];
text[4] = NAME_TwoHanded;
text[5] = NAME_Value;
count[5] = value;
};Я думаю здесь комментировать не надо и так всё понятно, просто подмечу что эти 2 строчки

wear = WEAR_EFFECT;
effect = "SPELLFX_CROSSBOW";означают что наш меч будет сверкать как магический арбалет.

2) Теперь создадим письмо;

заходим в DECOMPILED\_work\data\Scripts\_decompiled\Items
и открываем файл IT_Addon_Written

Там пишем скрипт нашего письма:

instance ITWr_Addon_Hinweis_05(C_Item)
{
name = "Письмо Ксардасу"; // название письма
mainflag = ITEM_KAT_DOCS;
flags = ITEM_MISSION; // флаг
value = 250; // сколько стоит
visual = "ItWr_Scroll_01.3DS"; // как выглядит
material = MAT_LEATHER;
on_state[0] = Use_Hinweis_05;
scemeName = "MAP";
description = name;
text[0] = "";
};

func void Use_Hinweis_05()
{
var int nDocID;
nDocID = Doc_Create();
Doc_SetPages(nDocID,1);
Doc_SetPage(nDocID,0,"letters.TGA",0);
Doc_SetFont(nDocID,0,FONT_BookHeadline);
Doc_SetMargins(nDocID,-1,50,50,50,50,1);
Doc_PrintLine(nDocID,0,"");
Doc_SetFont(nDocID,0,FONT_Book);
Doc_PrintLine(nDocID,0,"");
Doc_PrintLine(nDocID,0,"Парни,");
Doc_PrintLines(nDocID,0,"");
Doc_PrintLines(nDocID,0,"Привет мой старый друг,вот решил");
Doc_PrintLines(nDocID,0,"тебя поведать");
Doc_PrintLines(nDocID,0,"Давай встретимся в знакомом мне месте");
Doc_PrintLines(nDocID,0,"Возле таверны мёртвая гарпия.");
Doc_PrintLine(nDocID,0,"");
Doc_PrintLine(nDocID,0,"Рухар");
Doc_PrintLine(nDocID,0,"");
Doc_Show(nDocID);
};Ну а дальше идёт сам текст. Тут думаю всё понятно.

Теперь создаём скрипты 2 неписей:

Для этого заходим в DECOMPILED\_work\data\Scripts\_decompiled\Story\NPC и создаём там файл
под названием VLK_666_Tim:

instance VLK_666_Tim(Npc_Default)
{
name[ 0] = "Тим"; // имя
guild = GIL_VLK; // Гильдия(в нашем случае горожанин)
id = 666; // уникальный идентификатор.
voice = 13; // голос персонажа
flags = 0; // флаг (в нашем случае смертный)
npcType = NPCTYPE_AMBIENT; // тип персонажа (несюжетный)

// Ниже атрибуты,там всё понятно

attribute[ATR_STRENGTH] = 150;
attribute[ATR_DEXTERITY] = 150;
attribute[ATR_MANA_MAX] = 110;
attribute[ATR_MANA] = 110;
attribute[ATR_HITPOINTS_MAX] = 250;
attribute[ATR_HITPOINTS] = 250;

// Здесь таланты,оже понятно

HitChance [NPC_TALENT_1H] = 100;
HitChance [NPC_TALENT_2H] = 100;
HitChance [NPC_TALENT_BOW] = 100;
HitChance [NPC_TALENT_CROSSBOW] = 100;

B_GiveNpcTalents(self);
B_SetFightSkills(self,15);
fight_tactic = FAI_HUMAN_COWARD; // владение оружием

EquipItem(self, ItRw_Bow_M_04); // Лук одет
B_CreateAmbientInv(self);

B_SetNpcVisual(self,MALE,"Hum_Head_Bald",Face_N_NormalBart_Dusty,BodyTex_N, ITAR_VLK_L); // Внешность
Mdl_SetModelFatness(self,1);
Mdl_ApplyOverlayMds(self,"Humans_Relaxed.mds");

daily_routine = Rtn_Start_666;
};

func void Rtn_Start_666()
{
TA_Smoke_Joint (7,55,19,55,"NW_FARM1_OUT_01");
TA_Smoke_Joint (19,55,7,15,"NW_FARM1_OUT_01");
};Чувак стоит на ферме Лобарта и курит болотник.

Теперь создаём скрипт второго НПС под названием KDF_999_Ryxar:

instance KDF_999_Ryxar(Npc_Default)
{
name [0] = "Рухар";
guild = GIL_KDF;
id = 999;
voice = 13;
flags = 0;
npcType = NPCTYPE_AMBIENT;

attribute[ATR_STRENGTH] = 50;
attribute[ATR_DEXTERITY] = 50;
attribute[ATR_MANA_MAX] = 1000;
attribute[ATR_MANA] = 1000;
attribute[ATR_HITPOINTS_MAX] = 1000;
attribute[ATR_HITPOINTS] = 1000;

HitChance [NPC_TALENT_1H] = 100;
HitChance [NPC_TALENT_2H] = 100;
HitChance [NPC_TALENT_BOW] = 100;
HitChance [NPC_TALENT_CROSSBOW] = 100;

B_SetFightSkills(self,15);
fight_tactic = FAI_HUMAN_COWARD;

CreateInvItems(self,ItMw_2h_Sld_Sword2,1);
EquipItem(self,ItMw_1h_Nov_Mace);
B_CreateAmbientInv(self);

B_SetNpcVisual(self,MALE,"Hum_Head_Bald",Face_N_NormalBart10,BodyTex_N, ItAr_KDF_L);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Mage.mds");

daily_routine = Rtn_Start_999;
};

func void Rtn_Start_999()
{
TA_Practice_Magic (7,55,19,55,"NW_CITY_MERCHANT_TEMPLE_IN");
TA_Practice_Magic (19,55,7,15,"NW_CITY_MERCHANT_TEMPLE_IN");
};Я повторятся не буду, то же самое.
Только этот НПС стоит в Городе возле Ватраса..

Теперь давайте создадим для них диалоги, сначала создадим диалог Тима;

Для этого заходим в
DECOMPILED\_work\data\Scripts\_decompiled\Story\Dialoge и создаём файл под названием DIA_VLK_666_Tim

Теперь его внутренность:

instance DIA_VLK_666_Tim_EXIT(C_Info)
{
npc = VLK_666_Tim;
nr = 999;
condition = DIA_VLK_666_Tim_EXIT_Condition;
information = DIA_VLK_666_Tim_EXIT_Info;
permanent = TRUE;
description = Dialog_Ende;
};

func int DIA_VLK_666_Tim_EXIT_Condition()
{
return TRUE;
};

func void DIA_VLK_666_Tim_EXIT_Info()
{
AI_StopProcessInfos(self);
};

// Вот эта часть чтобы можно было завершить диалог.

instance DIA_Tim_Hello(C_Info)
{
npc = VLK_666_Tim;
nr = 1;
condition = DIA_Tim_Hello_Condition;
information = DIA_Tim_Hello_Info;
permanent = FALSE;
important = TRUE; // НПС сам начинает разговор.
};

func int DIA_Tim_Hello_Condition()
{
return TRUE;
};

func void DIA_Tim_Hello_Info()
{
AI_Output(self,other,"DIA_Tim_Hello_14_00"); //Привет,у тебя есть время?
AI_Output(other,self,"DIA_Tim_Hello_15_01"); //Есть,а что?
AI_Output(self,other,"DIA_Tim_Hello_14_01"); //Мне нужна твоя помощь, понимаешь меня ограбили какие-то бандиты, теперь ищи их свищи, а мне предстоит дальний путь не мог бы ты мне помочь?
Info_ClearChoices(DIA_Tim_Hello); //разветвление
Info_AddChoice(DIA_Tim_Hello,"Конечно помогу.",DIA_Tim_Hello_yes); // Варианты ответов
Info_AddChoice(DIA_Tim_Hello,"Извини но у меня нет времени.",DIA_Tim_Hello_no); // Варианты ответов
};

// Если говорим первый (помогаем),то

func void dia_Tim_Hello_yes ()
{
AI_Output(other,self,"DIA_Tim_Hello_yes_15_00");//Конечно,но что я могу сделать?
AI_Output(self,other,"DIA_Tim_Hello_yes_03_01"); //Я знаю что в городе есть маг,может быть он смог бы сделать магическое оружия.
AI_Output(other,self,"DIA_Tim_Hello_yes_15_01");//Хорошо,я посмотрю что можно сделать.
MIS_Weapons = LOG_Running;
Log_CreateTopic(TOPIC_Weapons ,LOG_MISSION);
Log_SetTopicStatus(TOPIC_Weapons,LOG_Running); // дневник
B_LogEntry(TOPIC_Weapons,"Я согласился помочь одному страннику принести волшебный меч,в этом мне может помочь один Маг в городе"); // запись в дневник
AI_StopProcessInfos (self); // после реплики сам выходит из диалога
};

// Если отказываемся,то

func void DIA_Tim_Hello_no ()
{
AI_Output(other,self,"DIA_Tim_Hello_no _15_00"); //Извини,но у меня мало времени и я не смогу помочь тебе.
AI_Output(self,other,"DIA_Tim_Hello_no _03_01"); //Ну ладно(тяжко вздыхает).
AI_StopProcessInfos (self); // после реплики сам выходит из диалога
};

instance DIA_Tim_HI2(C_Info)
{
npc = VLK_666_Tim;
nr = 99;
condition = DIA_Tim_HI2_Condition;
information = DIA_Tim_HI2_Info;
description = "Я принёс тебе то что ты просил.";//выбор диалога
};

func int DIA_Tim_HI2_Condition()
{
if(Npc_HasItems(other,ItMw_2h_Sld_Sword2)>= 1) //Появляется,если у нас есть это оружия(скрипт выше)
{
return TRUE;
};
};

func void DIA_Tim_HI2_Info()
{
AI_Output(other,self,"DIA_Tim_HI2_15_00"); // Я принёс тебе то что ты просил.
AI_Output(self,other,"DIA_Tim_HI2_04_01"); //Это замечательно,давай скорей
AI_Output(other,self,"DIA_Tim_HI2_15_01"); //Вот он.
b_giveinvitems(self,other,ItMw_2h_Sld_Sword2,1); //Отдаём меч
AI_Output(self,other,"DIA_Tim_HI2_04_02"); //Я поздравляю ты прошёл проверку,поэтому я заканчиваю твою игру на этом этапе(смеётся).
Log_SetTopicStatus(TOPIC_Weapons, LOG_SUCCESS); //заканчиваем мисию
B_LogEntry(TOPIC_Weapons,"Когда я ему отдал он был в вострге."); //запись в дневнике
B_Extro_Avi(); //А вот это попробуйте пропишите,увидите эффект.
};Теперь скрипт Руфуса;

Для этого создаём файл под названием DIA_KDF_999_Ryxar (повторяться не буду, напишу то что не было написано выше):

nstance DIA_KDF_999_Ryxar_EXIT(C_Info)
{
npc = KDF_999_Ryxar;
nr = 999;
condition = DIA_KDF_999_Ryxar_EXIT_Condition;
information = DIA_KDF_999_Ryxar_EXIT_Info;
permanent = TRUE;
description = Dialog_Ende;
};

func int DIA_KDF_999_Ryxar_EXIT_Condition()
{
return TRUE;
};

func void DIA_KDF_999_Ryxar_EXIT_Info()
{
AI_StopProcessInfos(self);
};

instance DIA_Ryxar_HI(C_Info)
{
npc = KDF_999_Ryxar;
nr = 99;
condition = DIA_Ryxar_HI_Condition;
information = DIA_Ryxar_HI_Info;
description = "Привет.";
};

func int DIA_Ryxar_HI_Condition()
{
return TRUE;
};

func void DIA_Ryxar_HI_Info()
{
AI_Output(other,self,"DIA_Ryxar_HI_15_00"); //Привет.
AI_Output(self,other,"DIA_Ryxar_HI_04_01"); //привет-привет.
AI_Output(other,self,"DIA_Ryxar_HI_15_01"); //что ты здесь делаешь?
AI_Output(self,other,"DIA_Ryxar_HI_04_02"); //извини,но это не твоё дело.
};

instance DIA_Ryxar_HI2(C_Info)
{
npc = KDF_999_Ryxar;
nr = 99;
condition = DIA_Ryxar_HI2_Condition;
information = DIA_Ryxar_HI2_Info;
description = "Не мог бы ты мне помочь?";
};

func int DIA_Ryxar_HI2_Condition()
{
if(MIS_Weapons ==LOG_Running) //Диалог появится при условии что мы начали задание.
{
return TRUE;
};
};

func void DIA_Ryxar_HI2_Info()
{
AI_Output(other,self,"DIA_Ryxar_HI2_15_00"); //Не мог бы ты помочь?
AI_Output(self,other,"DIA_Ryxar_HI2_04_01"); //Ну это смотря в чём?
AI_Output(other,self,"DIA_Ryxar_HI2_15_01"); //Мне нужно сделать магические меч.
AI_Output(self,other,"DIA_Ryxar_HI2_04_02"); //А зачем он тебе?
AI_Output(other,self,"DIA_Ryxar_HI2_15_02"); //Он нужен не мне просто я помогаю одному человеку.
AI_Output(self,other,"DIA_Ryxar_HI2_04_03"); //Ты совершаешь заслуженный поступок я сделаю тебе магическое оружия,как раз у меня всё для этого есть,Но для этого ты должен отнести письмо Ксардасу,просто я плохо знаю эту местность.
AI_Output(other,self,"DIA_Ryxar_HI2_15_03"); //Но откуда ты знаешь Ксардаса,он говорил что онём практичекси никто не знает или хотя бы думают что он умер.
AI_Output(self,other,"DIA_Ryxar_HI2_04_04"); //Ксардас-мой друг и мне лучше знать жив он или нет,просто мы давно с ним не виделись я и приехал с ним поведаться.Вобщем передай эту записку.
B_GivePlayerXP(250); //Получаем 250 опыта.
b_giveinvitems(self,other,ITWr_Addon_Hinweis_05,1);
B_LogEntry(TOPIC_Weapons,"Для того чтобы мне сделали волшебный меч,мне нужно передать записку Ксардасу.");
};

instance DIA_Ryxar_HI3(C_Info)
{
npc = KDF_999_Ryxar;
nr = 99;
condition = DIA_Ryxar_HI3_Condition;
information = DIA_Ryxar_HI3_Info;
description = "Я отдал записку.";
};

func int DIA_Ryxar_HI3_Condition()
{
if(Npc_KnowsInfo(other, DIA_Xardas_HI3))
{
return TRUE;
};
};

func void DIA_Ryxar_HI3_Info()
{
AI_Output(other,self,"DIA_Ryxar_HI3_15_00"); //Я отдал записку Ксардасу.
AI_Output(self,other,"DIA_Ryxar_HI3_04_01"); //Очень хорошо,наконец то я смогу встретится с другом.
AI_Output(other,self,"DIA_Ryxar_HI3_15_01"); //Я выполнил свою часть,теперь дело за тобой.
AI_Output(self,other,"DIA_Ryxar_HI3_04_02"); //Конечно.Я выполнил и свою часть,держи свой волшебный меч.
B_GivePlayerXP(550);
b_giveinvitems(self,other, ItMw_2h_Sld_Sword2,1);
B_LogEntry(TOPIC_Weapons,"Я получил меч от мага,теперь осталось передать его Странику.");
};

Ещё есть диалог Ксардаса, но там совсем легко,просто в конце его скрипта прописываем (none_100_xardas):

instance DIA_Xardas_HI3(C_Info)
{
npc = NONE_100_Xardas;
nr = 99;
condition = DIA_Xardas_HI3_Condition;
information = DIA_Xardas_HI3_Info;
description = "У меня для тебя записка.";
};

func int DIA_Xardas_HI3_Condition()
{
if(Npc_HasItems(other,ITWr_Addon_Hinweis_05)>= 1)
{
return TRUE;
};
};

func void DIA_Xardas_HI3_Info()
{
AI_Output(other,self,"DIA_Xardas_HI3_15_00"); // У меня для тебя записка.
AI_Output(self,other,"DIA_Xardas_HI3_04_01"); //Очень интересно.
AI_Output(other,self,"DIA_Xardas_HI3_15_01"); //Вот она
B_GivePlayerXP(100);
b_giveinvitems(other,self,ITWr_Addon_Hinweis_05,1);
B_LogEntry(TOPIC_Weapons,"Я передал записку,тперь маг должен дать мне Волшебный меч.");
};Так эта часть закончена,осталась самая нудная это везде прописать, ну давайте сначала пропишем наших 2 неписей

Для этого заходим в DECOMPILED\_work\data\Scripts\_decompiled\Story и открываем файл Startup.d
Ищем там строчку
Wld_InsertNpc(VLK_439_Vatras,”NW_CITY_ENTRANCE_01”);
и пишем после неё
Wld_InsertNpc(KDF_999_Ryxar,” NW_CITY_MERCHANT_TEMPLE_IN ”);

(это только первый НПС) теперь второй,
ищем строчку

Wld_InsertNpc(BAU_950_Lobart,”NW_FARM1_OUT_01”);
и после неё прописываем:
Wld_InsertNpc(VLK_666_Tim,”NW_FARM1_OUT_01”);

Теперь заходим в файл Story_Globals и ищем строку
var int CurrentLevel;
(она почти в самом конце) и прописываем
var int MIS_Weapons;

Так дальше заходим в DECOMPILED\_work\data\Scripts\_decompiled\Story\Log_Entries и заходим в файл
LOG_Constants_Yoly и в самом конце прописываем
const string TOPIC_Weapons = “Меч для тима”;
(наша миссия).

Последний шаг,заходим в DECOMPILED\_work\data\Scripts\_decompiled и открываем файл gothic.SRC
Там прописываем в любом месте где НПС:
STORY\NPC\VLK_666_Tim.d
STORY\NPC\KDF_999_Ryxar.d

Ну и так же прописываем в любом месте где диалоги:
STORY\DIALOGE\DIA_VLK_666_Tim.d
STORY\DIALOGE\DIA_KDF_999_Ryxar.d

Ну а дальше компиляция.
У нас появляются 2 файла Gothic.dat и OU.BIN .

Gothic.dat вставляем в
Gothic II\_work\Data\Scripts\_compiled

OU.BIN вставляем в
Gothic II\_work\Data\Scripts\Content\Cutscene

Всё теперь заходим в Готику2 НВ и наслаждайтесь то что вы сделали.

Желаю всем новичкам удачи в модостроительстве.
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Ещё хотел обьяснить как сделать амулет регенерации маны и жизней:

Заходим в
_work\data\Scripts\_decompiled\Items
и открываем файл
IT_Amulette.d

Там пишем скрипт:

instance ITAM_ME(C_Item)
{
name = "Амулет регенерации жизни";
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_MISSION | ITEM_AMULET;
value = 0;
visual = "ItAm_Hp_01.3ds";
material = MAT_STONE;
on_equip = Equip_ITMI_ME;
on_unequip = UnEquip_ITMI_ME;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = name;
text[0] = "Очень нужная вещь";
text[1] = "особенно воину";
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};

func void Equip_ITMI_ME ()
{
self.attribute[ATR_REGENERATEHP] = 1;
};

func void UnEquip_ITMI_ME ()
{
self.attribute[ATR_REGENERATEHP] = 0;
};После того как вставили этот скрипт, закомпилируйте и усё готово. В игре либо с помощью марвина вызовите, либо пропишите ГГ в инвентарь.

А вот скрипт амулета востановление маны:

instance ITAM_MY(C_Item)
{
name = "Амулет регенерации маны";
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_MISSION | ITEM_AMULET;
value = 0;
visual = "ItAm_Hp_01.3ds";
material = MAT_STONE;
on_equip = Equip_ITMI_MY;
on_unequip = UnEquip_ITMI_MY;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = name;
text[0] = "Очень нужная вещь";
text[1] = "особенно магу";
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
};

func void Equip_ITMI_MY ()
{
self.attribute[ATR_REGENERATEMANA] = 1;
};

func void UnEquip_ITMI_MY()
{
self.attribute[ATR_REGENERATEMANA] = 0;
};Потом компиляция. И всё амулеты можно вызывать с помощью insert, а можно у ГГ прописать в самом начале.
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Создать новую, полноценную гильдию нельзя, можно только переделать под свои нужды существующие!

Давайте сделам допустим гильдию сектатнтов.

Чтобы её сделать:

1) заходим в _Intern\Constants.d

там заменяем допустим
const int GIL_EMPTY_D= 15;
на
const int GIL_SEC= 15;
(где SEC—сокращёное название гильдии)

2) Заходим в Scripts\Content\Story\TEX.d

и в разделе const string TXT_GUILDS[ 66] =

прописываем вместо “D”,ставим “Сектант”,

3)заходим в _work\data\Scripts\_decompiled\AI\Human\Guilds.d
Там вместо этого

ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL };
ставим нужные нам отношения между гильдиями (ATT_FRIENDLY, ATT_HOSTILE и т.п.)

Потом всё это дело компилируем и вуаля, у нас новая гильдия!
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Давайте теперь попробуем перенести визуалицию лица Кор Галома из Готики1 в Готику 2 НВ.

Для этого нужно:

1) Зайти в скрипт Кор Галома посмотреть на строчку визуалиции, для этого заходим в _work\data\Scripts\_decompiled\Story\NPCи открываем файл
GUR_1201_CorKalom.d

Вот его скрипт:

instance GUR_1201_CorKalom(Npc_Default)
{
name [0] = "Кор Галом";
npcType = npctype_friend;
guild = GIL_GUR;
level = 30;
voice = 10;
id = 1201;
flags = NPC_FLAG_IMMORTAL;

attribute[ATR_STRENGTH] = 80;
attribute[ATR_DEXTERITY] = 50;
attribute[ATR_MANA_MAX] = 50;
attribute[ATR_MANA] = 50;
attribute[ATR_HITPOINTS_MAX] = 400;
attribute[ATR_HITPOINTS] = 400;

Mdl_SetVisual(self,"HUMANS.MDS");
Mdl_ApplyOverlayMds(self,"Humans_Mage.mds");
Mdl_SetVisualBody(self,"hum_body_Naked0",1,0,"Hum_Head_Psionic",19,0,gur_armor_h);
B_Scale(self);
Mdl_SetModelFatness(self,0);

Npc_SetTalentSkill(self,NPC_TALENT_MAGE,6);

EquipItem(self,Kaloms_Schwert);
CreateInvItem(self,ItArRuneSleep);

daily_routine = Rtn_start_1201;
fight_tactic = FAI_HUMAN_MAGE;
};

func void Rtn_start_1201()
{
TA_PotionAlchemy(15,0,22,0,"PSI_LABOR_IN");
TA_PotionAlchemy(22,0,15,0,"PSI_LABOR_IN");
};

func void Rtn_CallSleeper_1201()
{
TA_Stay(0,0,12,0,"PSI_TEMPLE_STAIRS_RIGHT");
TA_Stay(12,0,24,0,"PSI_TEMPLE_STAIRS_RIGHT");
};

func void Rtn_Flee_1201()
{
TA_Stay(0,0,12,0,"");
TA_Stay(12,0,24,0,"");
};Смотрим на строку
Mdl_SetVisualBody(self,”hum_body_Naked0”,1,0,”Hum_Head_Psionic”,19,0,gur_armor_h);
Видим что стоит число 19, значит у Кор Галома визуалиция под числом номер 19.

2) Распаковываем(из Готики1) с помощью VDFS паку textures.vdf (находится в Gothic\Data). Теперь ищем там
визуализацию под номером 19, вот она HUM_HEAD_V19_C0-C.TEX.

3) Открываем эту текстуру в GoMan,и сохраняем её под названием HUM_HEAD_V180_C0-C.TEX (мы изменили на 180 чтобы эта текстура не повторилась с текстурой в Готике2 НВ, если хотите вставить текстуры то начинайте с номера приблизительно 180.

4) Теперь эту текстуру (HUM_HEAD_V180_C0-C.TEX) вставляем в
Gothic II\_work\Data\Textures\_compiled

Всё теперь у нас в Готике2 НВ есть текстура лица Кор ГАлома и эту визуализацию можно присвоить любому NPC.

5) Давайте попробуем прописать эту текстуру Ксардасу (просто чтобы далеко не ходить), то есть заходим в
_work\data\Scripts\_decompiled\Story\NPC открываем файл none_100_xardas.d и вместо его визуализации прописываем например :

B_SetNpcVisual(self,MALE,"Hum_Head_Psionic",180,0,itar_tpl_m);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_Militia.mds");Видите у нас стоит число 180, то есть на лицо теперь он будет выглядить как Кор ГАлом.
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Ссылки на программы и статьи по модостроениям:
1) http://forums.ag.ru/?board=gothic&action=d...&num=1098161614
(уроки скриптологии)
2) http://mod.worldofgothic.ru/2S_scripting/2...tiki1-v-gotiku2 (самый лучший сайт по модостроению)
3) http://forums.ag.ru/?board=gothic&action=d...&num=1105304206
(список прог и модов)
4) http://www.basilio58.narod.ru/Start.htm
(очень полезный сайт по модмейкерству).
 

Mengos

Готоман
Регистрация
25 Фев 2006
Сообщения
18
Репутация
0
Можно сделать, чтобы при повышении уровня увеличивалось не только здоровье, но и сила\ловкость\мана.

Сначала надо открыть story\B_Story\b_giveplayerxp.d
Его содержимое надо изменить на :

func void B_GivePlayerXP(var int add_xp)
{
var string concatText;
if(hero.level == 0)
{
hero.exp_next = 500;
};
hero.exp = hero.exp + add_xp;
concatText = PRINT_XPGained;
concatText = ConcatStrings(concatText,IntToString(add_xp));
PrintScreen(concatText,-1,YPOS_XPGained,FONT_ScreenSmall,2);
if(hero.exp >= hero.exp_next)
{
hero.level = hero.level + 1;
hero.exp_next = hero.exp_next + ((hero.level + 1) * 500);
hero.attribute[ATR_HITPOINTS_MAX] = hero.attribute[ATR_HITPOINTS_MAX] + 10; \\+10 здоровья при повышении уровня.
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS] + 10;
hero.attribute[ATR_STRENGTH] = hero.attribute[ATR_STRENGTH] + 1; \\ + 1 силы при повышении уровея
hero.attribute[ATR_DEXTERITY] = hero.attribute[ATR_DEXTERITY] + 1; \\ + 1 ловкости при повышении
hero.lp = hero.lp + 12; \\ + 12 LP
PrintScreen(PRINT_LevelUp,-1,YPOS_LevelUp,FONT_Screen,2);
Snd_Play("LevelUp");
};
B_CheckLog();
};
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Mengos
Оригинально придумал..Может ещё есть какие идейки?
 

Mengos

Готоман
Регистрация
25 Фев 2006
Сообщения
18
Репутация
0
Может ещё есть какие идейки?



instance ItRi_fly_02(C_Item)
{
name = NAME_Ring;
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_RING;
value = 200;
visual = "ItRi_Prot_Point_02.3ds";
visual_skin = 0;
material = MAT_METAL;
on_equip = Equip_fly_02;
on_unequip = UnEquip_fly_02;
wear = WEAR_EFFECT;
effect = "SPELLFX_ITEMGLIMMER";
description = "кольцо Полета";
text[5] = NAME_Value;
count[5] = value;
inv_zbias = INVCAM_ENTF_RING_STANDARD;
inv_rotz = INVCAM_Z_RING_STANDARD;
inv_rotx = INVCAM_X_RING_STANDARD;
};

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

func void unequip_fly_02()
{
Mdl_RemoveOverlayMds(self,"humans_skeleton_fly.mds");
};


instance ItMw_1h_Torch(C_Item)
{
name = "факел";
mainflag = ITEM_KAT_NF;
flags = ITEM_AXE;
material = MAT_WOOD;
value = 2500;
damageTotal = 40;
damagetype = DAM_FIRE;
range = Range_VLKDolch;
cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = 40;
visual = "ItLs_Torch_01.3ds"; \\ оружие выглядит как факел.
description = name;
text[2] = NAME_Damage;
count[2] = damageTotal;
text[3] = NAME_DEX_needed;
count[3] = cond_value[2];
text[4] = NAME_OneHanded;
text[5] = NAME_Value;
count[5] = value;
};
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Ну здесь всё для новичко должно быть понятно.Хотя за написание респект..
 

Mengos

Готоман
Регистрация
25 Фев 2006
Сообщения
18
Репутация
0
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_fly.mds");
};
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
Расмотрим такое действие.Напримен ГГ нужно за три дня что-то принести,если он не принесёт за три дня,то не выполнит квест..
Диалог писать не буду и так много писал,напишу только условия.
Когда ГГ согласился взять задания(ему сказали принести за 3 дня например 5 заготовок) ,то в конце этого диалога нужно поставить например
zagotovka_RepairDay = Wld_GetDay();(с этого момента началось время отсчёта)
И когда у нас есть 5 заготовок и мы уложились за 3дня,то в условии нужно написать условие что есть 5 заготовок и
if( (Wld_GetDay() - zagotovka_RepairDay) <= 3)
И тогда появиться нужный диалог,в противном случае else и провал миссии.
Тоесть мы ввели некий счётчик,где zagotovka - переменная(нужно прописать Story_Globals).
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
ТУТОР МЕНГУСА
Амулет превращения в скелета (я пока не проверял, всё-ли будет правильно работать)

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",DEFAULT,DEFAULT,"",DEFAULT,DEFAULT,-1);
Mdl_SetModelFatness(self,0);
Mdl_ApplyOverlayMds(self,"Humans_skeleton.mds");
Wld_PlayEffect("spellFX_LIGHTSTAR_ORANGE",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.mds");
Wld_PlayEffect("spellFX_LIGHTSTAR_ORANGE",hero,hero,0,0,0,FALSE);
Snd_Play("SFX_HealObsession");
};
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
ТУТОР ВенДиго
ЧАСТЬ ПЕРВАЯ

Итемки - это предметы инвентаря. В данном туторе описывается не создание
качественно новой модели(это дело МАХ'а, может Рал научит. Кстати очень
хотелось бы, я сам не умею моделить ), а создание предмета на базе
имеющихся в игре моделей и текстур, со своими индивидуальными
характеристиками.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ГЛАВА ПЕРВАЯ - дифференциация.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
В Готике существует 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

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
И ЕЩЁ ОДИН ТУТОР МЕНГУСА
Описание создание мощного оружия.
В файле
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_Cloud",slf,slf,0,0,0,FALSE);//спецэффекты
Wld_PlayEffect("spellFX_WindFist",slf,slf,0,0,0,FALSE);
Wld_PlayEffect("spellFX_PalDestroyEvil",slf,slf,0,0,0,FALSE);
Wld_PlayEffect("spellFX_BELIARSRAGE_COLLIDE",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_StopSwdDeath);// при повреждениях магией -> оканчиваем эффект
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_StopSwdDeath);
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_VICTIM",BS_UNCONSCIOUS);
AI_PlayAniBS(self,"T_STAND_2_FREEZE_VICTIM",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потом прописываем меч в инвентаре у гг вместе с подзарядниками
 

S.V-2

Паладин
Регистрация
8 Июн 2006
Сообщения
149
Репутация
1
Вопрос может показаться не уместным, как создать фаил .d - в блокноте?

Заходим в
Gothic II\_work\Data\Scripts\Content\Story\NPC
и создаём там файл
NONE_1000_DEDROIT.d
что-то я не понял? Если в блокноте, то как переименовать его расширение (.txt). Может с помощью какой программы, дайте ссылку скачать.
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
S.V-2
Я лично не создаю файл,я скопирую существующий Готики и переименоваю и пользуюсь.
 

LeGuDaa

Воин Инноса
Регистрация
1 Фев 2006
Сообщения
382
Репутация
0
Адрес
Бухарест
Немного глупый вопрос... Точнее даже два...
1. Все итемки лежат в одном файле? То есть все амулеты в одном, все кольца в одном и тд, так?
2. Как допустим ввести в игру монстра? Допустим я хочу сделать падальщика с такими-то атрибутам, допустим \"падальщик всех падальщиков\" и появить его :) допустим... да не важно... Вопщем суть вопроса: Как вставлять в игру монстров?
 

DEDROIT

Administrator
Команда форума
Регистрация
31 Янв 2006
Сообщения
1,384
Репутация
234
Адрес
Москва
LeGuDaa
1)Все лежат в разных.(но в одной папке Items),а в файлах разных.
2)ПРопиши своего монстра в стартопе и всё.
 
Сверху Снизу