• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

    Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в этом году
    По желанию, аргументировать свой выбор можете в теме обсуждения голосования.

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 577
Последнее редактирование модератором:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
прототип можно использовать общий для всех элементов.
Но как тогда прописывать в одном прототипе вот этот кусок кода с координатами?

Daedalus:
  posx                   = 0;
    posy                   = STAT_ARM_Y;
Ставить posx и posy = 0, а для конкретных элементов расписывать типа такого:

Daedalus:
INSTANCE MENU_ITEM_ARMOR_1_TITLE(PRT_MENU_ITEM_ARMOR)   { posx = STAT_A_X1;  posy = STAT_ARM_Y + 0*STAT_DY;  text[0] = "От рубящего"; };
INSTANCE MENU_ITEM_ARMOR_1(PRT_MENU_ITEM_ARMOR)         { posx = STAT_A_X2;  posy = STAT_ARM_Y + 0*STAT_DY;  };
?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
da
Пост автоматически объединён:

Но как тогда прописывать в одном прототипе вот этот кусок кода с координатами?
без разницы. ты координаты всё равно переопределяешь в инстанции.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Такой вариант работает корректно:
Daedalus:
META
{
    Parser = MENU;
    Engine = G2A;
    
};

instance MENU_STATUS(C_MENU_DEF)
{
    items[0]  = "MENU_ITEM_STATUS_HEADING";
    items[1]  = "MENU_ITEM_PLAYERGUILD";
    items[2]  = "MENU_ITEM_LEVEL_TITLE";
    items[3]  = "MENU_ITEM_LEVEL";
    items[4]  = "MENU_ITEM_EXP_TITLE";
    items[5]  = "MENU_ITEM_EXP";
    items[6]  = "MENU_ITEM_LEVEL_NEXT_TITLE";
    items[7]  = "MENU_ITEM_LEVEL_NEXT";
    items[8]  = "MENU_ITEM_LEARN_TITLE";
    items[9]  = "MENU_ITEM_LEARN";
    items[10] = "MENU_ITEM_ATTRIBUTE_HEADING";
    items[11] = "MENU_ITEM_ATTRIBUTE_1_TITLE";
    items[12] = "MENU_ITEM_ATTRIBUTE_2_TITLE";
    items[13] = "MENU_ITEM_ATTRIBUTE_3_TITLE";
    items[14] = "MENU_ITEM_ATTRIBUTE_4_TITLE";
    items[15] = "MENU_ITEM_ATTRIBUTE_1";
    items[16] = "MENU_ITEM_ATTRIBUTE_2";
    items[17] = "MENU_ITEM_ATTRIBUTE_3";
    items[18] = "MENU_ITEM_ATTRIBUTE_4";
    items[19] = "MENU_ITEM_ARMOR_HEADING";
    items[20] = "MENU_ITEM_ARMOR_1_TITLE";
    items[21] = "MENU_ITEM_ARMOR_2_TITLE";
    items[22] = "MENU_ITEM_ARMOR_3_TITLE";
    items[23] = "MENU_ITEM_ARMOR_4_TITLE";
    items[24] = "MENU_ITEM_ARMOR_5_TITLE";
    items[25] = "MENU_ITEM_ARMOR_1";
    items[26] = "MENU_ITEM_ARMOR_2";
    items[27] = "MENU_ITEM_ARMOR_3";
    items[28] = "MENU_ITEM_ARMOR_4";
    items[29] = "MENU_ITEM_ARMOR_5";
    items[30] = "MENU_ITEM_TALENTS_HEADING";
    items[31] = "MENU_ITEM_TALENT_1_TITLE";
    items[32] = "MENU_ITEM_TALENT_1_SKILL";
    items[33] = "MENU_ITEM_TALENT_1";
    items[34] = "MENU_ITEM_TALENT_2_TITLE";
    items[35] = "MENU_ITEM_TALENT_2_SKILL";
    items[36] = "MENU_ITEM_TALENT_2";
    items[37] = "MENU_ITEM_TALENT_3_TITLE";
    items[38] = "MENU_ITEM_TALENT_3_SKILL";
    items[39] = "MENU_ITEM_TALENT_3";
    items[40] = "MENU_ITEM_TALENT_4_TITLE";
    items[41] = "MENU_ITEM_TALENT_4_SKILL";
    items[42] = "MENU_ITEM_TALENT_4";
    items[43] = "MENU_ITEM_TALENT_7_TITLE";
    items[44] = "MENU_ITEM_TALENT_7_CIRCLE";
    items[45] = "MENU_ITEM_TALENT_7_SKILL";
    items[46] = "MENU_ITEM_TALENT_14_TITLE";
    items[47] = "MENU_ITEM_TALENT_14_SKILL";
    items[48] = "MENU_ITEM_TALENT_15_TITLE";
    items[49] = "MENU_ITEM_TALENT_15_SKILL";
    items[50] = "MENU_ITEM_TALENT_17_TITLE";
    items[51] = "MENU_ITEM_TALENT_17_SKILL";
    items[52] = "MENU_ITEM_TALENT_5_TITLE";
    items[53] = "MENU_ITEM_TALENT_5_SKILL";
    items[54] = "MENU_ITEM_TALENT_8_TITLE";
    items[55] = "MENU_ITEM_TALENT_8_SKILL";
    items[56] = "MENU_ITEM_TALENT_19_TITLE";
    items[56] = "MENU_ITEM_TALENT_19_SKILL";
    items[58] = "MENU_ITEM_TALENT_13_TITLE";
    items[59] = "MENU_ITEM_TALENT_13_SKILL";
    flags = flags | MENU_OVERTOP | MENU_NOANI;
    backpic = STAT_BACK_PIC;
};

const int STAT_A_X1 = 500;
const int STAT_A_X2 = 2575;
const int STAT_A_X3 = 3000;
const int STAT_A_X4 = 3400;
const int STAT_B_X1 = 3830;
const int STAT_B_X2 = 6050;
const int STAT_B_X3 = 7300;
const int STAT_B_X4 = 7700;
const int STAT_PLYHEAD_Y = 1000;
const int STAT_PLY_Y = 1450;
const int STAT_ATRHEAD_Y = 3250;
const int STAT_ATR_Y = 3700;
const int STAT_ARMHEAD_Y = 5200;
const int STAT_ARM_Y = 5650;
const int STAT_TALHEAD_Y = 1000;
const int STAT_TAL_Y = 1450;
const int STAT_DY = 300;

PROTOTYPE PRT_MENU_ITEM(C_MENU_ITEM)
{
    fontName               = STAT_FONT_DEFAULT;
    text                   = "";
    alphaMode              = "BLEND";
    alpha                  = 254;            // NOTE: Must be under 255 to support chroma keying, chroma color is black
    type                   = MENU_ITEM_TEXT;
    posx                   = 0;
    posy                   = 0;
    dimx                   = -1;                      // -1 = AUTODETECT
    dimy                   = -1;                      // -1 = AUTODETECT
    flags                  = IT_CHROMAKEYED|IT_TRANSPARENT; // нельзя выбирать пункт в меню
 
    openDelayTime          = 0;
    openDuration           = -1;
 
    sizeStartScale         = 1;
 
    userFloat[0]           = 100;
    userFloat[1]           = 200;
 
    //onSelAction[0]         = SEL_ACTION_BACK;
    onChgSetOption         = "";
    onChgSetOptionSection  = "INTERNAL";
    hideIfOptionSectionSet = "";
    hideIfOptionSet        = "";
    hideOnValue            = -1;
 
    frameSizeX             = 0;
    frameSizeY             = 0;
};


instance MENU_ITEM_STATUS_HEADING(C_MENU_ITEM_DEF)
{
    text[0] = "ПЕРСОНАЖ";
    posx = STAT_A_X1;
    posy = STAT_PLYHEAD_Y;
    dimx = STAT_A_X4 - STAT_A_X1;
    dimy = STAT_DY;
    fontname = STAT_FONT_DEFAULT;
    flags = (flags & ~IT_SELECTABLE) | IT_TXT_CENTER;
};
// Guild //
INSTANCE MENU_ITEM_PLAYERGUILD(PRT_MENU_ITEM)       { posx = STAT_A_X1;  posy = STAT_PLY_Y + (0*STAT_DY);  };

// Level //
INSTANCE MENU_ITEM_LEVEL_TITLE(PRT_MENU_ITEM)       { posx = STAT_A_X1;  posy = STAT_PLY_Y + (1*STAT_DY);  text[0] = "Уровень"; };
INSTANCE MENU_ITEM_LEVEL(PRT_MENU_ITEM)             { posx = STAT_A_X2;  posy = STAT_PLY_Y + (1*STAT_DY);  };

// Exp //
INSTANCE MENU_ITEM_EXP_TITLE(PRT_MENU_ITEM)         { posx = STAT_A_X1;  posy = STAT_PLY_Y + (2*STAT_DY);  text[0] = "Опыт"; };
INSTANCE MENU_ITEM_EXP(PRT_MENU_ITEM)               { posx = STAT_A_X2;  posy = STAT_PLY_Y + (2*STAT_DY);  };

// Exp for Next Level //
INSTANCE MENU_ITEM_LEVEL_NEXT_TITLE(PRT_MENU_ITEM)  { posx = STAT_A_X1;  posy = STAT_PLY_Y + (3*STAT_DY);  text[0] = "След. уровень"; };
INSTANCE MENU_ITEM_LEVEL_NEXT(PRT_MENU_ITEM)        { posx = STAT_A_X2;  posy = STAT_PLY_Y + (3*STAT_DY);  };

// Learn Points //
INSTANCE MENU_ITEM_LEARN_TITLE(PRT_MENU_ITEM)       { posx = STAT_A_X1;  posy = STAT_PLY_Y + (4*STAT_DY);  text[0] = "Очки обучения"; };
INSTANCE MENU_ITEM_LEARN(PRT_MENU_ITEM)             { posx = STAT_A_X2;  posy = STAT_PLY_Y + (4*STAT_DY);  };


instance MENU_ITEM_ATTRIBUTE_HEADING(C_MENU_ITEM_DEF)
{
    posx = STAT_A_X1;
    posy = STAT_ATRHEAD_Y;
    dimx = STAT_A_X4 - STAT_A_X1;
    dimy = STAT_DY;
    text[0] = "ХАРАКТЕРИСТИКИ";
    fontname = STAT_FONT_DEFAULT;
    flags = (flags & ~IT_SELECTABLE) | IT_TXT_CENTER;
};
// Strenght //
INSTANCE MENU_ITEM_ATTRIBUTE_1_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ATR_Y + (0*STAT_DY);  text[0] = "Сила"; };
INSTANCE MENU_ITEM_ATTRIBUTE_1(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ATR_Y + (0*STAT_DY);  };

// Dexteriety //
INSTANCE MENU_ITEM_ATTRIBUTE_2_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ATR_Y + (1*STAT_DY);  text[0] = "Ловкость"; };
INSTANCE MENU_ITEM_ATTRIBUTE_2(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ATR_Y + (1*STAT_DY);  };

// Mana //
INSTANCE MENU_ITEM_ATTRIBUTE_3_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ATR_Y + (2*STAT_DY);  text[0] = "Мана"; };
INSTANCE MENU_ITEM_ATTRIBUTE_3(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ATR_Y + (2*STAT_DY);  };

// Hitpoint_MAX //
INSTANCE MENU_ITEM_ATTRIBUTE_4_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ATR_Y + (3*STAT_DY);  text[0] = "Здоровье"; };
INSTANCE MENU_ITEM_ATTRIBUTE_4(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ATR_Y + (3*STAT_DY);  };


instance MENU_ITEM_ARMOR_HEADING(C_MENU_ITEM_DEF)
{
    posx = STAT_A_X1;
    posy = STAT_ARMHEAD_Y;
    dimx = STAT_A_X4 - STAT_A_X1;
    dimy = STAT_DY;
    text[0] = "ЗАЩИТА";
    fontname = STAT_FONT_DEFAULT;
    flags = (flags & ~IT_SELECTABLE) | IT_TXT_CENTER;
};
// From EDGE-damdage //
INSTANCE MENU_ITEM_ARMOR_1_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ARM_Y + (0*STAT_DY);  text[0] = "От рубящего"; };
INSTANCE MENU_ITEM_ARMOR_1(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ARM_Y + (0*STAT_DY);  };

// From POINT-damdage //
INSTANCE MENU_ITEM_ARMOR_2_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ARM_Y + (1*STAT_DY);  text[0] = "От колющего"; };
INSTANCE MENU_ITEM_ARMOR_2(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ARM_Y + (1*STAT_DY);  };

// From BLUNT-damdage //
INSTANCE MENU_ITEM_ARMOR_3_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ARM_Y + (2*STAT_DY);  text[0] = "От дробящего"; };
INSTANCE MENU_ITEM_ARMOR_3(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ARM_Y + (2*STAT_DY);  };

// From FIRE-damdage //
INSTANCE MENU_ITEM_ARMOR_4_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ARM_Y + (3*STAT_DY);  text[0] = "От огня"; };
INSTANCE MENU_ITEM_ARMOR_4(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ARM_Y + (3*STAT_DY);  };

// From MAGIC-damdage //
INSTANCE MENU_ITEM_ARMOR_5_TITLE(PRT_MENU_ITEM)   { posx = STAT_A_X1;  posy = STAT_ARM_Y + (4*STAT_DY);  text[0] = "От магии"; };
INSTANCE MENU_ITEM_ARMOR_5(PRT_MENU_ITEM)         { posx = STAT_A_X2;  posy = STAT_ARM_Y + (4*STAT_DY);  };


instance MENU_ITEM_TALENTS_HEADING(C_MENU_ITEM_DEF)
{
    posx = STAT_B_X1;
    posy = STAT_TALHEAD_Y;
    dimx = STAT_B_X4 - STAT_B_X1;
    dimy = STAT_DY;
    text[0] = "НАВЫКИ";
    fontname = STAT_FONT_DEFAULT;
    flags = (flags & ~IT_SELECTABLE) | IT_TXT_CENTER;
};
///// ---- FIGHT ---- /////

// - 1h ------ //  Talent 1
INSTANCE MENU_ITEM_TALENT_1_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (0*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_1_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (0*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_1(PRT_MENU_ITEM)         { posx = STAT_B_X3;  posy = STAT_TAL_Y + (0*STAT_DY);   };

// - 2h ------- // Talent 2
INSTANCE MENU_ITEM_TALENT_2_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (1*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_2_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (1*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_2(PRT_MENU_ITEM)         { posx = STAT_B_X3;  posy = STAT_TAL_Y + (1*STAT_DY);   };

// - Bow ------ // Talent 3
INSTANCE MENU_ITEM_TALENT_3_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (2*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_3_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (2*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_3(PRT_MENU_ITEM)         { posx = STAT_B_X3;  posy = STAT_TAL_Y + (2*STAT_DY);   };

// - Crossbow - // Talent 4
INSTANCE MENU_ITEM_TALENT_4_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (3*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_4_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (3*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_4(PRT_MENU_ITEM)         { posx = STAT_B_X3;  posy = STAT_TAL_Y + (3*STAT_DY);   };

///// ---- MAGE ---- /////

// - MageCircle // Talent 7
INSTANCE MENU_ITEM_TALENT_7_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (5*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_7_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (5*STAT_DY);   };

// - Runes ---- // Talent 14
INSTANCE MENU_ITEM_TALENT_14_TITLE(PRT_MENU_ITEM)  { posx = STAT_B_X1;  posy = STAT_TAL_Y + (6*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_14_SKILL(PRT_MENU_ITEM)  { posx = STAT_B_X2;  posy = STAT_TAL_Y + (6*STAT_DY);   };

// - Alchemy -- // Talent 15
INSTANCE MENU_ITEM_TALENT_15_TITLE(PRT_MENU_ITEM)  { posx = STAT_B_X1;  posy = STAT_TAL_Y + (7*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_15_SKILL(PRT_MENU_ITEM)  { posx = STAT_B_X2;  posy = STAT_TAL_Y + (7*STAT_DY);   };

// - FOREIGNLANGUAGE // Talent 17
INSTANCE MENU_ITEM_TALENT_17_TITLE(PRT_MENU_ITEM)  { posx = STAT_B_X1;  posy = STAT_TAL_Y + (8*STAT_DY);   };
INSTANCE MENU_ITEM_TALENT_17_SKILL(PRT_MENU_ITEM)  { posx = STAT_B_X2;  posy = STAT_TAL_Y + (8*STAT_DY);   };

///// ---- THIEF ---- /////

// - Sneak ---- // Talent 8
INSTANCE MENU_ITEM_TALENT_8_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (10*STAT_DY);  };
INSTANCE MENU_ITEM_TALENT_8_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (10*STAT_DY);  };

// - Picklock - // Talent 5
INSTANCE MENU_ITEM_TALENT_5_TITLE(PRT_MENU_ITEM)   { posx = STAT_B_X1;  posy = STAT_TAL_Y + (11*STAT_DY);  };
INSTANCE MENU_ITEM_TALENT_5_SKILL(PRT_MENU_ITEM)   { posx = STAT_B_X2;  posy = STAT_TAL_Y + (11*STAT_DY);  };

///// ---- HUNT ---- /////

// - TakeAnimalTrophy // Talent 19
INSTANCE MENU_ITEM_TALENT_19_TITLE(PRT_MENU_ITEM)  { posx = STAT_B_X1;  posy = STAT_TAL_Y + (13*STAT_DY);  };
INSTANCE MENU_ITEM_TALENT_19_SKILL(PRT_MENU_ITEM)  { posx = STAT_B_X2;  posy = STAT_TAL_Y + (13*STAT_DY);  };

///// ---- CRAFT ---- /////

// - Smith ---- // Talent 13
INSTANCE MENU_ITEM_TALENT_13_TITLE(PRT_MENU_ITEM)  { posx = STAT_B_X1;  posy = STAT_TAL_Y + (15*STAT_DY);  };
INSTANCE MENU_ITEM_TALENT_13_SKILL(PRT_MENU_ITEM)  { posx = STAT_B_X2;  posy = STAT_TAL_Y + (15*STAT_DY);  };

А где вообще можно проследить взаимосвязь элементов меню и скриптов? Если конкретнее, я говорю об отображаемых параметрах брони.
Где игра прописывает откуда ей брать значения для отображения показателя MENU_ITEM_ARMOR_3?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
нигде. это делает движок.
Пост автоматически объединён:

MENU_ITEM_TALENT_0_TITLE - MENU_ITEM_TALENT_16_TITLEНазвание таланта персонажа. Используется индексы массива TXT_TALENTS из файла Text.d. Данный файл расположен в скриптах Gothic.src. Элементов может быть и больше, взависимости от реализованных в игре талантов.
MENU_ITEM_TALENT_0_SKILL - MENU_ITEM_TALENT_16_SKILLУровень владения талантом персонажа. Используется индексы массива TXT_TALENTS_SKILLS из файла Text.d. Данный файл расположен в скриптах Gothic.src.
MENU_ITEM_EXPТекущее значение опыта персонажа в окне статистики.
MENU_ITEM_LEVELТекущий уровень персонажа в окне статистики.
MENU_ITEM_LEVEL_NEXTКоличество необходимого опыта для получения следующего уровня в окне статистики.
MENU_ITEM_LEARNКоличество доступных очков обучения в окне статистики.
MENU_ITEM_ATTRIBUTE_1 - MENU_ITEM_ATTRIBUTE_4Атрибуты персонажа в окне статистики.
MENU_ITEM_ARMOR_1 - MENU_ITEM_ARMOR_4Защита персонажа в окне статистики.

Пост автоматически объединён:

 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
var int useWithItem;

а как лучше проверить переменную, на то пустая ли она?

(useWithItem == -1) ?
 
Последнее редактирование:

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.661
Благодарности
2.486
Баллы
380
MW 7, по умолчанию все переменные типа INT равны 0, если им не задано значение.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Приветствую всех.
Подскажите, пожалуйста, возможно ли стандартными средствами добавить в игру зелье, типа зелья ускорения, временно добавляющее герою ATR_TempBonus[ATR_STRENGTH] = 60 ед.?
Если да, то какие есть варианты, чтобы применения подобного "эликсира" можно было увязать с использованием оружия, на которое ГГ не хватает характеристик? Возможно ли, например, прописать автоматическое "убирание в ножны", чтобы по истечению времени действия эликсира оружие автоматически "снималось", как при снятии колец/амулетов и т.п., добавляющих ATR_TempBonus[ATR_STRENGTH]?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Подскажите, пожалуйста, возможно ли стандартными средствами добавить в игру зелье, типа зелья ускорения, временно добавляющее герою ATR_TempBonus[ATR_STRENGTH] = 60 ед.?

Возможно ли, например, прописать автоматическое "убирание в ножны", чтобы по истечению времени действия эликсира оружие автоматически "снималось
по "истечению времени" вызывается функция, которая:
а) берёт экипированное оружие
б) смотреть что оно требует(силу/ловкость)
в) сравнивает требования оружие с атрибутами героя
г) совершает какое то действие(выбрасывает оружие или убирает в ножны или что то там еще)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Разве в игре вообще есть такое? Я имею в виду именно "выбрасывание на землю" оружия, которое ГГ только что держал в руках?
externen Funktionen (немецкое) World of Gothic - Mods - Externe Gothic 2 Funktionen
перевод https://worldofplayers.ru/threads/37749/post-782650

может быть штатная функция работать будет.
Daedalus:
//////////////////////////////////////////////////////////////////////////
//    B_DropWeapon
//    =============
//    LдЯt die derzeit gezogene Waffe fallen. Wenn keine gezogen ist,
//    passiert nichts.
//////////////////////////////////////////////////////////////////////////
func void B_DropWeapon(var C_NPC slf)
{
    PrintDebugNpc        (PD_ZS_DETAIL,    "B_DropWeapon");   

    var C_ITEM    itm;
    var int        itemid;

    itm = Npc_GetReadiedWeapon(slf);
    if (Hlp_IsValidItem(itm))
    {
        itemid = Hlp_GetInstanceID(itm);
        PrintDebugNpc    (PD_ZS_DETAIL,    itm.name);
        AI_DropItem        (slf,    itemid);
    };
};
 
Последнее редактирование:

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
KirTheSeeker, без Юниона и расширителей разве что через триггер-скрипт можно сделать счетчики длительностей, но триггер придется еще и внутри локации прописывать.

Снятие оружия при несовпадении требований делается на коленке в стандартных скриптах.
Может чуть коряво, но должно работать под все случаи обычных скриптов
Daedalus:
func void B_HeroWrongStr()
{
    var C_Item HeroRW;
    var C_Item HeroMW;
    if(Npc_IsInFightMode(hero,FMODE_FAR))
    {
        HeroRW = Npc_GetReadiedWeapon(hero);
    }
    else if(Npc_HasEquippedRangedWeapon(hero))
    {
        HeroRW = Npc_GetEquippedRangedWeapon(hero);
    };
    if(Npc_IsInFightMode(hero,FMODE_MELEE))
    {
        HeroMW = Npc_GetReadiedWeapon(hero);
    }
    else if(Npc_HasEquippedMeleeWeapon(hero))
    {
        HeroMW = Npc_GetEquippedMeleeWeapon(hero);
    };
    if(((HeroRW.cond_atr[1] == ATR_STRENGTH) && (HeroRW.cond_value[1] > hero.attribute[ATR_STRENGTH]))
    || ((HeroRW.cond_atr[2] == ATR_STRENGTH) && (HeroRW.cond_value[2] > hero.attribute[ATR_STRENGTH])))
    {
        if(Npc_IsInFightMode(hero,FMODE_FAR))
        {
            Npc_ClearAIQueue(hero);
            AI_RemoveWeapon(hero);
        };
        AI_UnequipWeapons(hero);
    };
    if(((HeroMW.cond_atr[1] == ATR_STRENGTH) && (HeroMW.cond_value[1] > hero.attribute[ATR_STRENGTH]))
    || ((HeroMW.cond_atr[2] == ATR_STRENGTH) && (HeroMW.cond_value[2] > hero.attribute[ATR_STRENGTH])))
    {
        if(Npc_IsInFightMode(hero,FMODE_MELEE))
        {
            Npc_ClearAIQueue(hero);
            AI_RemoveWeapon(hero);
        };
        AI_UnequipWeapons(hero);
    };
};

Эту функцию нужно всунуть после окончания эффекта зелья и отминусовки временной силы.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.410
Благодарности
3.241
Баллы
525
Будет деэкипировано и оружие ближнего боя, и оружие дальнего боя, если оно экипировано. Возможно, правильнее будет, получив ссылку на оружие, которое нужно деэкипировать, удалить его, создав в инвентаре новый экземпляр. Это, если оружие не находится в руках. А если оно в руках, то лучше будет выглядеть, наверное, сброс его на землю. :oops:
 

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
ElderGamer, это да, отдельных функций на деэкипировку конкретного вида оружия Пираньи не завезли.

Сброс на землю я пробовал. С позиции игрока - это крайне бестолковая и раздражающая вещь. Не в плане реализации, визуальной красоты и тд, а именно для игрового процесса, особенно во время боя.
Да чего уж, там даже деэкипировка сильно напрягает и заставляет отказаться от подобного зелья)
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.931
Благодарности
560
Баллы
275
Да чего уж, там даже деэкипировка сильно напрягает и заставляет отказаться от подобного зелья)
Но это только если применять зелье для использования оружия до которого ГГ ещё "не дорос". Впрочем, именно такое применение и кажется наиболее выгодным.
 

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
KirTheSeeker, у меня аналог такого зелья используется для вымогательства (это типа воровства, но для силачей).
Вот в подобном, не боевом варианте - как раз и уместна проверка со снятием оружия. Иначе игроки будут абузить шмотки, одетые за счет временно-повышенной силы, так как сами по себе они не снимаются.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
появился ли какой то более прогрессивный способ работы с массивами?

Daedalus:
// ****************
// Alchemie-Talente
// ****************
/*
const int POTION_Health_01                  = 0;
const int POTION_Health_02              = 1;
const int POTION_Health_03              = 2;
const int POTION_Mana_01                  = 3;
const int POTION_Mana_02                  = 4;
const int POTION_Mana_03                  = 5;
const int POTION_Speed                  = 6;
const int POTION_Perm_STR                  = 7;
const int POTION_Perm_DEX                  = 8;
const int POTION_Perm_Mana              = 9;
const int POTION_Perm_Health            = 10;
const int POTION_MegaDrink                = 11;
const int CHARGE_Innoseye                = 12;
const int POTION_Mana_04                = 13;
const int POTION_Health_04                = 14;

const int MAX_POTION                    = 15;

var int PLAYER_TALENT_ALCHEMY[MAX_POTION];
*/

func void B_Hero_TALENT_ALCHEMY(var int int1)
{
    if      (int1 == 0)     { PLAYER_TALENT_ALCHEMY[0]  = TRUE; }
    else if (int1 == 1)     { PLAYER_TALENT_ALCHEMY[1]  = TRUE; }
    else if (int1 == 2)     { PLAYER_TALENT_ALCHEMY[2]  = TRUE; }
    else if (int1 == 3)     { PLAYER_TALENT_ALCHEMY[3]  = TRUE; }
    else if (int1 == 4)     { PLAYER_TALENT_ALCHEMY[4]  = TRUE; }
    else if (int1 == 5)     { PLAYER_TALENT_ALCHEMY[5]  = TRUE; }
    else if (int1 == 6)     { PLAYER_TALENT_ALCHEMY[6]  = TRUE; }
    else if (int1 == 7)     { PLAYER_TALENT_ALCHEMY[7]  = TRUE; }
    else if (int1 == 8)     { PLAYER_TALENT_ALCHEMY[8]  = TRUE; }
    else if (int1 == 9)     { PLAYER_TALENT_ALCHEMY[9]  = TRUE; }
    else if (int1 == 10)    { PLAYER_TALENT_ALCHEMY[10] = TRUE; }
    else if (int1 == 11)    { PLAYER_TALENT_ALCHEMY[11] = TRUE; }
    else if (int1 == 12)    { PLAYER_TALENT_ALCHEMY[12] = TRUE; }
    else if (int1 == 13)    { PLAYER_TALENT_ALCHEMY[13] = TRUE; }
    else if (int1 == 14)    { PLAYER_TALENT_ALCHEMY[14] = TRUE; };
};
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
то есть это как то в две строчки можно сделать?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.086
Благодарности
1.909
Баллы
320
то есть это как то в две строчки можно сделать?
Ну да. Должно быть что-то типа такого:
Daedalus:
var int parserID;
parserID = Par_GetParserID("Game");
var int symbolID;
symbolID = Par_GetSymbolID(parserID, "PLAYER_TALENT_ALCHEMY");
Par_SetSymbolValueInt(True, parserID, symbolID, int1);

Можно более короткие функции работы с целочисленными массивами написать, на основе этих.
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
2.011
Благодарности
981
Баллы
295
Можно более короткие функции работы с целочисленными массивами написать, на основе этих.
так?
Daedalus:
func void B_UnionHeroTalent(var string TalentName, var int Talent, var int value)
{ 
     // версия на юнион
    var int parserID;   parserID  = Par_GetParserID("Game");
    var int symbolID;   symbolID = Par_GetSymbolID(parserID , TalentName);

    Par_SetSymbolValueInt(value, parserID , symbolID, Talent);
};
Daedalus:
    B_UnionHeroTalent("PLAYER_TALENT_ALCHEMY",          POTION_HEALTH_01,   true);
    B_UnionHeroTalent("PLAYER_TALENT_RUNES",            SPL_Firerain,       true);
    B_UnionHeroTalent("PLAYER_TALENT_TAKEANIMALTROPHY", TROPHY_Claws,       true);
 
Сверху Снизу