Nie wydaje mnie się. Tak było na tibianicu/medivii, ale tam dużo rzeczy działało nie tak, jak powinno.
Ale mogę to sprawdzić.
E: no więc, trochę prawda, a trochę nieprawda...
Zakładając, że dekompilator nie wytworzył tu nic z kosmosu - to można było siochać, gdy target był za ekranem, ale tylko, gdy było to kratkę za ekranem w prawo lub kratkę za ekranem na południe. Jeżeli był kratkę za ekranem po lewej, lub od północy, to się nie dało.
Odpowiedzialne za to są te zaznaczone linie:
Kod:
// disasm -- show blocks -- show stats
void HealFriend(TCreature* cr, char* Name, int Mana, int SoulPoints, int Healing)
{// addr = 0x08084D90 -- defined in 'magic.c' at line 1796
int __eax; // r0
TSkill* __edx; // r3
struct Object _v28; // _cfa_ffffffe4
TPlayer* pl; // _cfa_ffffffe0
_unknown_ _v56; // _cfa_ffffffc8 (outparam)
_unknown_ _v60; // _cfa_ffffffc4 (outparam)
_unknown_ _v64; // _cfa_ffffffc0 (outparam)
_unknown_ _v68; // _cfa_ffffffbc (outparam)
intOrPtr _v72; // _cfa_ffffffb8 (outparam)
_unknown_ __ebx; // r1
TCreature* __esi; // r5
void* _t43; // _t43
int _t44; // _t44
signed int _t47; // _t47
signed int _t50; // _t50
struct TSkill* _t66; // _t66
TPlayer* _t70; // _t70
char* _t72; // _t72
TPlayer* _t74; // _t74
__esi = cr;
_t72 = Name;
if(__esi == L00000000) {
*__esp = 135249216;
L15:
error();
_t43 = __cxa_allocate_exception(4);
*_t43 = -1;
L13:
__cxa_throw(_t43, &_ZTI6RESULT, L00000000);
}
if(_t72 == L00000000) {
*__esp = 135249152;
goto L15;
}
_t44 = IdentifyPlayer(_t72, L00000000, 1, &pl);
if(_t44 == -1) {
L12:
_t43 = __cxa_allocate_exception(4);
*_t43 = 27;
goto L13;
}
if(_t44 == -2) {
_t43 = __cxa_allocate_exception(4);
*_t43 = 28;
goto L13;
}
_t70 = pl;
if(__esi->posz != _t70->posz) {
L16:
_t43 = __cxa_allocate_exception(4);
*_t43 = 5;
goto L13;
}
_t47 = __esi->posx - _t70->posx;
_t48 = _t47 - -1 <= 0 ? ~_t47 : _t47;
_t81 = (_t47 - -1 <= 0 ? ~_t47 : _t47) - 7;
if((_t47 - -1 <= 0 ? ~_t47 : _t47) > 7) {
goto L16;
}
_t50 = __esi->posy - _t70->posy;
_t51 = _t50 - -1 <= 0 ? ~_t50 : _t50;
_t83 = (_t50 - -1 <= 0 ? ~_t50 : _t50) - 5;
if((_t50 - -1 <= 0 ? ~_t50 : _t50) > 5) {
goto L16;
}
_t66 = _t70->Skills[3];
if(_t66 == L00000000) {
*__esp = "HealFriend: Skill HITPOINTS existiert nicht.\n";
goto L15;
}
if(TSkill::Get(_t66) <= L00000000) {
goto L12;
}
CheckMana(__esi, Mana, SoulPoints, 1000);
TSkill::Change(_t66, Healing);
_t74 = pl;
if(_t74->Skills[5]->MDAct < L00000000) {
TSkillBase::SetTimer( &(_t74->Skills[1]), 4, L00000000, L00000000, L00000000, -1);
}
_v72 = 13;
_v28 = __esi->CrObject;
*__esp = &_v28;
GraphicalEffect();
*__esp = &_v28;
_v72 = 15;
_v28 = pl->CrObject;
GraphicalEffect();
}
Są normalnie warunki > 7 dla osi X oraz > 5 dla osi Y, żeby rozpoznać czy target jest za ekranem. Tylko ktoś użył negacji bitowej zamiast arytmetycznej (dla wartości bezwzględnej), czego efekt jest taki, jak napisałem wyżej. Prawdopodobnie błąd programisty cipsoftu, a intencją było, żeby target musiał znajdować się na ekranie.