(30.05.2017 21:13)Algor Wrote: Странно, вообще, когда водишь курсором по карте он же показывает кол-во дней радом с курсором-коняшкой (изменяется курсор). Т.е. функция расчета вызывается постоянно. А результат, я думаю, устроит даже если он будет в днях.
Странно или не странно, но функции таковой нет, и в функции движении коняшко тоже.
Показать кусок кода? Проследи в нем, как вычисляются "v71 + v62" (они в конце этой функции).
Даже третью часть этой маеты переписывать на ERM лично у меня совершенно нет желания.
signed int __thiscall sub_0040E2C0(void *this, int a2, int a3)
{ int v3; // esi@1 int v5; // eax@3 int v6; // ebx@3 int v7; // edi@3 int v8; // ecx@4 int v9; // eax@7 signed int v10; // edx@7 int v11; // ebx@7 int v12; // edi@7 int v13; // edx@9 __int16 v14; // ax@9 int v15; // ecx@11 char v16; // al@11 _MainStruct_ *v17; // edx@14 int v18; // ecx@14 char *v19; // eax@16 int v20; // eax@21 _MapItem_ *v21; // eax@21 _TownSetup_ *v22; // eax@22 int v23; // eax@24 int v24; // edi@24 int v25; // ebx@30 int v26; // edx@32 int v27; // eax@36 _MapItem_ *v28; // eax@36 int v29; // eax@40 int v30; // ecx@40 char *v31; // edi@40 int v32; // eax@40 __int16 v33; // dx@44 int v34; // ebx@44 int v35; // eax@45 int v36; // eax@46 _MapItem_ *v37; // eax@46 _TownSetup_ *v38; // eax@47 int v39; // eax@49 int v40; // eax@55 _MapItem_ *v41; // eax@55 int i; // eax@59 int v43; // ecx@59 int v44; // edi@59 int v45; // esi@59 int v46; // edx@60 int v47; // ecx@62 int v48; // ecx@62 int v49; // eax@64 int j; // eax@70 int v51; // ecx@70 int v52; // edx@71 int k; // eax@76 int v54; // ecx@76 int v55; // edx@77 int v56; // eax@80 int v57; // ecx@80 char v58; // al@82 int v59; // eax@83 int v60; // ecx@83 int v61; // eax@87 signed int v62; // eax@89 int v63; // ebx@94 _Hero_ *v64; // eax@95 int v65; // eax@97 int v66; // eax@103 int v67; // ecx@103 char v68; // zf@106 int v69; // ecx@110 int v70; // eax@113 int v71; // ecx@119 int v72; // eax@122 _MouseMan_ *v73; // ecx@122 int v74; // [sp+Ch] [bp-10h]@80 _DWORD v75[2]; // [sp+14h] [bp-8h]@10
v3 = (int)this; if ( !IsThisGamer2((int)PlayerStructPo) ) return sub_0040DE10(v3, a2, (_PlayerSetup_ *)a3); v7 = a2; v6 = a3; v5 = *(_DWORD *)(*(_DWORD *)(v3 + 68) + 80); if ( a2 < *(_WORD *)(v5 + 24) || (v8 = *(_WORD *)(v5 + 26), a2 >= v8 + *(_WORD *)(v5 + 28)) || a3 < v8 || a3 >= v8 + *(_WORD *)(v5 + 30) ) { v73 = pMouseManager; v72 = pMouseManager->CursorCadre; if ( v72 >= 32 && v72 <= 39 ) { sub_0050D700((int)&a2, (int)&a3); if ( a2 >= 0 && a2 < 800 && a3 >= 0 && a3 < 600 && (a2 < 16 || a2 > 784 || a3 < 16 || a3 > 584) ) goto LABEL_134; v73 = pMouseManager; } SetMouseCursor(v73, 0, 1);
LABEL_134: sub_00403010(*(void **)(v3 + 68), v7, v6); return 1; } v10 = ((unsigned __int64)a3 >> 32) & 0x1F; v9 = *(_DWORD *)(v3 + 236); v12 = a2 / 32; v11 = a3 / 32; if ( v9 == a2 / 32 && *(_DWORD *)(v3 + 240) == v11 ) return 1; LOWORD(v9) = *(_WORD *)(v3 + 232); LOWORD(v10) = *(_WORD *)(v3 + 228) << 6; *(_DWORD *)(v3 + 64) = -1; *(_DWORD *)(v3 + 236) = v12; *(_DWORD *)(v3 + 240) = v11; v13 = v9 ^ ((_WORD)v9 ^ (unsigned __int16)(v12 + (v10 >> 6))) & 0x3FF; LOWORD(v9) = *(_WORD *)(v3 + 230); *(_WORD *)(v3 + 232) = v13; v14 = *(_WORD *)(v3 + 234) ^ (*(_WORD *)(v3 + 234) ^ (v11 + (v9 << 6 >> 6))) & 0x3FF; LOWORD(v13) = *(_WORD *)(v3 + 230); *(_WORD *)(v3 + 234) = v14 ^ (v14 ^ (4 * v13 >> 2)) & 0x3C00; if ( !IsOntheMapViewPart(v3 + 232) || (v75[0] = *(_DWORD *)(v3 + 232), !((unsigned __int8)GetVisibleWordByXY( (signed __int16)(LOWORD(v75[0]) << 6) >> 6, (signed __int16)(HIWORD(v75[0]) << 6) >> 6, (signed __int16)(4 * HIWORD(v75[0])) >> 12) & (unsigned __int8)PlayerNumBit)) || ((v75[0] = *(_DWORD *)(v3 + 232), v16 = IsOntheMapViewPart((int)v75), v15 = *(_DWORD *)(v3 + 92), v16) ? (a2 = GetMapItemPoByXY(v15, (signed __int16)(LOWORD(v75[0]) << 6) >> 6, (signed __int16)(HIWORD(v75[0]) << 6) >> 6, (signed __int16)(4 * HIWORD(v75[0])) >> 12)) : (a2 = *(_DWORD *)(v15 + 208)), (FindHint4MapObject(v3, v11, v12, v3, a2, v12, v11), v18 = PlayerStructPo->ActiveHero, v17 = Main_Structure, v18 != -1) && (v18 != -1 ? (v19 = (char *)&Main_Structure->Heroes[v18]) : (v19 = 0), *((_WORD *)v19 + 2) != (signed __int16)(4 * *(_WORD *)(v3 + 234)) >> 12)) ) goto NotThisMapLevel; if ( v18 == -1 ) { if ( *(_DWORD *)(a2 + 30) == 98 ) { v21 = sub_004FD0F0((_MapItem_ *)a2); v20 = GetRealSetupDwordOfMapItem(v21); v17 = Main_Structure; if ( v20 == -1 ) v22 = 0; else v22 = &Main_Structure->Towns[v20]; v23 = v22->Owner; v24 = CurrentPlayer; if ( v23 >= 0 && CurrentPlayer >= 0 && Main_Structure->Map.PlayerTeam[v23] == Main_Structure->Map.PlayerTeam[CurrentPlayer] || *(_BYTE *)(v3 + 61) ) { SetMouseCursor(pMouseManager, 3, 1); *(_DWORD *)(v3 + 64) = 3; return 1; } } else { v24 = CurrentPlayer; } v25 = *(_DWORD *)(a2 + 30); if ( v25 != 34 || (*(_DWORD *)a2 != -1 ? (v26 = (int)&v17->Heroes[*(_DWORD *)a2]) : (v26 = 0), *(_BYTE *)(v26 + 34) != v24) ) { if ( v25 == 87 ) { v28 = sub_004FD0F0((_MapItem_ *)a2); v27 = GetRealSetupDwordOfMapItem(v28) << 24 >> 24; if ( v27 >= 0 ) { if ( CurrentPlayer >= 0 && Main_Structure->Map.PlayerTeam[v27] == Main_Structure->Map.PlayerTeam[CurrentPlayer] ) {
LABEL_58: SetMouseCursor(pMouseManager, 6, 1); *(_DWORD *)(v3 + 64) = 8; return 1; } } } goto NotThisMapLevel; }
IsOwnerOfHero: SetMouseCursor(pMouseManager, 2, 1); *(_DWORD *)(v3 + 64) = 2; return 1; } v30 = 585 * v18; v31 = (char *)Main_Structure->Heroes + 2 * v30; v32 = *(_DWORD *)((char *)v75 + 2) ^ (HIWORD(v75[0]) ^ *(&Main_Structure->Heroes[0].y + v30)) & 0x3FF; BYTE1(v32) &= 0xC3u; v29 = ((*((_BYTE *)&Main_Structure->Heroes[0].l + 2 * v30) & 0xF) << 10) | v32; if ( !(((unsigned __int16)((*(_WORD *)v31 ^ LOWORD(v75[0])) & 0x3FF ^ LOWORD(v75[0])) ^ *(_WORD *)(v3 + 232)) & 0x3FF) && !(((_WORD)v29 ^ *(_WORD *)(v3 + 234)) & 0x3FF) && !(((_WORD)v29 ^ *(_WORD *)(v3 + 234)) & 0x3C00) ) goto IsOwnerOfHero; v34 = a2; v33 = *(_WORD *)(a2 + 12); if ( HIBYTE(v33) & 1 ) { v35 = *(_DWORD *)(a2 + 30); if ( v35 == 98 ) { v37 = sub_004FD0F0((_MapItem_ *)a2); v36 = GetRealSetupDwordOfMapItem(v37); if ( v36 == -1 ) v38 = 0; else v38 = &Main_Structure->Towns[v36]; v39 = v38->Owner; if ( v39 >= 0 && CurrentPlayer >= 0 && Main_Structure->Map.PlayerTeam[v39] == Main_Structure->Map.PlayerTeam[CurrentPlayer] || *(_BYTE *)(v3 + 61) ) { SetMouseCursor(pMouseManager, 3, 1); *(_DWORD *)(v3 + 64) = 5; return 1; } } else { if ( v35 == 87 ) { v41 = sub_004FD0F0((_MapItem_ *)a2); v40 = GetRealSetupDwordOfMapItem(v41) << 24 >> 24; if ( v40 >= 0 ) { if ( CurrentPlayer >= 0 && Main_Structure->Map.PlayerTeam[v40] == Main_Structure->Map.PlayerTeam[CurrentPlayer] ) goto LABEL_58; } } } v44 = AccessableSquaresStruct + 72; v43 = *(_DWORD *)(AccessableSquaresStruct + 80); v45 = *(_DWORD *)(AccessableSquaresStruct + 76); for ( i = v43; i != v43; v45 += 4 ) { v46 = *(_DWORD *)i; i += 4; *(_DWORD *)v45 = v46; } goto LABEL_78; } v48 = *(int *)((char *)&Main_Structure->Heroes[0].TempMod + 2 * v30); v47 = v48 & 0x40000; if ( !v47 ) { if ( *(_BYTE *)(a2 + 4) == 8 ) { v49 = *(_DWORD *)(a2 + 30); if ( v49 != 34 || !(HIBYTE(v33) & 0x10) ) { if ( (v49 != 8 || !(HIBYTE(v33) & 0x10)) && (v49 != 85 || !(HIBYTE(v33) & 0x10)) ) { v44 = AccessableSquaresStruct + 72; v51 = *(_DWORD *)(AccessableSquaresStruct + 80); v45 = *(_DWORD *)(AccessableSquaresStruct + 76); for ( j = v51; j != v51; v45 += 4 ) { v52 = *(_DWORD *)j; j += 4; *(_DWORD *)v45 = v52; }
LABEL_78: nullsub_4(v45, *(_DWORD *)(v44 + 8)); *(_DWORD *)(v44 + 8) = v45;
NotThisMapLevel: SetMouseCursor(pMouseManager, 0, 1); return 1; } } } } if ( v47 && *(_BYTE *)(a2 + 4) != 8 && *(_DWORD *)(a2 + 30) != 3 ) { v44 = AccessableSquaresStruct + 72; v54 = *(_DWORD *)(AccessableSquaresStruct + 80); v45 = *(_DWORD *)(AccessableSquaresStruct + 76); for ( k = v54; k != v54; v45 += 4 ) { v55 = *(_DWORD *)k; k += 4; *(_DWORD *)v45 = v55; } goto LABEL_78; } sub_00419400((void *)v3, *(_DWORD *)(v3 + 232)); v56 = *(_DWORD *)(v3 + 232); v74 = *(_DWORD *)(v3 + 232); a2 = *(_DWORD *)(AccessableSquaresStruct + 36); v57 = a2; if ( a2 ) v57 = a2 + 30 * (((signed __int16)((_WORD)v56 << 6) >> 6) + MapSizeX * (((signed __int16)(HIWORD(v74) << 6) >> 6) + 2 * MapSizeY * ((signed __int16)(4 * HIWORD(v74)) >> 12))); v58 = *(_BYTE *)(v57 + 4); a3 = 0; if ( v58 & 1 ) { v59 = *(_WORD *)(v57 + 24); v60 = *(_DWORD *)(v31 + 77); // очки хода героя if ( v59 > v60 ) { a2 = (v59 - v60 - 1) / *(_DWORD *)(v31 + 73) + 1; if ( a2 > 3 ) a2 = 3; } else { a2 = 0; } v61 = a2; *(_DWORD *)(v3 + 64) = 1; a3 = 6 * v61; switch ( *(_DWORD *)(v34 + 30) ) { case 8: if ( *(_DWORD *)(v3 + 496) == 8 ) { v62 = 0; *(_DWORD *)(v3 + 64) = -1; } else { v62 = 6; *(_DWORD *)(v3 + 64) = 1; } break; case 3: if ( *(_DWORD *)(v3 + 496) != 8 ) goto LABEL_93; v62 = 7; break; default: goto LABEL_93; case 34: v63 = *(_DWORD *)v34; if ( v63 == -1 ) v64 = 0; else v64 = &Main_Structure->Heroes[v63]; v65 = v64->Owner; if ( v65 < 0 || CurrentPlayer < 0 || Main_Structure->Map.PlayerTeam[v65] != Main_Structure->Map.PlayerTeam[CurrentPlayer] ) goto LABEL_100; v62 = 8; *(_DWORD *)(v3 + 64) = 1; break; case 54:
LABEL_100: v62 = 5; break; case 33: if ( !(*(_BYTE *)(v34 + 13) & 0x10) || (v66 = (*(_DWORD *)v34 << 6) + Main_Structure->Garrisons, v67 = *(_BYTE *)v66, v67 >= 0) && CurrentPlayer >= 0 && Main_Structure->Map.PlayerTeam[v67] == Main_Structure->Map.PlayerTeam[CurrentPlayer] ) goto LABEL_93; v68 = HasObjectGuards((_MonArr_ *)(v66 + 4)) == 0; goto LABEL_107; case 98: if ( *(_DWORD *)v34 == -1 ) v69 = 0; else v69 = (int)&Main_Structure->Towns[*(_DWORD *)v34]; if ( !(*(_BYTE *)(v34 + 13) & 0x10) || (v70 = *(_BYTE *)(v69 + 1), v70 >= 0) && CurrentPlayer >= 0 && Main_Structure->Map.PlayerTeam[v70] == Main_Structure->Map.PlayerTeam[CurrentPlayer] ) goto LABEL_93; v68 = sub_005BE3E0(v69) == 0; // есть ли охрана объекта
LABEL_107: if ( v68 )
LABEL_93: v62 = CheckForWMinVisibleMap(v3, v34);// тип курсора else v62 = 5; break; } } else { v62 = 0; } if ( *(_DWORD *)(v3 + 496) != 8 || (v71 = a2, v62 != 28) ) v71 = a3; // прибавка, которая как раз и ставит правильное смещение в кадрах дефа курсора (считай т.н. дни) SetMouseCursor(pMouseManager, v71 + v62, 1); // создание курсора-коняшки return 1;
}
game bug fixes extended.dll || My Plugins || My GitHub
|