Показать сообщение отдельно
Старый 18.08.2005, 11:17   #237
Vam

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

По умолчанию 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);
};


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