Показать сообщение отдельно
Старый 15.07.2005, 08:34   #217
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Уроки скриптологии

* *9. Функция реакции на повреждение для призраков.

Файл B_GhostSpecialDamage.d

// ************************************************** **************
// Функция реакции на повреждение для призраков
// ************************************************** **************
// Аргументы: oth - нападающий, slf - жертва
// ----------------------------------------------------------------
// Возвращаемое значение: нет, тип функции должен быть исправлен на void

func int B_GhostSpecialDamage(var C_NPC oth,var C_NPC slf)
{
* *var C_NPC Quarho;
* *// получить ссылку на Куарходрона
* *Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);
* *var C_NPC Rhadem;
* *// получить ссылку на Радемеса
* *Rhadem = Hlp_GetNpc(NONE_ADDON_112_Rhademes);
* *var C_NPC her;
* *// получить ссылку на ГГ
* *her = Hlp_GetNpc(PC_HERO);
* *// если жертва Куарходрона или Радемес (Примечание: self необходимо заменить на slf, иначе возможна ошибка)
* *if ((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho))
* *¦¦ (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Rhadem)))
* *{
* * * *// эффект "Гнев Белиара" падает на нападающего
* * * *Wld_PlayEffect("spellFX_BELIARSRAGE",oth,oth,0,0, 0,FALSE);
* * * *// если нападающий не бессмертен
* * * *if(oth.flags != NPC_FLAG_IMMORTAL)
* * * *{
* * * * * *// если нападающий не ГГ
* * * * * *if(Hlp_GetInstanceID(oth) != Hlp_GetInstanceID(her))
* * * * * *{
* * * * * * * *// убить нападающего
* * * * * * * *Npc_ChangeAttribute(oth,ATR_HITPOINTS,-oth.attribute[ATR_HITPOINTS_MAX]);
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// счетчик предупреждений ++
* * * * * * * *GhostAttackWarn = (GhostAttackWarn + 1);
* * * * * * * *// если менее 3 предупреждений
* * * * * * * *if(GhostAttackWarn < 3)
* * * * * * * *{
* * * * * * * * * *// жизнь нападающего уменьшается наполовину
* * * * * * * * * *oth.attribute[ATR_HITPOINTS] = (oth.attribute[ATR_HITPOINTS]/2);
* * * * * * * *}
* * * * * * * *else // 3 предупреждения
* * * * * * * *{
* * * * * * * * * *// если нападающий ГГ (Примечание: лишнее, уже проверялось
* * * * * * * * * *if(Hlp_GetInstanceID(oth) == Hlp_GetInstanceID(her))
* * * * * * * * * *{
* * * * * * * * * * * *// жизнь ГГ = 0
* * * * * * * * * * * *oth.attribute[ATR_HITPOINTS] = 0;
* * * * * * * * * * * *// анимация смерти ГГ
* * * * * * * * * * * *AI_PlayAni(oth,"T_DEAD");
* * * * * * * * * *};
* * * * * * * *};
* * * * * *};
* * * *};
* * * *return FALSE; * // убрать, функция ничего не возвращает
* *};
};


* *10. Функции подсчета экспы за карманную кражу.

Файл B_GiveThiefXP.d

var int VictimCount; * * * *// кол-во успешно обворованных
var int VictimLevel; * * * *// уровень обворованных
var int ThiefLevel; * * * * // уровень воровства
const int ThiefXP = 50; * * // базовая экспа за воровство

// Начислить экспу за карманную кражу (удачная попытка)
func void B_GiveThiefXP()
{
* *// кол-во обворованных ++
* *VictimCount = (VictimCount + 1);
* *// если уровень 0 *
* *if(VictimLevel == 0)
* *{
* * * *// уровень обворованных = 2
* * * *VictimLevel = 2;
* *};
* *// если кол-во обворованных >= уровня обворованных
* *if(VictimCount >= VictimLevel)
* *{
* * * *// расчет добавочной экспы за воровство
* * * *ThiefLevel = (ThiefLevel + 1);
* * * *VictimLevel =(VictimCount + ThiefLevel);
* *};
* *// начислить экспу
* *B_GivePlayerXP(ThiefXP + (ThiefLevel * 10)); *
};
// Примечание: На форуме писалось, что начисляемая экспа за воровство зависит от главы, формула же говорит, что не зависит.
// У кого есть желание могут составить расчет экспы в зависимости от кол-ва удачно и неудачно обворованных.

// Неудачная попытка воровства
func void B_ResetThiefLevel()
{
* *// если кол-во обворованных >= уровня воровства
* *if(VictimCount > ThiefLevel)
* *{
* * * *// счетчик успешно обворованных --
* * * *VictimCount = (VictimCount - 1);
* *};
};


* *11. Грег идет убивать Декстера.

Файл B_GiveThiefXP.d

// ************************************************** **************
// Грег идет убивать Декстера
// ************************************************** **************

// self - Грег или Декстер или иной НПС, т.к. функция вызывается из разных мест

var int B_Greg_ComesToDexter_OneTime; * // флаг одноразового выполнения действия

func void B_Greg_ComesToDexter()
{
* *// если self Декстер
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Dexter))
* *{
* * * *// если флаг сброшен
* * * *if(B_Greg_ComesToDexter_OneTime == FALSE)
* * * *{
* * * * * *// у Декстера появился враг
* * * * * *dexter.aivar[AIV_EnemyOverride] = FALSE;
* * * * * *// Грег находится у Декстера
* * * * * *GregLocation = Greg_Dexter;
* * * * * *// Грег идет к Декстеру
* * * * * *B_StartOtherRoutine(Greg_NW,"Dexter"); // Внимание: В одной из версий датника слово "Dexter" переведено на русский язык - грубейшая ошибка, Грег к Декстеру не пойдет!
* * * * * *// установить флаг
* * * * * *B_Greg_ComesToDexter_OneTime = TRUE;
* * * *};
* *};
};


* *12. Жужжание Ищущего огонька.

Файл B_IrrlichtBeep.d

// ************************************************** **************
// Жужжание Ищущего огонька
// ************************************************** **************

func void B_IrrlichtBeep()
{
* *// вывод текста и озвучки
* *AI_Output(self,other,"DIA_Wisp_15_00"); //(зумм)
};


* *13. Блеяние овцы Лизели.

Файл B_LieselMaeh.d

// ************************************************** **************
// Блеяние овцы Лизели
// ************************************************** **************

func void B_LieselMaeh()
{
* *// вывод текста и озвучки
* *AI_Output(self,other,"DIA_Liesel_15_00"); * //Mееееее!
};


* *14. Несчастный случай с Малкомом в Яркендаре.

Файл B_MalcomExident.d

// ************************************************** **************
// Несчастный случай с Малкомом в Яркендаре
// ************************************************** **************

func void B_MalcomExident()
{
* *// ГГ не знает, что Малком мертв
* *if(Malcom_Accident == FALSE)
* *{
* * * *// если Малком жив
* * * *if(!Npc_IsDead(Malcom))
* * * *{
* * * * * *// телепортация Малкома в пещеру
* * * * * *AI_Teleport(Malcom,"ADW_PIRATECAMP_SECRETCAVE_02" );
* * * * * *// Малком спит в пещере
* * * * * *B_StartOtherRoutine(Malcom,"Start");
* * * * * *// убить Малкома
* * * * * *Npc_ChangeAttribute(Malcom,ATR_HITPOINTS,-Malcom.attribute[ATR_HITPOINTS_MAX]);
* * * * * *// тепортировать в пещеру ???
* * * * * *AI_Teleport(Malcom,"ADW_PIRATECAMP_SECRETCAVE_02" );
* * * * * *// несчастный случай произошел
* * * * * *Malcom_Accident = TRUE;
* * * * * *// если Оуэн жив
* * * * * *if(!Npc_IsDead(Owen))
* * * * * *{
* * * * * * * *// Оуэн сидит у костра в лагере пиратов
* * * * * * * *B_StartOtherRoutine(Owen,"Start");
* * * * * *};
* * * *};
* *};
};


* *15. ГГ находит кое-что спрятанное в предмете.

Файл B_PlayerFindItem.d

// ************************************************** **************
// ГГ находит кое-что спрятанное в предмете
// ************************************************** **************
// Аргументы: itm - содержимое предмета, amount - кол-во найденного

// self - НПС вскрывающий предмет
// item - предмет контейнер

func void B_PlayerFindItem(var int itm,var int amount)
{
* *// если предмет вскрывает ГГ
* *if(Npc_IsPlayer(self))
* *{
* * * *// создать в инвентаре ГГ найденные предметы
* * * *CreateInvItems(self,itm,amount);
* * * *var string ConcatText;
* * * *var string itemname;
* * * *// имя контейнера
* * * *itemname = item.name;
* * * *// если контейнер содержит деньги
* * * *if(itm == ItMi_Gold)
* * * *{
* * * * * *// amount + " золотых принято"
* * * * * *concatText = ConcatStrings(IntToString(amount),PRINT_GoldErhalt en);
* * * * * *// вывод на экран
* * * * * *Print(concatText);
* * * * * *// звон денег
* * * * * *Snd_Play("Geldbeutel");
* * * *}
* * * *else
* * * *{
* * * * * *// если найден 1 предмет
* * * * * *if(amount == 1)
* * * * * *{
* * * * * * * *// itemname + " получают"
* * * * * * * *concatText = ConcatStrings(itemname,PRINT_Addon_erhalten);
* * * * * * * *// вывод
* * * * * * * *Print(concatText);
* * * * * * * *
* * * * * *} *
* * * * * *else
* * * * * *{
* * * * * * * *// amount + "предметов принято"
* * * * * * * *concatText = ConcatStrings(IntToString(amount),PRINT_ItemsErhal ten);
* * * * * * * *// += " ("
* * * * * * * *concatText = ConcatStrings(concatText," (");
* * * * * * * *// += itemname
* * * * * * * *concatText = ConcatStrings(concatText,itemname);
* * * * * * * *// += ")"
* * * * * * * *concatText = ConcatStrings(concatText,")");
* * * * * * * *// вывод
* * * * * * * *Print(concatText);
* * * * * *};
* * * *};
* *};
};


* *16. Функции собрания Кольца Воды в таверне Орлана.

Файл B_RangerMeeting.d

// Сделать члена Кольца Воды готовым к собранию
// ----------------------------------------------------------------
// Аргумент: Ranger - НПС
func void B_MakeRangerReadyForMeeting(VAR C_NPC Ranger)
{
* *// создать в инвентаре Разорванную кольчугу
* *CreateInvItems(Ranger,ITAR_Fake_RANGER,1);
* *// снять старые доспехи
* *AI_UnequipArmor(Ranger);
* *// одеть кольчугу
* *AI_EquipArmor(Ranger,ITAR_Fake_RANGER);
* *// стать другом ГГ
* *Ranger.npctype = NPCTYPE_FRIEND;
};

// Член Кольца Воды покидает собрание
// ----------------------------------------------------------------
// Аргумент: Ranger - НПС
func void B_MakeRangerReadyToLeaveMeeting(VAR C_NPC Ranger)
{
* *// снять кольчугу
* *AI_UnequipArmor(Ranger);
* *// если НПС имеет Кольчуга "Кольца Воды", то удалить её
* *Npc_RemoveInvItems(Ranger,ITAR_RANGER_Addon,Npc_H asItems(Ranger,ITAR_RANGE
R_Addon));
* *// если НПС имеет Разорванную кольчугу, то удалить её
* *Npc_RemoveInvItems(Ranger,ITAR_Fake_RANGER,Npc_Ha sItems(Ranger,ITAR_Fake_R
ANGER));
* *// одеть лучшую броню
* *AI_EquipBestArmor(Ranger);
};

// Все участники готовятся к собранию
func void B_MakeRangerReadyForMeetingALL()
{
* *B_MakeRangerReadyForMeeting(Martin); * *// Мартин
* *B_MakeRangerReadyForMeeting(Lares); * * // Ларес
* *B_MakeRangerReadyForMeeting(Cord); * * *// Корд
* *B_MakeRangerReadyForMeeting(Gaan); * * *// Гаан
* *B_MakeRangerReadyForMeeting(Orlan); * * // Орлан
* *B_MakeRangerReadyForMeeting(Cavalorn); *// Ковалорн
};

// Все участники покидают собрание
func void B_MakeRangerReadyToLeaveMeetingALL()
{
* *B_MakeRangerReadyToLeaveMeeting(Martin);
* *B_MakeRangerReadyToLeaveMeeting(Lares);
* *B_MakeRangerReadyToLeaveMeeting(Cord);
* *B_MakeRangerReadyToLeaveMeeting(Gaan);
* *B_MakeRangerReadyToLeaveMeeting(Orlan);
* *B_MakeRangerReadyToLeaveMeeting(Cavalorn);
};

// Орлан дает команду идти всем в таверну
func void B_Addon_Orlan_RangersReadyForComing()
{
* *// если недостающий орнамент у паладинов получен
* *if(MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
* *{
* * * *// Ковалорн идет в таверну
* * * *B_StartOtherRoutine(Cavalorn,"PreRangerMeeting");
* *};
* *// Мартин идет в таверну
* *B_StartOtherRoutine(Martin,"PreRangerMeeting");
* *// Ларес идет в таверну
* *B_StartOtherRoutine(Lares,"PreRangerMeeting"); * * * * *
* *// Корд идет в таверну
* *B_StartOtherRoutine(Cord,"PreRangerMeeting"); * * *
* *// Гаан идет в таверну
* *B_StartOtherRoutine(Gaan,"PreRangerMeeting"); * * * * *
};

// Сбор всех в таверне у стола
func void B_Addon_Orlan_ComingRanger()
{
* *if(MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
* *{
* * * *B_StartOtherRoutine(Cavalorn,"RangerMeeting"); * * *
* *};
* *B_StartOtherRoutine(Martin, "RangerMeeting"); * * * * *
* *B_StartOtherRoutine(Lares,"RangerMeeting"); * * * *
* *B_StartOtherRoutine(Cord,"RangerMeeting"); * * * * *
* *B_StartOtherRoutine(Gaan,"RangerMeeting"); * * * * *
* *B_StartOtherRoutine(Orlan,"RangerMeeting");
* *// собрание началось
* *RangerMeetingRunning = LOG_RUNNING;
};

// Ларес заканчивает диалог
func void B_RangerMeetingParking()
{
* *// если недостающий орнамент у паладинов получен
* *if(MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
* *{
* * * *// Ковалорн идет в город сидеть на скамье
* * * *B_StartOtherRoutine(Cavalorn,"Stadt");
* *};
* *// Орлан идет за прилавок
* *B_StartOtherRoutine(Orlan,"START");
* *// Ларес должен обратиться к ГГ
* *Lares_HaltsMaul = TRUE;
* *// просто стоит у стола
* *B_StartOtherRoutine(Lares,"Parking"); * * * * * * *
* *// Корд стоит у стола
* *B_StartOtherRoutine(Cord,"Parking");
* *// тут написана какая-то фигня, надо просто оставить те строки, против которых стоит //++, остальные удалить
* *if((Gaan.aivar[AIV_TalkedToPlayer] == FALSE))
* *{
* * * *// Гаан остается у стола
* * * *B_StartOtherRoutine(Gaan,"Parking"); * *//++
* *}
* *else
* *{
* * * *B_StartOtherRoutine(Gaan,"Parking"); * * * * * * * * * *
* *};
* *if(MIS_Addon_Martin_GetRangar == 0)
* *{
* * * *// Мартин остается у стола
* * * *B_StartOtherRoutine(Martin,"Parking"); *//++
* *}
* *else
* *{
* * * *B_StartOtherRoutine(Martin,"Parking");
* *};
};

// Ватрас заканчивает диалог
func void B_SchlussMitRangerMeeting()
{
* *// *** НПС возвращаются на свои места до собрания ***
* *// если недостающий орнамент у паладинов получен
* *if(MIS_Addon_Cavalorn_GetOrnamentFromPAL != 0)
* *{
* * * *// Ковалорн идет в город сидеть на скамье
* * * *B_StartOtherRoutine(Cavalorn,"Stadt"); * * * * *
* *};
* *// Ларес идет в гавань
* *B_StartOtherRoutine(Lares,"Start");
* *// Корд идет продолжать свои тренировки с мечом
* *B_StartOtherRoutine(Cord,"Start");
* *// если ГГ не говорил с Гааном
* *if(Gaan.aivar[AIV_TalkedToPlayer] == FALSE)
* *{
* * * *// Гаан идет туда, где родился
* * * *B_StartOtherRoutine(Gaan,"PreStart");
* *}
* *else
* *{
* * * *// Гаан идет к снепперу
* * * *B_StartOtherRoutine(Gaan,"Start"); * * * * * * * * *
* *};
* *// если вор для Мартина не пойман
* *if(MIS_Addon_Martin_GetRangar == 0)
* *{
* * * *// идет в порт
* * * *B_StartOtherRoutine(Martin,"PreStart");
* *}
* *else
* *{
* * * *// идет в порт или таверну в порту, в зависимости от времени
* * * *B_StartOtherRoutine(Martin,"Start");
* *};
* *// Орлан идет за прилавок
* *B_StartOtherRoutine (Orlan,"Start"); * *
* *// Ларес к ГГ не обратится
* *Lares_HaltsMaul = LOG_OBSOLETE;
};


* *17. Удалить призрака из игры.

Файл B_RemoveQuarhodron.d

// ************************************************** **************
// Удалить призрака из игры
// ************************************************** **************
// Возвращаемое значение: нет, тип функции должен быть исправлен на void

var int B_RemoveQuarhodron_OneTime; * * // флаг удаления Кваходрона
var int B_RemoveRhademes_OneTime; * * * // флаг удаления Радемеса

func int B_RemoveGhost()
{
* *// если ГГ узнаёт от Кваходрона о Камерах Аданоса
* *if(Ghost_SCKnowsHow2GetInAdanosTempel == TRUE)
* *{ *
* * * *// если ГГ вызвал Кваходрона и Кваходрон не удален
* * * *if(SC_SummonedAncientGhost == TRUE) && (B_RemoveQuarhodron_OneTime == FALSE)
* * * *{
* * * * * *// телепортировать на кладбище
* * * * * *AI_Teleport(NONE_ADDON_111_Quarhodron,"TOT");
* * * * * *// удалить Кваходрона
* * * * * *B_RemoveNpc(NONE_ADDON_111_Quarhodron);
* * * * * *// музычка
* * * * * *Snd_Play("MFX_GhostVoice");
* * * * * *Snd_Play("MFX_Firestorm_Cast");
* * * * * *// установить флаг удаления
* * * * * *B_RemoveQuarhodron_OneTime = TRUE;
* * * * * *// сброс счетчика предупреждений
* * * * * *GhostAttackWarn = 0;
* * * *};
* *};
* *// если Радемес был вставлен в игру (сработал триггер)
* *if(ADW_ADANOSTEMPEL_STONEGRD_TRIGG_FUNC_01_OneTim e == TRUE)
* *{
* * * *// если ГГ одолел Радемеса и Радемес не удален
* * * *if(SC_TookRhademesTrap == TRUE) && (B_RemoveRhademes_OneTime == FALSE)
* * * *{
* * * * * *// телепортировать на кладбище
* * * * * *AI_Teleport(NONE_ADDON_112_Rhademes,"TOT");
* * * * * *// удалить Радемеса
* * * * * *B_RemoveNpc(NONE_ADDON_112_Rhademes);
* * * * * *// если ГГ слышал последние слова Радемеса
* * * * * *if(SC_TalkedToRhademAfter == TRUE)
* * * * * *{
* * * * * * * *// музычка
* * * * * * * *Snd_Play("MFX_GhostVoice");
* * * * * * * *Snd_Play("MFX_Firestorm_Cast");
* * * * * *};
* * * * * *// установить флаг удаления
* * * * * *B_RemoveRhademes_OneTime = TRUE;
* * * * * *// сброс счетчика предупреждений
* * * * * *GhostAttackWarn = 0;
* * * *};
* *};
}; * * * * * * * * * * * * *

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