#include "stdafx.h"
#include "MiniMap.h"
#include "TMemory.h"
#include "Interface.h"
// Buffers -> Using this method.. is not necesary mov esi, 0x00XXX or: mov edi, //0x00XX and prevents.. possible problems with information registers
DWORD LoadImg1 = 0x007721E0;
DWORD LoadMap1 = 0x00860FC0;
DWORD LoadMap2 = 0x008615F0;
DWORD LoadMap3 = 0x00886C20;
DWORD LoadMap4 = 0x004E65C0;
MiniMap gMiniMap; //Small MiniMap Class Initialization (Only for: Hook Main Function)
bool IsValidMap(int MapId)
{
char FullMapName[200];
sprintf_s(FullMapName, "World%d\\Map1.jpg", MapId + 1);
struct stat buffer;
if (stat(FullMapName, &buffer)) // -> On this way Minimap not have crashs on Event Maps... xD
{
switch (MapId)
{
case 0: return true;//Lorencia
case 1: return true;//Dungeon
case 2: return true;//Devias
case 3: return true;//Noria
case 4: return true;//LostTower
case 6: return true;//Stadium
case 7: return true;//Atlans
case 8: return true;//Tarkan
case 10: return true;//Icarus
case 24: return true;//Kalima 1
case 25: return true;//Kalima 2
case 26: return true;//Kalima 3
case 27: return true;//Kalima 4
case 28: return true;//Kalima 5
case 29: return true;//Kalima 6
case 30: return true;//Valley of Loren
case 31: return true;//Land of Trials
case 33: return true;//Aida
case 34: return true;//Crywolf
case 36: return true;//Kanturu 1
case 37: return true;//Kanturu 2
case 38: return true;//Kanturu 3
case 42: return true;//Barracks
case 51: return true;//Elbeland
case 56: return true;//Swamp of Calmness
case 57: return true;//Raklion
case 58: return true;//Raklion Boss
case 63: return true;//Vulcanus
case 80: return true;//Kalrutan 1
case 81: return true;//Kalrutan 2
// Invalid MiniMap
default: return false;
}
}
return false;
}
void LoadImageJpgForMap(char* ImagePatch, DWORD PrintCode)
{
_asm
{
PUSH 0
PUSH 1
PUSH 0x2900
PUSH 0x2601
PUSH 0x7B7A
PUSH ImagePatch
CALL LoadImg1 // -> Here is not used: mov edi and anothers

instructions to memory is only direct CALL to Main Offset :D:
ADD ESP,0x18
}
}
int LoadMap(int Map)
{
char FullMapName[200];
sprintf(FullMapName, "World%d\\Map1.jpg", Map + 1);
ChangePath(FullMapName);
LoadImageJpgForMap(FullMapName, 0x7B7A);
return Map;
}
void ChangePath(const char* Map)
{
memset((DWORD*)0xD4A654, 0, 19);
memcpy((DWORD*)0xD4A654, Map, 17);
}
bool MapCheckerCore1(int Map)
{
if (IsValidMap(Map))
{
return 1;
}
return 0;
}
void MapCheckerCore2(int Map)
{
if (IsValidMap(Map))
{
LoadMap(Map);
_asm
{
CALL LoadMap1
MOV ECX, EAX
CALL LoadMap2
MOV ECX, EAX
CALL LoadMap3
}
}
_asm
{
PUSH Map
CALL LoadMap4 // -> Here on: 1.04d main.exe is not necesary POP EBP instruction.. I don't know why ^^ I like think that is by call convention type (__cdecl or __stdcall on original main function).
}
}
#define oMapCheckerHook1 0x007D3B6D
#define oMapCheckerHook2 0x00886B87
#define oMapCheckerHook3 0x0062EB3D
//--------------------------------------------------------------------------------------------
// Cool Info ^^
//--------------------------------------------------------------------------------------------
#define oMiniMapKeyPushOffset 0x007D3B55 //0x09 = TAB - 0x10 = SHIFT
#define oMiniMapKeyCallOffset 0x007D3B6D //This call must be hook to MapCheckerCore1 proc
// -------------------------------------------------------------------------------------------
#define oScreenMapKeyOffset 0x007D3BA5 //0x09 = TAB - 0x10 = SHIFT
void MiniMap::Load()
{
SetOp((LPVOID)oMapCheckerHook1, (LPVOID)MapCheckerCore1, ASM::CALL);
SetOp((LPVOID)oMapCheckerHook2, (LPVOID)MapCheckerCore1, ASM::CALL);
SetOp((LPVOID)oMapCheckerHook3, (LPVOID)MapCheckerCore2, ASM::CALL);
}