Тема: Скриптинг
Показать сообщение отдельно
Старый 17.06.2006, 19:51   #16
Администратор
Мастер
 
Аватар для DEDROIT
 
Регистрация: 31.01.2006
Адрес: Москва
Сообщений: 1,383
Сказал(а) спасибо: 36
Поблагодарили 230 раз(а) в 67 сообщениях
Отправить сообщение для 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 вне форума   Ответить с цитированием