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