nMenu

02/02/2023 18:33 incisozluk10#1
Can some1 give me some clues to how to edit nMenu? I can change NPC's nMenu via webtool yes but I want to create my own nMenu. Something like NPC special TRADE section or MOVE section.

I really couldnt figure out how to connect the codes with nMenu. Just have found,

int nMenu[100]; somthing like this.


:handsdown:
02/03/2023 11:26 migisenpai#2
Code:
BOOL NPCUI::LBUTTONDOWN(int mX, int mY)
{
	if(!mActive)
		return FALSE;
	switch(uWorkId)
	{
	case xx:
		YOUR_NPC_FUNCTION_LBUTTONDOWN(mX, mY);
		return TRUE;
	}
}

BOOL NPCUI::LBUTTONUP(int mX, int mY)
{
	if(!mActive)
		return FALSE; 
	switch(uWorkId)
	{
	case xx:
		YOUR_NPC_FUNCTION_LBUTTONUP(mX, mY);
		return TRUE;
	}
}

void NPCUI::Draw(int mX, int mY)
{
	if(!mActive)
		return;
	switch(uWorkId)
	{
	case xx:
		YOUR_NPC_DRAW_FUNCTION(mX, mY);
		return;
	}
}
02/04/2023 21:07 incisozluk10#3
Quote:
Originally Posted by migisenpai View Post
Code:
BOOL NPCUI::LBUTTONDOWN(int mX, int mY)
{
	if(!mActive)
		return FALSE;
	switch(uWorkId)
	{
	case xx:
		YOUR_NPC_FUNCTION_LBUTTONDOWN(mX, mY);
		return TRUE;
	}
}

BOOL NPCUI::LBUTTONUP(int mX, int mY)
{
	if(!mActive)
		return FALSE; 
	switch(uWorkId)
	{
	case xx:
		YOUR_NPC_FUNCTION_LBUTTONUP(mX, mY);
		return TRUE;
	}
}

void NPCUI::Draw(int mX, int mY)
{
	if(!mActive)
		return;
	switch(uWorkId)
	{
	case xx:
		YOUR_NPC_DRAW_FUNCTION(mX, mY);
		return;
	}
}

Thank you but that is not what I am looking for. Any idea where is the current nMenu data stored? Like in "005-005.img" ...
02/07/2023 16:22 incisozluk10#4
I think I should look into twelvesky2.exe but i cannot open it with cheatengine it close itself when I open CE. Also cannot dissamble it with IDA because when I try to start a debug it gives "PARAMETER 2" error. Any tips for me to move on?
02/07/2023 19:03 rafi441#5
Quote:
Originally Posted by incisozluk10 View Post
I think I should look into twelvesky2.exe but i cannot open it with cheatengine it close itself when I open CE. Also cannot dissamble it with IDA because when I try to start a debug it gives "PARAMETER 2" error. Any tips for me to move on?
Just drag n drop TwelveSky2.exe to IDA, there is no need to debugging.
02/07/2023 20:17 incisozluk10#6
Quote:
Originally Posted by rafi441 View Post
Just drag n drop TwelveSky2.exe to IDA, there is no need to debugging.
IDA Doesnt show me any useful information or I cant understand the information given. Thanks for the advice :handsdown:

I guess that because of I dont have the PRO version. Its expensive as fak.
02/08/2023 12:06 migisenpai#7
Quote:
Originally Posted by incisozluk10 View Post
Thank you but that is not what I am looking for. Any idea where is the current nMenu data stored? Like in "005-005.img" ...
nMenu is an NPC flag that tells the client whether to allow the menu to be accessible or not via the lish that appears when u interact with an NPC.

You said that you wanted to make your own "NPC menu" is why i suggested the snippet of code from my first comment. But if you just want to see nMenu then by all means you are on track. Unpack 005_00005.IMG and you can see it there.
02/08/2023 16:12 lnwnuyhodd#8
Code:
void NPCUI::InitForClickNPC( NPC_OBJECT *tNPC_INFO )
{
    int i;
    int j;
    int k;
    int m;
    int n;
    int l;
    int v9;

    UI::OffAllSubUI(1);
    self->nInfo = tNPC_INFO->nInfo;
    self->mActive = 1;
    self->nPage[0] = -1;
    self->nPage[1] = -1;
    self->nPage[2] = -1;
    self->nPage[3] = -1;
    self->nPage[4] = -1;
    self->nPage[5] = -1;
    for ( i = 0; i < 100; i++ )
        self->bIsClick[i] = 0;
    for ( j = 0; j < 10; j++ )
        self->mMenuBtn[j] = 0;
    for ( k = 0; k < 6; k++ )
    {
        self->nIndex[k] = 0;
        for ( l = 0; l < 9; l++ )
            self->uInv[k][l] = 0;
    }
    self->mMenuBtn[0] = 1;
    self->mMenuBtn[1] = 2;
    v9 = 2;
    for ( m = 0; m < 100; m++ )
    {
        if ( self->nInfo->nMenu[m] == 2 && v9 <= 8 )
        {
            switch ( m )
            {
                case 0:
                    self->mMenuBtn[v9++] = 4;
                    break;
                case 1:
                    self->mMenuBtn[v9++] = 5;
                    break;
                case 2:
                    self->mMenuBtn[v9++] = 6;
                    break;
                case 3:
                    self->mMenuBtn[v9++] = 7;
                    break;
                case 4:
                    self->mMenuBtn[v9++] = 8;
                    break;
                case 5:
                    self->mMenuBtn[v9++] = 9;
                    break;
                case 6:
                    self->mMenuBtn[v9++] = 10;
                    break;
                case 7:
                    self->mMenuBtn[v9++] = 11;
                    break;
                case 8:
                    self->mMenuBtn[v9++] = 12;
                    break;
                case 9:
                    self->mMenuBtn[v9++] = 13;
                    break;
                case 10:
                    self->mMenuBtn[v9++] = 46;
                    break;
                case 11:
                    self->mMenuBtn[v9++] = 22;
                    break;
                case 12:
                    self->mMenuBtn[v9++] = 15;
                    break;
                case 13:
                    self->mMenuBtn[v9++] = 16;
                    break;
                case 14:
                    self->mMenuBtn[v9++] = 17;
                    break;
                case 15:
                    self->mMenuBtn[v9++] = 41;
                    break;
                case 16:
                    self->mMenuBtn[v9++] = 42;
                    break;
                case 17:
                    self->mMenuBtn[v9++] = 18;
                    break;
                case 18:
                    self->mMenuBtn[v9++] = 14;
                    break;
                case 19:
                    self->mMenuBtn[v9++] = 20;
                    break;
                case 20:
                    self->mMenuBtn[v9++] = 21;
                    break;
                case 21:
                    self->mMenuBtn[v9++] = 47;
                    break;
                case 22:
                    self->mMenuBtn[v9++] = 23;
                    break;
                case 23:
                    self->mMenuBtn[v9++] = 19;
                    break;
                case 24:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 24;
                    ++v9;
                    break;
                case 25:
                    self->mMenuBtn[v9++] = 25;
                    break;
                case 26:
                    self->mMenuBtn[v9++] = 26;
                    break;
                case 27:
                    self->mMenuBtn[v9++] = 27;
                    break;
                case 28:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 28;
                    ++v9;
                    break;
                case 29:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 48;
                    ++v9;
                    break;
                case 30:
                    self->mMenuBtn[v9++] = 29;
                    break;
                case 31:
                    self->mMenuBtn[v9++] = 30;
                    break;
                case 32:
                    self->mMenuBtn[v9++] = 55;
                    break;
                case 33:
                    self->mMenuBtn[v9++] = 40;
                    break;
                case 34:
                    self->mMenuBtn[v9++] = 54;
                    break;
                case 35:
                    self->mMenuBtn[v9++] = 36;
                    break;
                case 36:
                    self->mMenuBtn[v9++] = 33;
                    break;
                case 37:
                    self->mMenuBtn[v9++] = 34;
                    break;
                case 38:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 35;
                    ++v9;
                    break;
                case 39:
                    self->mMenuBtn[v9++] = 37;
                    break;
                case 40:
                    self->mMenuBtn[v9++] = 38;
                    break;
                case 41:
                    self->mMenuBtn[v9++] = 39;
                    break;
                case 42:
                    self->mMenuBtn[v9++] = 43;
                    break;
                case 43:
                    self->mMenuBtn[v9++] = 44;
                    break;
                case 44:
                    self->mMenuBtn[v9++] = 45;
                    break;
                case 45:
                    self->mMenuBtn[v9++] = 49;
                    break;
                case 46:
                    self->mMenuBtn[v9++] = 50;
                    break;
                case 47:
                    self->mMenuBtn[v9++] = 51;
                    break;
                case 48:
                    self->mMenuBtn[v9++] = 52;
                    break;
                case 49:
                    self->mMenuBtn[v9++] = 53;
                    break;
                case 52:
                    self->mMenuBtn[v9++] = 58;
                    break;
                case 53:
                    self->mMenuBtn[v9++] = 59;
                    break;
                case 54:
                    self->mMenuBtn[v9++] = 56;
                    break;
                case 56:
                    self->mMenuBtn[v9++] = 61;
                    break;
                case 57:
                    self->mMenuBtn[v9++] = 62;
                    break;
                case 58:
                    self->mMenuBtn[v9++] = 63;
                    break;
                case 62:
                    self->mMenuBtn[v9++] = 64;
                    break;
                case 65:
                    self->mMenuBtn[v9++] = 66;
                    break;
                case 66:
                    self->mMenuBtn[v9++] = 67;
                    break;
                case 67:
                    self->mMenuBtn[v9++] = 68;
                    break;
                case 68:
                    self->mMenuBtn[v9++] = 69;
                    break;
                case 69:
                    self->mMenuBtn[v9++] = 70;
                    break;
                case 70:
                    self->mMenuBtn[v9++] = 71;
                    break;
                case 71:
                    self->mMenuBtn[v9++] = 72;
                    break;
                case 72:
                    self->mMenuBtn[v9++] = 73;
                    break;
                default:
                    continue;
            }
        }
    }
    self->mMenuBtn[9] = 3;
    self->nWorkIdx = 0;
    for ( n = 0; n < 5; n++ )
        self->nSpeechNum[n] = n >= self->nInfo->nSpeechNum;
    self->nSpeechIndex = -1;
    if ( tNPC_INFO->nAction.aSort != 1 )
    {
        tNPC_INFO->nAction.aSort = 1;
        tNPC_INFO->nAction.aFrame = 0.0f;
        if ( tNPC_INFO->nInfo->nIndex != 63 && tNPC_INFO->nInfo->nIndex != 113 && tNPC_INFO->nInfo->nIndex != 213 && tNPC_INFO->nInfo->nIndex != 313 && tNPC_INFO->nInfo->nIndex != 7 )
            tNPC_INFO->nAction.aFront = UTIL::GetYAngle( tNPC_INFO->nAction.aLocation[0], tNPC_INFO->nAction.aLocation[2], mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[0], mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[2]);
        NPC_OBJECT::PlayActionSound( tNPC_INFO );
    }
}
mMenuBtn[0] = 1; //talk
mMenuBtn[1] = 2; //quest
mMenuBtn[9] = 3; //close menu
... etc

for .IMG
Code:
//int tMenuIndex = self->mMenuBtn[?];
int NPCUI::Init_000( int tMenuIndex )
{
    int result;

    switch ( tMenuIndex )
    {
        case 1:
            result = 408;
            break;
        case 2:
            result = 411;
            break;
        case 3:
            result = 423;
            break;
        case 4:
            result = 468;
            break;
        case 5:
            result = 456;
            break;
        case 6:
            result = 450;
            break;
        case 7:
            result = 447;
            break;
        case 8:
            result = 414;
            break;
        case 9:
            result = 2394;
            break;
        case 10:
            result = 462;
            break;
        case 11:
            result = 417;
            break;
        case 12:
            result = 459;
            break;
        case 13:
            result = 728;
            break;
        case 14:
            result = 3327;
            break;
        case 15:
            result = 746;
            break;
        case 16:
            result = 831;
            break;
        case 17:
            result = 960;
            break;
        case 18:
            result = 976;
            break;
        case 19:
            result = 3330;
            break;
        case 20:
            result = 417;
            break;
        case 21:
            result = 1172;
            break;
        case 22:
            result = 3307;
            break;
        case 23:
            result = 3310;
            break;
        case 24:
            result = 3502;
            break;
        case 25:
            result = 1360;
            break;
        case 26:
            result = 1480;
            break;
        case 27:
            result = 1565;
            break;
        case 28:
            result = 1590;
            break;
        case 29:
            result = 1631;
            break;
        case 30:
            result = 1662;
            break;
        case 33:
            result = 2426;
            break;
        case 34:
            result = 456;
            break;
        case 35:
            result = 2650;
            break;
        case 36:
            result = 1815;
            break;
        case 37:
            result = 2813;
            break;
        case 38:
            result = 2976;
            break;
        case 39:
            result = 3079;
            break;
        case 40:
            result = 3133;
            break;
        case 41:
            result = 3144;
            break;
        case 42:
            result = 3139;
            break;
        case 43:
            result = 3158;
            break;
        case 44:
            result = 3161;
            break;
        case 45:
            result = 3172;
            break;
        case 46:
            result = 3176;
            break;
        case 47:
            result = 3195;
            break;
        case 48:
            result = 3199;
            break;
        case 49:
            result = 3202;
            break;
        case 50:
            result = 3205;
            break;
        case 51:
            result = 3244;
            break;
        case 52:
            result = 3266;
            break;
        case 53:
            result = 3291;
            break;
        case 54:
            result = 3449;
            break;
        case 55:
            result = 3706;
            break;
        case 56:
            result = 3513;
            break;
        case 58:
            result = 3779;
            break;
        case 59:
            result = 3782;
            break;
        case 61:
            result = 417;
            break;
        case 62:
            result = 2999;
            break;
        case 63:
            result = 3902;
            break;
        case 64:
            result = 3970;
            break;
        case 66:
            result = 3999;
            break;
        case 67:
            result = 4002;
            break;
        case 68:
            result = 4018;
            break;
        case 69:
            result = 4022;
            break;
        case 70:
            result = 4026;
            break;
        case 71:
            result = 4122;
            break;
        case 72:
            result = 4126;
            break;
        case 73:
            result = 4148;
            break;
        default:
            result = 0;
            break;
    }
    return result;
}
02/08/2023 22:50 incisozluk10#9
Quote:
Originally Posted by migisenpai View Post
nMenu is an NPC flag that tells the client whether to allow the menu to be accessible or not via the lish that appears when u interact with an NPC.

You said that you wanted to make your own "NPC menu" is why i suggested the snippet of code from my first comment. But if you just want to see nMenu then by all means you are on track. Unpack 005_00005.IMG and you can see it there.
Hmm. So I should look into "005_00005.IMG". Allright. I ve already used Megabyte's imgtools but that didnt worked. It didnt gave me any info just some "nSpeech" data. I will try other ways to look deeper thank you. :handsdown:

Quote:
Originally Posted by lnwnuyhodd View Post
Code:
void NPCUI::InitForClickNPC( NPC_OBJECT *tNPC_INFO )
{
    int i;
    int j;
    int k;
    int m;
    int n;
    int l;
    int v9;

    UI::OffAllSubUI(1);
    self->nInfo = tNPC_INFO->nInfo;
    self->mActive = 1;
    self->nPage[0] = -1;
    self->nPage[1] = -1;
    self->nPage[2] = -1;
    self->nPage[3] = -1;
    self->nPage[4] = -1;
    self->nPage[5] = -1;
    for ( i = 0; i < 100; i++ )
        self->bIsClick[i] = 0;
    for ( j = 0; j < 10; j++ )
        self->mMenuBtn[j] = 0;
    for ( k = 0; k < 6; k++ )
    {
        self->nIndex[k] = 0;
        for ( l = 0; l < 9; l++ )
            self->uInv[k][l] = 0;
    }
    self->mMenuBtn[0] = 1;
    self->mMenuBtn[1] = 2;
    v9 = 2;
    for ( m = 0; m < 100; m++ )
    {
        if ( self->nInfo->nMenu[m] == 2 && v9 <= 8 )
        {
            switch ( m )
            {
                case 0:
                    self->mMenuBtn[v9++] = 4;
                    break;
                case 1:
                    self->mMenuBtn[v9++] = 5;
                    break;
                case 2:
                    self->mMenuBtn[v9++] = 6;
                    break;
                case 3:
                    self->mMenuBtn[v9++] = 7;
                    break;
                case 4:
                    self->mMenuBtn[v9++] = 8;
                    break;
                case 5:
                    self->mMenuBtn[v9++] = 9;
                    break;
                case 6:
                    self->mMenuBtn[v9++] = 10;
                    break;
                case 7:
                    self->mMenuBtn[v9++] = 11;
                    break;
                case 8:
                    self->mMenuBtn[v9++] = 12;
                    break;
                case 9:
                    self->mMenuBtn[v9++] = 13;
                    break;
                case 10:
                    self->mMenuBtn[v9++] = 46;
                    break;
                case 11:
                    self->mMenuBtn[v9++] = 22;
                    break;
                case 12:
                    self->mMenuBtn[v9++] = 15;
                    break;
                case 13:
                    self->mMenuBtn[v9++] = 16;
                    break;
                case 14:
                    self->mMenuBtn[v9++] = 17;
                    break;
                case 15:
                    self->mMenuBtn[v9++] = 41;
                    break;
                case 16:
                    self->mMenuBtn[v9++] = 42;
                    break;
                case 17:
                    self->mMenuBtn[v9++] = 18;
                    break;
                case 18:
                    self->mMenuBtn[v9++] = 14;
                    break;
                case 19:
                    self->mMenuBtn[v9++] = 20;
                    break;
                case 20:
                    self->mMenuBtn[v9++] = 21;
                    break;
                case 21:
                    self->mMenuBtn[v9++] = 47;
                    break;
                case 22:
                    self->mMenuBtn[v9++] = 23;
                    break;
                case 23:
                    self->mMenuBtn[v9++] = 19;
                    break;
                case 24:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 24;
                    ++v9;
                    break;
                case 25:
                    self->mMenuBtn[v9++] = 25;
                    break;
                case 26:
                    self->mMenuBtn[v9++] = 26;
                    break;
                case 27:
                    self->mMenuBtn[v9++] = 27;
                    break;
                case 28:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 28;
                    ++v9;
                    break;
                case 29:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 48;
                    ++v9;
                    break;
                case 30:
                    self->mMenuBtn[v9++] = 29;
                    break;
                case 31:
                    self->mMenuBtn[v9++] = 30;
                    break;
                case 32:
                    self->mMenuBtn[v9++] = 55;
                    break;
                case 33:
                    self->mMenuBtn[v9++] = 40;
                    break;
                case 34:
                    self->mMenuBtn[v9++] = 54;
                    break;
                case 35:
                    self->mMenuBtn[v9++] = 36;
                    break;
                case 36:
                    self->mMenuBtn[v9++] = 33;
                    break;
                case 37:
                    self->mMenuBtn[v9++] = 34;
                    break;
                case 38:
                    if ( mMAIN[0].mWorldIndex == 40 )
                        self->mMenuBtn[v9] = 0;
                    else
                        self->mMenuBtn[v9] = 35;
                    ++v9;
                    break;
                case 39:
                    self->mMenuBtn[v9++] = 37;
                    break;
                case 40:
                    self->mMenuBtn[v9++] = 38;
                    break;
                case 41:
                    self->mMenuBtn[v9++] = 39;
                    break;
                case 42:
                    self->mMenuBtn[v9++] = 43;
                    break;
                case 43:
                    self->mMenuBtn[v9++] = 44;
                    break;
                case 44:
                    self->mMenuBtn[v9++] = 45;
                    break;
                case 45:
                    self->mMenuBtn[v9++] = 49;
                    break;
                case 46:
                    self->mMenuBtn[v9++] = 50;
                    break;
                case 47:
                    self->mMenuBtn[v9++] = 51;
                    break;
                case 48:
                    self->mMenuBtn[v9++] = 52;
                    break;
                case 49:
                    self->mMenuBtn[v9++] = 53;
                    break;
                case 52:
                    self->mMenuBtn[v9++] = 58;
                    break;
                case 53:
                    self->mMenuBtn[v9++] = 59;
                    break;
                case 54:
                    self->mMenuBtn[v9++] = 56;
                    break;
                case 56:
                    self->mMenuBtn[v9++] = 61;
                    break;
                case 57:
                    self->mMenuBtn[v9++] = 62;
                    break;
                case 58:
                    self->mMenuBtn[v9++] = 63;
                    break;
                case 62:
                    self->mMenuBtn[v9++] = 64;
                    break;
                case 65:
                    self->mMenuBtn[v9++] = 66;
                    break;
                case 66:
                    self->mMenuBtn[v9++] = 67;
                    break;
                case 67:
                    self->mMenuBtn[v9++] = 68;
                    break;
                case 68:
                    self->mMenuBtn[v9++] = 69;
                    break;
                case 69:
                    self->mMenuBtn[v9++] = 70;
                    break;
                case 70:
                    self->mMenuBtn[v9++] = 71;
                    break;
                case 71:
                    self->mMenuBtn[v9++] = 72;
                    break;
                case 72:
                    self->mMenuBtn[v9++] = 73;
                    break;
                default:
                    continue;
            }
        }
    }
    self->mMenuBtn[9] = 3;
    self->nWorkIdx = 0;
    for ( n = 0; n < 5; n++ )
        self->nSpeechNum[n] = n >= self->nInfo->nSpeechNum;
    self->nSpeechIndex = -1;
    if ( tNPC_INFO->nAction.aSort != 1 )
    {
        tNPC_INFO->nAction.aSort = 1;
        tNPC_INFO->nAction.aFrame = 0.0f;
        if ( tNPC_INFO->nInfo->nIndex != 63 && tNPC_INFO->nInfo->nIndex != 113 && tNPC_INFO->nInfo->nIndex != 213 && tNPC_INFO->nInfo->nIndex != 313 && tNPC_INFO->nInfo->nIndex != 7 )
            tNPC_INFO->nAction.aFront = UTIL::GetYAngle( tNPC_INFO->nAction.aLocation[0], tNPC_INFO->nAction.aLocation[2], mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[0], mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[2]);
        NPC_OBJECT::PlayActionSound( tNPC_INFO );
    }
}
mMenuBtn[0] = 1; //talk
mMenuBtn[1] = 2; //quest
mMenuBtn[9] = 3; //close menu
... etc

for .IMG
Code:
//int tMenuIndex = self->mMenuBtn[?];
int NPCUI::Init_000( int tMenuIndex )
{
    int result;

    switch ( tMenuIndex )
    {
        case 1:
            result = 408;
            break;
        case 2:
            result = 411;
            break;
        case 3:
            result = 423;
            break;
        case 4:
            result = 468;
            break;
        case 5:
            result = 456;
            break;
        case 6:
            result = 450;
            break;
        case 7:
            result = 447;
            break;
        case 8:
            result = 414;
            break;
        case 9:
            result = 2394;
            break;
        case 10:
            result = 462;
            break;
        case 11:
            result = 417;
            break;
        case 12:
            result = 459;
            break;
        case 13:
            result = 728;
            break;
        case 14:
            result = 3327;
            break;
        case 15:
            result = 746;
            break;
        case 16:
            result = 831;
            break;
        case 17:
            result = 960;
            break;
        case 18:
            result = 976;
            break;
        case 19:
            result = 3330;
            break;
        case 20:
            result = 417;
            break;
        case 21:
            result = 1172;
            break;
        case 22:
            result = 3307;
            break;
        case 23:
            result = 3310;
            break;
        case 24:
            result = 3502;
            break;
        case 25:
            result = 1360;
            break;
        case 26:
            result = 1480;
            break;
        case 27:
            result = 1565;
            break;
        case 28:
            result = 1590;
            break;
        case 29:
            result = 1631;
            break;
        case 30:
            result = 1662;
            break;
        case 33:
            result = 2426;
            break;
        case 34:
            result = 456;
            break;
        case 35:
            result = 2650;
            break;
        case 36:
            result = 1815;
            break;
        case 37:
            result = 2813;
            break;
        case 38:
            result = 2976;
            break;
        case 39:
            result = 3079;
            break;
        case 40:
            result = 3133;
            break;
        case 41:
            result = 3144;
            break;
        case 42:
            result = 3139;
            break;
        case 43:
            result = 3158;
            break;
        case 44:
            result = 3161;
            break;
        case 45:
            result = 3172;
            break;
        case 46:
            result = 3176;
            break;
        case 47:
            result = 3195;
            break;
        case 48:
            result = 3199;
            break;
        case 49:
            result = 3202;
            break;
        case 50:
            result = 3205;
            break;
        case 51:
            result = 3244;
            break;
        case 52:
            result = 3266;
            break;
        case 53:
            result = 3291;
            break;
        case 54:
            result = 3449;
            break;
        case 55:
            result = 3706;
            break;
        case 56:
            result = 3513;
            break;
        case 58:
            result = 3779;
            break;
        case 59:
            result = 3782;
            break;
        case 61:
            result = 417;
            break;
        case 62:
            result = 2999;
            break;
        case 63:
            result = 3902;
            break;
        case 64:
            result = 3970;
            break;
        case 66:
            result = 3999;
            break;
        case 67:
            result = 4002;
            break;
        case 68:
            result = 4018;
            break;
        case 69:
            result = 4022;
            break;
        case 70:
            result = 4026;
            break;
        case 71:
            result = 4122;
            break;
        case 72:
            result = 4126;
            break;
        case 73:
            result = 4148;
            break;
        default:
            result = 0;
            break;
    }
    return result;
}

Well, there are a lot of information here thank you. The main problem is I cant acquire these infos in my client. Are these infos taken by IDA from 0005_0005.IMG ? or twelvesky2.exe. Cant see those codes via disassemlers...

Thanks for help. :handsdown: