|
Re: Уроки скриптологии
12. Функции организации диалогов с МОВами (Move Object).
Директория размещения файлов функций - B_Dialog_Mobsis
* *1. Функции использования предметов "горячими" клавишами.
Файл B_OnHotKey.d
// ************************************************** ************** // Функции вызова карты мира при нажатии "горячей" клавиши // ************************************************** **************
// Найти наилучшую карту текущего уровня имеющуюся у ГГ // ---------------------------------------------------------------- // Возвращаемое значение: ссылка на карту
// Внимание: Возвращаемое значение является переопределенным типом (C_Item -> int)
func int B_GetBestPlayerMap() { * *// Описание функции: если ГГ имеет карту текущего уровня, то возвращается ссылка на неё. * *// Последовательность опроса существующих карт уровня идет в порядке от подробных к частичным * *if(CurrentLevel == NEWWORLD_ZEN) * *{ * * * *if(Npc_HasItems(hero,ItWr_Map_NewWorld) >= 1) * * * *{ * * * * * *return ItWr_Map_NewWorld; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_Shrine_MIS) >= 1) * * * *{ * * * * * *return ItWr_Map_Shrine_MIS; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_Caves_MIS) >= 1) * * * *{ * * * * * *return ItWr_Map_Caves_MIS; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_NewWorld_Ornaments_A ddon) >= 1) * * * *{ * * * * * *return ItWr_Map_NewWorld_Ornaments_Addon; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_NewWorld_Dexter) >= 1) * * * *{ * * * * * *return ItWr_Map_NewWorld_Dexter; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_ShatteredGolem_MIS) >= 1) * * * *{ * * * * * *return ItWr_ShatteredGolem_MIS; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_Orcelite_MIS) >= 1) * * * *{ * * * * * *return ItWr_Map_Orcelite_MIS; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_NewWorld_City) >= 1) * * * *{ * * * * * *return ItWr_Map_NewWorld_City; * * * *}; * *} * *else if(CurrentLevel == OLDWORLD_ZEN) * *{ * * * *if(Npc_HasItems(hero,ItWr_Map_OldWorld) >= 1) * * * *{ * * * * * *return ItWr_Map_OldWorld; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Map_OldWorld_Oremines_MI S) >= 1) * * * *{ * * * * * *return ItWr_Map_OldWorld_Oremines_MIS; * * * *}; * *} * *else if(CurrentLevel == DRAGONISLAND_ZEN) * *{ * *} * *else if(CurrentLevel == ADDONWORLD_ZEN) * *{ * * * *if(Npc_HasItems(hero,ItWr_Map_AddonWorld) >= 1) * * * *{ * * * * * *return ItWr_Map_AddonWorld; * * * *} * * * *else if(Npc_HasItems(hero,ItWr_Addon_TreasureMap) >= 1) * * * *{ * * * * * *return ItWr_Addon_TreasureMap; * * * *}; * *}; * *return 0; };
// Найти любую карту имеющуюся у ГГ // ---------------------------------------------------------------- // Возвращаемое значение: ссылка на карту
// Внимание: Возвращаемое значение является переопределенным типом (C_Item -> int)
func int B_GetAnyPlayerMap() { * *// Описание функции: если ГГ имеет любую карту, то возвращается ссылка на неё. * *// Последовательность опроса существующих карт идет в порядке от подробных к частичным * *if(Npc_HasItems(hero,ItWr_Map_NewWorld) >= 1) * *{ * * * *return ItWr_Map_NewWorld; * *} * *else if(Npc_HasItems(hero,ItWr_Map_Shrine_MIS) >= 1) * *{ * * * *return ItWr_Map_Shrine_MIS; * *} * *else if(Npc_HasItems(hero,ItWr_Map_Caves_MIS) >= 1) * *{ * * * *return ItWr_Map_Caves_MIS; * *} * *else if(Npc_HasItems(hero,ItWr_Map_NewWorld_Ornaments_A ddon) >= 1) * *{ * * * *return ItWr_Map_NewWorld_Ornaments_Addon; * *} * *else if(Npc_HasItems(hero,ItWr_Map_NewWorld_Dexter) >= 1) * *{ * * * *return ItWr_Map_NewWorld_Dexter; * *} * *else if(Npc_HasItems(hero,ItWr_ShatteredGolem_MIS) >= 1) * *{ * * * *return ItWr_ShatteredGolem_MIS; * *} * *else if(Npc_HasItems(hero,ItWr_Map_Orcelite_MIS) >= 1) * *{ * * * *return ItWr_Map_Orcelite_MIS; * *} * *else if(Npc_HasItems(hero,ItWr_Map_NewWorld_City) >= 1) * *{ * * * *return ItWr_Map_NewWorld_City; * *} * *else if(Npc_HasItems(hero,ItWr_Map_OldWorld) >= 1) * *{ * * * *return ItWr_Map_OldWorld; * *} * *else if(Npc_HasItems(hero,ItWr_Map_OldWorld_Oremines_MI S) >= 1) * *{ * * * *return ItWr_Map_OldWorld_Oremines_MIS; * *} * *else if(Npc_HasItems(hero,ItWr_Map_AddonWorld) >= 1) * *{ * * * *return ItWr_Map_AddonWorld; * *} * *else if(Npc_HasItems(hero,ItWr_Addon_TreasureMap) >= 1) * *{ * * * *return ItWr_Addon_TreasureMap; * *}; * *return 0; };
// Функция выбора карты мира, вызываемой "горячей" клавишей // ---------------------------------------------------------------- // Возвращаемое значение: ссылка на карту, которая вызывается "горячей" клавишей // Примечание: Вызывается только экзешником. func int PLAYER_HOTKEY_SCREEN_MAP() { * * * *// Внимание: переменная OldInstance является переопределенным типом (C_Item -> int) * *var int OldInstance; * *// получить ссылку на последнюю просмотренную карту (далее - старая ссылка) * *OldInstance = B_GetPlayerMap(); * *// если карта существует и ГГ её не имеет * *if((OldInstance > 0) && (Npc_HasItems(hero,OldInstance) < 1)) * *{ * * * *// удалить ссылку * * * *OldInstance = 0; * *}; * *// очистить глобальную ссылку на карту * *B_SetPlayerMap(OldInstance); * *// Внимание: переменная NewInstance является переопределенным типом (C_Item -> int) * *var int NewInstance; * *// созранить ссылку на последнюю просмотренную карту (далее - новая ссылка) * *NewInstance = OldInstance; * *// если текущий уровень не Новый мир * *if(CurrentLevel != NEWWORLD_ZEN) * *{ * * * *// если старая ссылка является одной из карт Нового мира * * * *if((OldInstance == ItWr_Map_Caves_MIS) * * * *¦¦ (OldInstance == ItWr_Map_NewWorld) * * * *¦¦ (OldInstance == ItWr_Map_NewWorld_City) * * * *¦¦ (OldInstance == ItWr_Map_NewWorld_Dexter) * * * *¦¦ (OldInstance == ItWr_Map_NewWorld_Ornaments_Addon) * * * *¦¦ (OldInstance == ItWr_Map_Orcelite_MIS) * * * *¦¦ (OldInstance == ItWr_Map_Shrine_MIS) * * * *¦¦ (OldInstance == ItWr_ShatteredGolem_MIS)) * * * *{ * * * * * *// очистить новую ссылку * * * * * *NewInstance = 0; * * * *}; * *}; * *// если текущий уровень не Миненталь * *if(CurrentLevel != OLDWORLD_ZEN) * *{ * * * *// если старая ссылка является одной из карт Миненталя * * * *if((OldInstance == ItWr_Map_OldWorld) ¦¦ (OldInstance == ItWr_Map_OldWorld_Oremines_MIS)) * * * *{ * * * * * *// очистить новую ссылку * * * * * *NewInstance = 0; * * * *}; * *}; * *// если текущий уровень не Ирдорат * *// Примечание: этот блок можно удалить - карт для него нет * *if(CurrentLevel != DRAGONISLAND_ZEN) * *{ * *}; * *// если текущий уровень не Яркендар * *if(CurrentLevel != ADDONWORLD_ZEN) * *{ * * * *// аналогично * * * *if((OldInstance == ItWr_Map_AddonWorld) ¦¦ (OldInstance == ItWr_Addon_TreasureMap)) * * * *{ * * * * * *NewInstance = 0; * * * *}; * *}; * *// если новая ссылка отсутствует * *if(NewInstance <= 0) * *{ * * * *// найти наилучшую карту текущего уровня имеющуюся у ГГ * * * *NewInstance = B_GetBestPlayerMap(); * *}; * *// если новая и старая ссылки отсутствуют * *if((NewInstance <= 0) && (OldInstance <= 0)) * *{ * * * *// найти любую карту имеющуюся у ГГ * * * *NewInstance = B_GetAnyPlayerMap(); * *}; * *// если новая ссылка инициализирована * *if(NewInstance > 0) * *{ * * * *// установить глобальную ссылку на эту карту * * * *B_SetPlayerMap(NewInstance); * * * *return NewInstance; * *} * *return OldInstance; };
// Звук выпивания пузырька func void B_LameSchlork() { * *Snd_Play("DRINKBOTTLE"); };
// ************************************************** ************** // Функция употребления напитка повышения маны при нажатии "горячей" клавиши // ************************************************** ************** // Примечание: Вызывается только экзешником.
func void PLAYER_HOTKEY_LAME_POTION() { * *// если ГГ жив * *if(Npc_IsInState(hero,ZS_Dead) == FALSE) * *{ * * * * *// если ГГ имеет соответствующий напиток и при его выпивании мана не превысит максимальную * * * *if(Npc_HasItems(hero,ItPo_Mana_03)) * * * *&& (((hero.attribute[ATR_MANA_MAX])-(hero.attribute[ATR_MANA])) >= Mana_Elixier) * * * *{ * * * * * *// увеличить ману * * * * * *Npc_ChangeAttribute(hero,ATR_MANA,Mana_Elixier); * * * * * *// удалить напиток * * * * * *Npc_RemoveInvItem(hero,ItPo_Mana_03); * * * * * *// звук выпивания * * * * * *B_LameSchlork(); * * * *} * * * *// аналогично * * * *else if(Npc_HasItems (hero,ItPo_Mana_02)) * * * *&& (((hero.attribute[ATR_MANA_MAX])-(hero.attribute[ATR_MANA])) >= MANA_Extrakt) * * * *{ * * * * * *Npc_ChangeAttribute(hero,ATR_MANA,MANA_Extrakt); * * * * * *Npc_RemoveInvItem(hero,ItPo_Mana_02); * * * * * *B_LameSchlork(); * * * *} * * * *else if(Npc_HasItems(hero,ItPo_Mana_01)) * * * *&& (((hero.attribute[ATR_MANA_MAX])-(hero.attribute[ATR_MANA])) >= MANA_Essenz) * * * *{ * * * * * *Npc_ChangeAttribute(hero,ATR_MANA,MANA_Essenz); * * * * * *Npc_RemoveInvItem(hero,ItPo_Mana_01); * * * * * *B_LameSchlork(); * * * *} * * * *// если текущая мана не равна максимальной * * * *else if(hero.attribute[ATR_MANA_MAX] != hero.attribute[ATR_MANA]) * * * *{ * * * * * *// если ГГ имеет напиток * * * * * *if(Npc_HasItems(hero,ItPo_Mana_01)) * * * * * *{ * * * * * * * *Npc_ChangeAttribute(hero,ATR_MANA,Mana_Essenz); * * * * * * * *Npc_RemoveInvItem(hero,ItPo_Mana_01); * * * * * * * *B_LameSchlork(); * * * * * *} * * * * * *else if(Npc_HasItems(hero,ItPo_Mana_02)) * * * * * *{ * * * * * * * *Npc_ChangeAttribute(hero,ATR_MANA,MANA_Extrakt); * * * * * * * *Npc_RemoveInvItem(hero,ItPo_Mana_02); * * * * * * * *B_LameSchlork(); * * * * * *} * * * * * *else if(Npc_HasItems(hero,ItPo_Mana_03)) * * * * * *{ * * * * * * * *Npc_ChangeAttribute(hero,ATR_MANA,MANA_Elixier); * * * * * * * *Npc_RemoveInvItem(hero,ItPo_Mana_03); * * * * * * * *B_LameSchlork(); * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *Print("Нет напитка маны!"); * * * * * *}; * * * *} * * * *else * * * *{ * * * * * *Print("Максимум маны!"); * * * *}; * *}; };
// ************************************************** ************** // Функция употребления напитка повышения жизни при нажатии "горячей" клавиши // ************************************************** ************** // Примечание: Вызывается только экзешником.
// Все аналогично употреблению напитков маны func void PLAYER_HOTKEY_LAME_HEAL() { * *if(Npc_IsInState(hero,ZS_Dead)==FALSE) * *{ * * * * *if(Npc_HasItems(hero,ItPo_HEALTH_03)) * * * *&& (((hero.attribute[ATR_HITPOINTS_MAX])-(hero.attribute[ATR_HITPOINTS])) >= HP_Elixier) * * * *{ * * * * * *Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Elixier ); * * * * * *Npc_RemoveInvItem(hero,ItPo_HEALTH_03); * * * * * *B_LameSchlork(); * * * *} * * * *else if(Npc_HasItems(hero,ItPo_HEALTH_02)) * * * *&& (((hero.attribute[ATR_HITPOINTS_MAX])-(hero.attribute[ATR_HITPOINTS])) >= HP_Extrakt) * * * *{ * * * * * *Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Extrakt ); * * * * * *Npc_RemoveInvItem(hero,ItPo_HEALTH_02); * * * * * *B_LameSchlork(); * * * *} * * * *else if(Npc_HasItems(hero,ItPo_HEALTH_01)) * * * *&& (((hero.attribute[ATR_HITPOINTS_MAX])-(hero.attribute[ATR_HITPOINTS])) >= HP_Essenz) * * * *{ * * * * * *Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Essenz) ; * * * * * *Npc_RemoveInvItem(hero,ItPo_HEALTH_01); * * * * * *B_LameSchlork(); * * * *} * * * *else if((hero.attribute[ATR_HITPOINTS_MAX]) != (hero.attribute[ATR_HITPOINTS])) * * * *{ * * * * * * * *if(Npc_HasItems(hero,ItPo_HEALTH_01)) * * * * * * * *{ * * * * * * * * * *Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Essenz) ; * * * * * * * * * *Npc_RemoveInvItem(hero,ItPo_HEALTH_01); * * * * * * * * * *B_LameSchlork(); * * * * * * * *} * * * * * * * *else if(Npc_HasItems(hero,ItPo_HEALTH_02)) * * * * * * * *{ * * * * * * * * * *Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Extrakt ); * * * * * * * * * *Npc_RemoveInvItem(hero,ItPo_HEALTH_02); * * * * * * * * * *B_LameSchlork(); * * * * * * * *} * * * * * * * *else if(Npc_HasItems(hero,ItPo_HEALTH_03)) * * * * * * * *{ * * * * * * * * * *Npc_ChangeAttribute(hero,ATR_HITPOINTS,HP_Elixier ); * * * * * * * * * *Npc_RemoveInvItem(hero,ItPo_HEALTH_03); * * * * * * * * * *B_LameSchlork(); * * * * * * * *} * * * * * * * *else * * * * * * * *{ * * * * * * * * * *Print("Нет лечебного напитка!"); * * * * * * * *}; * * * * } * * * * else * * * * { * * * * * * * *Print("Максимум жизненной энергии!"); * * * * }; * *}; };
* *2. Функции инициализации и получения ссылки на последнюю просмотренную карту.
Файл B_PlayerMap.d
// ************************************************** ************** // Функции инициализации и получения ссылки на последнюю просмотренную карту // ************************************************** **************
// Внимание: переменная PlayerMapInstance является переопределенным типом (C_Item -> int) var int PlayerMapInstance; * * *// ссылка на карту
// Функция получения ссылки на карту // ---------------------------------------------------------------- // Возвращаемое значение: ссылка на карту
// Внимание: Возвращаемое значение является переопределенным типом (C_Item -> int)
func int B_GetPlayerMap() { * *return PlayerMapInstance; };
// Функция инициализации ссылки на карту // ---------------------------------------------------------------- // Аргумент: MapInstance - последняя просмотренная карта // Возвращаемое значение: ссылка на карту
// Внимание: Возвращаемое значение и аргумент MapInstance являются переопределенными типами (C_Item -> int)
func int B_SetPlayerMap(var int MapInstance) { * *PlayerMapInstance = MapInstance; * *return PlayerMapInstance; };
* *3. Функции неудачного использования МОВов.
Файл B_RefuseAction.d
// ************************************************** ************** // Функции неудачного использования МОВов // ************************************************** ************** // Примечание: Все эти функции вызываются только экзешником
// ГГ не имеет ключа или отмычки func void PLAYER_MOB_MISSING_KEY_OR_LOCKPICK() { * *// вывод текста "Мне нужен ключ или отмычка" * *Print(PRINT_Picklock_or_KeyMissing); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); * *// ГГ говорит сам себе (SVM фраза) "Гм, у меня нет ни ключа, ни отмычки." * *B_Say_Overlay(self,self,"$PICKLOCKORKEYMISSING"); };
// ГГ не имеет ключа func void PLAYER_MOB_MISSING_KEY() { * *// вывод текста "Мне нужен ключ от этого замка" * *Print(PRINT_KeyMissing); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); * *// ГГ говорит сам себе (SVM фраза) "Без настоящего ключа я не открою!" * *B_Say_Overlay(self,self,"$KEYMISSING"); };
// ГГ не имеет отмычки func void PLAYER_MOB_MISSING_LOCKPICK() { * *// если ГГ не обучен работе с отмычками * *if(Npc_GetTalentSkill(hero,NPC_TALENT_PICKLOCK) == FALSE) * *{ * * * *// вывод текста "У меня нехватает таланта" * * * *Print(PRINT_NoPicklockTalent); * * * *// ГГ пожимает плечами * * * *AI_PlayAni(self,"T_DONTKNOW"); * * * *// ГГ говорит сам себе (SVM фраза) "Я не умею взламывать замки ..." * * * *B_Say_Overlay(self,self,"$NOPICKLOCKTALENT"); * *} * *else * *{ * * * *// вывод текста "Мне нужна отмычка" * * * *Print(PRINT_PicklockMissing); * * * *// ГГ пожимает плечами * * * *AI_PlayAni(self,"T_DONTKNOW"); * * * *// ГГ говорит сам себе (SVM фраза) "Пара отмычек помогли бы!" * * * *B_Say_Overlay(self,self,"$PICKLOCKMISSING"); * *}; };
// Попытка ГГ открыть неоткрываемый МОВ func void PLAYER_MOB_NEVER_OPEN() { * *// вывод текста "Я не могу ничего сделать" * *Print(PRINT_NeverOpen); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); };
// ГГ не имеет соответствующего предмета для использования МОВа func void PLAYER_MOB_MISSING_ITEM() { * *// вывод текста "У меня нет соответствующего предмета" * *Print(PRINT_MissingItem); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); * *// ГГ говорит сам себе (SVM фраза) "Но чем?" * *B_Say_Overlay(self,self,"$MISSINGITEM"); };
// Если МОВ уже используется другим НПС func void PLAYER_MOB_ANOTHER_IS_USING() { * *// вывод текста "Это сейчас занято" * *Print(PRINT_AnotherUser); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); };
// Если ГГ находится слишком далеко от МОВа func void PLAYER_MOB_TOO_FAR_AWAY() { * *// вывод текста "Я нахожусь слишком далеко" * *Print(PRINT_Toofar_Away); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); };
// Если ГГ подошел к МОВу не с той стороны func void PLAYER_MOB_WRONG_SIDE() { * *// вывод текста "Я нахожусь с другой стороны" * *Print(PRINT_WrongSide); * *// ГГ пожимает плечами * *AI_PlayAni(self,"T_DONTKNOW"); };
// ГГ не имеет денег для покупки предмета func void PLAYER_TRADE_NOT_ENOUGH_GOLD() { * *// вывод текста "У вас недостаточно золота, чтобы купить это." * *Print(PRINT_Trade_Not_Enough_Gold); };
|