Показать сообщение отдельно
Старый 15.08.2005, 16:47   #233
Vam

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

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

* *27. Функция повышения атрибутов НПС учителями.

Файл B_TeachAttributePoints.d

// ************************************************** **************
// Функция повышения атрибутов НПС учителями
// ************************************************** **************
// Аргументы: slf - учитель, oth - обучаемый (ГГ), attrib - атрибут, points - пункты изменения, teacherMAX - возможность учителя
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно

func int B_TeachAttributePoints(var C_NPC slf,var C_NPC oth,var int attrib,var int points,var int teacherMAX)
{
* *var string concatText;
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = (B_GetLearnCostAttribute (oth, attrib) * points);
* *// если не правильный атрибут
* *if(attrib != ATR_STRENGTH) && (attrib != ATR_DEXTERITY) && (attrib != ATR_MANA_MAX)
* *{
* * * *Print("*** ERROR: Wrong Parameter ***");
* * * *return FALSE;
* *};
* *var int realAttribute;
* *// получить реальное значение изменяемого атрибута (без учета разных бонусов)
* *if * * (attrib == ATR_STRENGTH) * * { realAttribute = oth.attribute[ATR_STRENGTH]; }
* *else if(attrib == ATR_DEXTERITY) * *{ realAttribute = oth.attribute[ATR_DEXTERITY];}
* *else if(attrib == ATR_MANA_MAX) * * { realAttribute = oth.attribute[ATR_MANA_MAX]; };
* *// если значение атрибута выше способности учителя
* *if(realAttribute >= teacherMAX)
* *{
* * * *// вывод текста: "Максимум учителя составляет " + teacherMAX
* * * *concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToSt ring(teacherMAX));
* * * *PrintScreen(concatText,-1,-1,FONT_Screen,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ обучен по максимуму"
* * * *// Примечание: корявый перевод, можно заменить на подходящий.
* * * *B_Say(slf,oth,"$NOLEARNYOUREBETTER");
* * * *return FALSE;
* *};
* *// если новое значение атрибута будет выше способности учителя
* *if((realAttribute + points) > teacherMAX)
* *{
* * * *// вывод текста: "Максимум учителя составляет " + teacherMAX
* * * *concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToSt ring(teacherMAX));
* * * *PrintScreen(concatText,-1,-1,FONT_Screen,2);
* * * *// учитель говорит ученику (SVM фраза) "учитель не способен обучить ГГ"
* * * *// Примечание: корявый перевод, можно заменить на подходящий.
* * * *B_Say(slf,oth,"$NOLEARNOVERPERSONALMAX");
* * * *return FALSE;
* *};
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_Screen,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *// Примечание: корявый перевод, можно заменить на подходящий.
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// повысить нужный атрибут
* *B_RaiseAttribute(oth,attrib,points);
* *return TRUE;
};


* *28. Функция повышения боевых навыков учителями.

Файл B_TeachFightTalentPercent.d

// ************************************************** **************
// Функция повышения боевых навыков учителями
// ************************************************** **************
// Аргументы: slf - учитель, oth - обучаемый (ГГ), talent - навык, percent - пункты изменения, teacherMAX - возможность учителя
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно

func int B_TeachFightTalentPercent(var C_NPC slf,var C_NPC oth,var int talent,var int percent,var int teacherMAX)
{
* *var string concatText;
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = (B_GetLearnCostTalent(oth,talent,1) * percent);
* *// если не правильный навык
* *if(talent != NPC_TALENT_1H) && (talent != NPC_TALENT_2H) && (talent != NPC_TALENT_BOW) && (talent != NPC_TALENT_CROSSBOW)
* *{
* * * *Print ("*** ERROR: Wrong Parameter ***");
* * * *return FALSE;
* *};
* *var int realHitChance;
* *// получить реальное значение изменяемого навыка (без учета разных бонусов)
* *if * * (talent == NPC_TALENT_1H) * * * *{ realHitChance = oth.HitChance[NPC_TALENT_1H]; * * }
* *else if(talent == NPC_TALENT_2H) * * * *{ realHitChance = oth.HitChance[NPC_TALENT_2H]; * * }
* *else if(talent == NPC_TALENT_BOW) * * * { realHitChance = oth.HitChance[NPC_TALENT_BOW]; * *}
* *else if(talent == NPC_TALENT_CROSSBOW) *{ realHitChance = oth.HitChance[NPC_TALENT_CROSSBOW];};
* *// если значение навыка выше способности учителя
* *if(realHitChance >= teacherMAX)
* *{
* * * *// вывод текста: "Максимум учителя составляет " + teacherMAX
* * * *concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToSt ring(teacherMAX));
* * * *PrintScreen(concatText,-1,-1,FONT_SCREEN,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ обучен по максимуму"
* * * *B_Say(slf,oth,"$NOLEARNYOUREBETTER");
* * * *return FALSE;
* *};
* *// если новое значение навыка будет выше способности учителя
* *if((realHitChance + percent) > teacherMAX)
* *{
* * * *// вывод текста: "Максимум учителя составляет " + teacherMAX
* * * *concatText = ConcatStrings(PRINT_NoLearnOverPersonalMAX,IntToSt ring(teacherMAX));
* * * *PrintScreen(concatText,-1,-1,FONT_SCREEN,2);
* * * *// учитель говорит ученику (SVM фраза) "учитель не способен обучить ГГ"
* * * *B_Say(slf,oth,"$NOLEARNOVERPERSONALMAX");
* * * *return FALSE;
* *};
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_Screen,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// если одноручник
* *if(talent == NPC_TALENT_1H) * * * *
* *{ *
* * * *// повысить навык
* * * *B_RaiseFightTalent(oth,NPC_TALENT_1H,percent);
* * * *// если владение одноручником на 30 превышает владение двуручником
* * * *if(oth.aivar[REAL_TALENT_1H] >= (oth.aivar[REAL_TALENT_2H] + 30))
* * * *{
* * * * * *// повысить навык двуручника
* * * * * *B_RaiseFightTalent(oth,NPC_TALENT_2H,percent);
* * * * * *// вывод текста: "Улучшить: Борьба одно- и двуручным оружием"
* * * * * *PrintScreen(PRINT_Learn1H_and_2H,-1,-1,FONT_Screen,2);
* * * *}
* * * *else
* * * *{
* * * * * *// вывод текста: "Улучшить: Одноручное оружие"
* * * * * *PrintScreen(PRINT_Learn1H,-1,-1,FONT_Screen,2);
* * * *};
* *};
* *// аналогично, если двуручник
* *else if(talent == NPC_TALENT_2H) * * * * * *
* *{ *
* * * *B_RaiseFightTalent(oth,NPC_TALENT_2H,percent);
* * * *if(oth.aivar[REAL_TALENT_2H] >= (oth.aivar[REAL_TALENT_1H] + 30))
* * * *{
* * * * * *B_RaiseFightTalent(oth,NPC_TALENT_1H,percent);
* * * * * *PrintScreen(PRINT_Learn2H_and_1H,-1,-1,FONT_Screen,2);
* * * *}
* * * *else
* * * *{
* * * * * *PrintScreen(PRINT_Learn2H,-1,-1,FONT_Screen,2);
* * * *};
* *};
* *// аналогично, если лук
* *else if(talent == NPC_TALENT_BOW) * * * * *
* *{ *
* * * *B_RaiseFightTalent(oth,NPC_TALENT_BOW,percent);
* * * *if(oth.aivar[REAL_TALENT_BOW] >= (oth.aivar[REAL_TALENT_CROSSBOW] + 30))
* * * *{
* * * * * *B_RaiseFightTalent(oth,NPC_TALENT_CROSSBOW,percen t);
* * * * * *PrintScreen(PRINT_LearnBow_and_Crossbow,-1,-1,FONT_Screen,2);
* * * *}
* * * *else
* * * *{
* * * * * *PrintScreen(PRINT_LearnBow,-1,-1,FONT_Screen,2);
* * * *};
* *};
* *// аналогично, если арбалет
* *else if(talent == NPC_TALENT_CROSSBOW) * * * * *
* *{ *
* * * *B_RaiseFightTalent(oth,NPC_TALENT_CROSSBOW,percen t);
* * * *if(oth.aivar[REAL_TALENT_CROSSBOW] >= (oth.aivar[REAL_TALENT_BOW] + 30))
* * * *{
* * * * * *B_RaiseFightTalent(oth,NPC_TALENT_BOW,percent);
* * * * * *PrintScreen(PRINT_LearnCrossbow_and_Bow,-1,-1,FONT_Screen,2);
* * * *}
* * * *else
* * * *{
* * * * * *PrintScreen(PRINT_LearnCrossbow,-1,-1,FONT_Screen,2);
* * * *};
* *};
* *return TRUE;
};


* *29. Функция повышения круга магии НПС учителями.

Файл B_TeachMagicCircle.d

// ************************************************** **************
// Функция повышения круга магии НПС учителями
// ************************************************** **************
// Аргументы: slf - учитель, oth - обучаемый (ГГ), circle - круг магии
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно

func int B_TeachMagicCircle(var C_NPC slf,var C_NPC oth,var int circle)
{
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = B_GetLearnCostTalent(oth,NPC_TALENT_MAGE,circle);
* *// если не правильный круг
* *if(circle < 1) ¦¦ (circle > 6)
* *{
* * * *Print("*** ERROR: Wrong Parameter ***");
* * * *return FALSE;
* *};
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLP,-1,-1,FONT_Screen,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// отобразить в окне характеристик
* *Npc_SetTalentSkill(oth,NPC_TALENT_MAGE,circle);
* *// создать в дневнике тему "Круги магии"
* *Log_CreateTopic(TOPIC_TalentMagicCircle,LOG_NOTE) ;
* *// сделать запись
* *B_LogEntry(TOPIC_TalentMagicCircle,"Доступные мне магические руны разделены на Круги. Формулами заклинаний более высокого Круга, чем доступный мне, я не владею.");
* *// круг 1
* *if(circle == 1)
* *{
* * * *// вывод текста: "Обучение: 1 Круг магии"
* * * *PrintScreen(PRINT_LearnCircle_1,-1,-1,FONT_Screen,2);
* * * *// сделать запись
* * * *B_LogEntry(TOPIC_TalentMagicCircle,"Заклинания 1 магического Круга: свет, огненная стрела, молния, лечить легкое ранение и вызвать скелет гоблина.");
* * * *return TRUE;
* *};
* *// круг 2
* *if(circle == 2)
* *{
* * * *// вывод текста: "Обучение: 2 Круг магии"
* * * *PrintScreen(PRINT_LearnCircle_2,-1,-1,FONT_Screen,2);
* * * *// сделать запись
* * * *B_LogEntry(TOPIC_TalentMagicCircle,"Заклинания 2 магического Круга: огненный шар, ледяная стрела, вызвать волка, порыв ветра и сон.");
* * * *return TRUE;
* *};
* *// круг 3
* *if (circle == 3)
* *{
* * * *// вывод текста: "Обучение: 3 Круг магии"
* * * *PrintScreen(PRINT_LearnCircle_3,-1,-1,FONT_Screen,2);
* * * *// сделать запись
* * * *B_LogEntry(TOPIC_TalentMagicCircle,"Заклинания 3 магического Круга: лечить среднее ранение, шаровая молния, огненная буря, вызвать скелет, страх и ледяная глыба.");
* * * *return TRUE;
* *};
* *// круг 4
* *if (circle == 4)
* *{
* * * *// вывод текста: "Обучение: 4 Круг магии"
* * * *PrintScreen(PRINT_LearnCircle_4,-1,-1,FONT_Screen,2);
* * * *// сделать запись
* * * *B_LogEntry(TOPIC_TalentMagicCircle,"Заклинания 4 магического Круга: удар молнии, вызвать голема, уничтожить нежить и большой огненный шар.");
* * * *return TRUE;
* *};
* *// круг 5
* *if (circle == 5)
* *{
* * * *// вывод текста: "Обучение: 5 Круг магии"
* * * *PrintScreen(PRINT_LearnCircle_5,-1,-1,FONT_Screen,2);
* * * *// сделать запись
* * * *B_LogEntry(TOPIC_TalentMagicCircle,"Заклинания 5 магического Круга: большая огненная буря, ледяная волна, вызвать демона и лечить сильное ранение.");
* * * *return TRUE;
* *};
* *// круг 6
* *if (circle == 6)
* *{
* * * *// вывод текста: "Обучение: 6 Круг магии"
* * * *PrintScreen(PRINT_LearnCircle_6,-1,-1,FONT_Screen,2);
* * * *// сделать запись
* * * *B_LogEntry(TOPIC_TalentMagicCircle,"Заклинания 6 магического Круга: огненный дождь, дым смерти, волна смерти, армия тьмы и уменьшить монстра.");
* * * *return TRUE;
* *};
};


* *30. Функция повышения таланта алхимии учителями.

Файл B_TeachPlayerTalentAlchemy.d

// ************************************************** **************
// Функция повышения таланта алхимии учителями
// ************************************************** **************
// Аргументы: slf - учитель, oth - обучаемый (ГГ), potion - изготовляемый напиток
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно

func int B_TeachPlayerTalentAlchemy(var C_NPC slf,var C_NPC oth,var int potion)
{
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = B_GetLearnCostTalent(oth,NPC_TALENT_ALCHEMY,potion );
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLearnPoints,-1,-1,FONT_ScreenSmall,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// создать в дневнике тему "Напитки"
* *Log_CreateTopic(TOPIC_TalentAlchemy,LOG_NOTE);
* *// сделать запись
* *B_LogEntry(TOPIC_TalentAlchemy,"Для приготовления напитка мне нужна лабороторная колба и некоторые ингредиенты для желаемого напитка. С помощью этих ингредиентов на алхимическом столе можно изготовить желаемый напиток.");
* *// если Лечебная эссенция
* *if(potion == POTION_Health_01)
* *{
* * * *// освоить навык
* * * *PLAYER_TALENT_ALCHEMY[POTION_Health_01] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЛЕЧЕБНАЯ ЭССЕНЦИЯ': 2 лечебных растения и 1 полевое растение.");
* *};
* *// для остальных напитков аналогично
* *if(potion == POTION_Health_02)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Health_02] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЛЕЧЕБНЫЙ ЭКСТРАКТ': 2 лечебные травы и 1 полевое растение.");
* *};
* *if(potion == POTION_Health_03)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Health_03] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЛЕЧЕБНЫЙ ЭЛИКСИР': 2 лечебных корня и 1 полевое растение.");
* *};
* *if(potion == POTION_Mana_01)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Mana_01] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭССЕНЦИЯ МАНЫ': 2 огненные крапивы и 1 полевое растение.");
* *};
* *if(potion == POTION_Mana_02)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Mana_02] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭКСТРАКТ МАНЫ': 2 огненные травы и 1 полевое растение.");
* *};
* *if(potion == POTION_Mana_03)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Mana_03] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭЛИКСИР МАНЫ': 2 огненных корня и 1 полевое растение.");
* *};
* *if(potion == POTION_Speed)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Speed] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'НАПИТОК УСКОРЕНИЯ': 1 трава глорха и 1 полевое растение.");
* *};
* *if(potion == POTION_Perm_STR)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Perm_STR] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭЛИКСИР СИЛЫ': 1 драконий корень и 1 коронное растение.");
* *};
* *if(potion == POTION_Perm_DEX)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Perm_DEX] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭЛИКСИР ЛОВКОСТИ': 1 ягода гоблина и 1 коронное растение.");
* *};
* *if(potion == POTION_Perm_Mana)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Perm_Mana] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭЛИКСИР ДУХА': 1 огненный корень и 1 коронное растение.");
* *};
* *if(potion == POTION_Perm_Health)
* *{
* * * *PLAYER_TALENT_ALCHEMY[POTION_Perm_Health] = TRUE;
* * * *B_LogEntry(TOPIC_TalentAlchemy,"Ингредиенты для напитка 'ЭЛИКСИР ЖИЗНИ': 1 лечебный корень и 1 коронное растение.");
* *};
* *// вывод текста: "Обучение: Приготовление напитка"
* *PrintScreen(PRINT_LearnAlchemy,-1,-1,FONT_Screen,2);
* *// отобразить в окне характеристик
* *Npc_SetTalentSkill(oth,NPC_TALENT_ALCHEMY,1);
* *return TRUE;
};


* *31. Функция обучения иностранным языкам.

Файл B_TeachPlayerTalentForeignLanguage.d

// ************************************************** **************
// Функция обучения иностранным языкам
// ************************************************** **************
// Аргументы: slf - учитель, oth - обучаемый (ГГ), Language - уровень владения языком
// Возвращаемое значение: TRUE - обучение успешно, FALSE - обучение невозможно

func int B_TeachPlayerTalentForeignLanguage(var C_NPC slf,var C_NPC oth,var int Language)
{
* *var int kosten;
* *// получить стоимость обучения в LP
* *kosten = B_GetLearnCostTalent(oth,NPC_TALENT_FOREIGNLANGUAG E,Language);
* *// если очков обучения недостаточно
* *if(oth.lp < kosten)
* *{
* * * *// вывод текста: "Недостаточное количество оч. обучения!"
* * * *PrintScreen(PRINT_NotEnoughLearnPoints,-1,-1,FONT_ScreenSmall,2);
* * * *// учитель говорит ученику (SVM фраза) "ГГ не хватает опыта"
* * * *B_Say(slf,oth,"$NOLEARNNOPOINTS");
* * * *return FALSE;
* *};
* *// использовать очки обучения
* *oth.lp = oth.lp - kosten;
* *// создать в дневнике тему "Язык строителей"
* *Log_CreateTopic(TOPIC_Language,LOG_NOTE);
* *// первый уровень языка
* *if(Language == LANGUAGE_1)
* *{
* * * *// освоить навык
* * * *PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_1] = TRUE;
* * * *// сделать запись "Я владею Языком Крестьян. Это был обычный язык Строителей."
* * * *B_LogEntry(TOPIC_Language,LogText_Addon_Language_ 1);
* *};
* *// для остальных уровней аналогично
* *if(Language == LANGUAGE_2)
* *{
* * * *PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_2] = TRUE;
* * * *// запись "Я владею Языком Воинов."
* * * *B_LogEntry(TOPIC_Language,LogText_Addon_Language_ 2);
* *}; *
* *if(Language == LANGUAGE_3)
* *{
* * * *PLAYER_TALENT_FOREIGNLANGUAGE[LANGUAGE_3] = TRUE;
* * * *// сделать запись "Я владею Языком Жрецов."
* * * *B_LogEntry(TOPIC_Language,LogText_Addon_Language_ 3);
* *}; *
* *// вывод текста: "Учится: язык строителей"
* *PrintScreen(PRINT_LearnForeignLanguage,-1,-1,FONT_Screen,2);
* *// отобразить в окне характеристик
* *Npc_SetTalentSkill(oth,NPC_TALENT_FOREIGNLANGUAGE ,1);
* *return TRUE;
};

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