|
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; * * * *}; * *}; }; * * * * * * * * * * * * *
|