Ta funkcja zwróci ci "1" jak masz otworzony ekwipunek, ale wlicza się w to także np. otworzenie skrzyni, handel czy przeszukiwanie pobitego/martwego NPC. Jeśli chcesz, żeby funkcja zwracała ci "1" tylko, jeśli ręcznie otworzyłeś ekwipunek (czyli z wyłączeniem wymienionych wyżej przypadków) to możesz to zrobić np. tak:
Najpierw definiujesz nową funkcję, która wydobywa, a potem przelicza znacznik (?) przycisku z systemu szesnastkowego na dziesiętny:
func int ReadKeyFromIni (var string KeyName, var int KeyNameIndex)
{
var string str; str = MEM_GetGothOpt ("KEYS", KeyName);
var int buf; var int index;
buf = STR_toChar(str);
var int res; res = 0;
var int chr;
if (KeyNameIndex == 1)
{
index = 0;
var int loopStart1; loopStart1 = MEM_StackPos.position;
if (index < 2)
{
chr = MEM_ReadInt (buf + index) & 255;
if ((chr >= 48 /*0*/ ) && (chr <= 57 /*9*/ ))
{
res = res * 16 + (chr - 48);
}
else if ((chr == 97 /*a*/) || (chr == 65 /*A*/))
{
res = res * 16 + 10;
}
else if ((chr == 98 /*b*/) || (chr == 66 /*B*/))
{
res = res * 16 + 11;
}
else if ((chr == 99 /*c*/) || (chr == 67 /*C*/))
{
res = res * 16 + 12;
}
else if ((chr == 100 /*d*/) || (chr == 68 /*D*/))
{
res = res * 16 + 13;
}
else if ((chr == 101 /*e*/) || (chr == 69 /*E*/))
{
res = res * 16 + 14;
}
else if ((chr == 102 /*f*/) || (chr == 70 /*F*/))
{
res = res * 16 + 15;
}
else
{
MEM_Warn (ConcatStrings ("STR_ToInt: cannot convert string: ", str));
return 0;
};
index += 1;
MEM_StackPos.position = loopStart1;
};
}
else if (KeyNameIndex == 2)
{
index = 4;
var int loopStart2; loopStart2 = MEM_StackPos.position;
if (index < 6)
{
chr = MEM_ReadInt (buf + index) & 255;
if ((chr >= 48 /*0*/ ) && (chr <= 57 /*9*/ ))
{
res = res * 16 + (chr - 48);
}
else if ((chr == 97 /*a*/) || (chr == 65 /*A*/))
{
res = res * 16 + 10;
}
else if ((chr == 98 /*b*/) || (chr == 66 /*B*/))
{
res = res * 16 + 11;
}
else if ((chr == 99 /*c*/) || (chr == 67 /*C*/))
{
res = res * 16 + 12;
}
else if ((chr == 100 /*d*/) || (chr == 68 /*D*/))
{
res = res * 16 + 13;
}
else if ((chr == 101 /*e*/) || (chr == 69 /*E*/))
{
res = res * 16 + 14;
}
else if ((chr == 102 /*f*/) || (chr == 70 /*F*/))
{
res = res * 16 + 15;
}
else
{
MEM_Warn (ConcatStrings ("STR_ToInt: cannot convert string: ", str));
return 0;
};
index += 1;
MEM_StackPos.position = loopStart2;
};
};
return res;
};
Najlepiej zdefiniować ją w jakimś osobnym pliku i wpisać do gothic.src pod
AI\AI_INTERN\AI_CONSTANTS.D
_INTERN\IKARUS_CONST_G2.D
_INTERN\ENGINECLASSES_G2\*.D
_INTERN\IKARUS.D
_INTERN\float.D
Teraz tworzysz nową funkcję, która będzie wydobywać z gothic.ini jakie przyciski masz przypisane pod ekwipunek i sprawdzać, czy otworzyłeś go ręcznie:
var int IsInventoryOpenedManually;
func void IsInventoryOpened()
{
var int KeyInventory1; KeyInventory1 = ReadKeyFromIni ("keyInventory", 1);
var int KeyInventory2; KeyInventory2 = ReadKeyFromIni ("keyInventory", 2);
var int IsInventoryKeyPressed;
if (IsInventoryOpenedManually == 1)
{
var oCNpc her; her = Hlp_GetNpc(hero);
var int inv; inv = _@(her.inventory2_vtbl);
const int call = 0;
if (CALL_Begin(call))
{
CALL_PutRetValTo(_@(ret));
CALL__thiscall(_@(inv), 7377408);
call = CALL_End();
};
var int ret;
if (ret == 0)
{
IsInventoryOpenedManually = 0;
};
};
if ((Npc_GetBodyState(hero) == BS_INVENTORY)
&& (IsInventoryKeyPressed == 1))
{
IsInventoryOpenedManually = 1;
};
IsInventoryKeyPressed = 0;
if (((MEM_KeyState(KeyInventory1) == KEY_PRESSED)
|| (MEM_KeyState(KeyInventory2) == KEY_PRESSED))
&& ((Npc_GetBodyState(hero) == BS_STAND)
|| (Npc_GetBodyState(hero) == BS_RUN))
&& (Is_Dialogue_Active == FALSE))
{
IsInventoryKeyPressed = 1;
};
};
Tą funkcję podpinasz pod FrameFunction i inicjujesz co klatkę. Masz teraz zmienną "IsInventoryOpenedManually", która określa ci, czy ekwipunek jest otwarty (ręcznie). "Is_Dialogue_Active" to zmienna która mówi, czy postać prowadzi rozmowę. Nie wiedziałem jak ma wyglądać warunek który to określa, więc w "ZS_Talk" wsadziłem zmienną która daje TRUE jak postać prowadzi rozmowę i działa.
Pewnie da się to zrobić prościej ale ja nie umiem bo dopiero miesiąc się z Ikarusem bawię z czego 3 tygodnie męczyłem się z tym dokładnie problemem, a nigdzie tego nie znalazłem.