| 
 
				 (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
 |