• Unfortunately, we have experienced significant hard drive damage that requires urgent maintenance and rebuilding. The forum will be a state of read only until we install our new drives and rebuild all the configurations needed. Please follow our Facebook page for updates, we will be back up shortly! (The forum could go offline at any given time due to the nature of the failed drives whilst awaiting the upgrades.) When you see an Incapsula error, you know we are in the process of migration.

Moss Merchant for 1.00.90

Elite Diviner
Joined
Sep 28, 2005
Messages
419
Reaction score
105
How to configure?
I looked at the Raklion.dat file already, but if I changed the number to five in 1330 to not allow it.
Thanks in advance for your answer.
I'm sorry that I write here. :)

0061018B . 817D D4 681000>CMP DWORD PTR SS:[EBP-2C],1F4


Use olly to do this and change the red number with 15811 or a big number so you can put a higher number in the raklion.dat file.
You will have to search for the gs_cs offset.
 
Junior Spellweaver
Joined
Jul 30, 2005
Messages
176
Reaction score
110
0061018B . 817D D4 681000>CMP DWORD PTR SS:[EBP-2C],1F4


Use olly to do this and change the red number with 15811 or a big number so you can put a higher number in the raklion.dat file.
You will have to search for the gs_cs offset.

That's why my Raklion work normal. My GS was already patched... :eek:tt1:

Code:
0061018B   .  817D D4 81510>cmp dword ptr ss:[ebp-2C],15181
 
IGCN Co-Founder
Joined
Jun 26, 2006
Messages
303
Reaction score
487
Wow, very nice dude ! Can you share the GambleSystem.cpp and .h ?
Code:
#pragma once

#define MAX_GAMBLING_OPTION_RATE 5
#define MAX_GAMBLING_SPECIAL_ITEM_RATE 6
#define MAX_GAMBLING_EXC_OPTION_RATE 5
#define MAX_GAMBLING_EXC_LEVEL 7
#define MAX_GAMBLING_NORMAL_BAG_OPTION_RATE 25

#define MAX_GAMBLING_GROUPS 25
#define MAX_GAMBLING_GROUP_ITEMS 150

struct GAMBLING_ITEM_OPTION_RATE
{
    int iSkillOptionRate;    // 0
    int iLuckOptionRate;    // 4
    int iAddOptionRate;    // 8
    int iExOptionRate;    // C
    int iSortOptionRate;
};

struct GAMBLING_ITEMLIST
{
    WORD wItemIndex;    // 0
    BYTE btItemType;    // 2
    BYTE btItemLevelMin;    // 3
    BYTE btItemLevelMax;    // 4
    BYTE btSkillOption;    // 5
    BYTE btLuckOption;    // 6
    BYTE btAddOption;    // 7
    BYTE btExOption;    // 8
};


class CGamblingSystem
{
public:
    CGamblingSystem(void);
    virtual ~CGamblingSystem(void);

    void Initialize(LPSTR lpFileName);
    bool TryGambling(int aIndex, int a2, int a3, int a4, BYTE pos);

    int GetItemCount() { return this->m_iGamblingAllItemCount; }

private:

    bool LoadFile(LPSTR lpFileName);
    int GetItemLevel(int Group, int Item);
    int GetExcellentOption(int Number);

    bool m_bFileLoad;

    int m_iGamblingOptionRate[MAX_GAMBLING_OPTION_RATE];
    int m_iGamblingSpecialItemRate[MAX_GAMBLING_SPECIAL_ITEM_RATE];
    int m_iGamblingExcOptionRate[MAX_GAMBLING_EXC_OPTION_RATE];
    int m_iGamblingExcSpecialLevel[MAX_GAMBLING_EXC_LEVEL];
    int m_iGamblingExcNormalLevel[MAX_GAMBLING_EXC_LEVEL];
    int m_iGamblingItemCount[MAX_GAMBLING_GROUPS];
    int m_iGamblingGroups;
    int m_iGamblingAllItemCount;
    GAMBLING_ITEMLIST m_iGamblingItems[MAX_GAMBLING_GROUPS][MAX_GAMBLING_GROUP_ITEMS];
    GAMBLING_ITEM_OPTION_RATE m_iGamblingItemOptionRate[MAX_GAMBLING_NORMAL_BAG_OPTION_RATE];
};

extern CGamblingSystem g_Gambling;

Code:
#include "stdafx.h"
#include "GamblingSystem.h"
#include "..\common\ReadScript.h"
#include "..\common\winutil.h"
#include "logproc.h"
#include "LargeRand.h"
#include "user.h"
#include "DSProtocol.h"

CGamblingSystem g_Gambling;

CGamblingSystem::CGamblingSystem(void)
{
}


CGamblingSystem::~CGamblingSystem(void)
{
}

void CGamblingSystem::Initialize(LPSTR lpFileName)
{
    this->m_bFileLoad = false;
    this->m_iGamblingAllItemCount = 0;
    this->m_iGamblingGroups = 0;

    for(int i=0;i<MAX_GAMBLING_OPTION_RATE;i++)
    {
        this->m_iGamblingOptionRate[i] = 0;
    }

    for(int j=0;j<MAX_GAMBLING_SPECIAL_ITEM_RATE;j++)
    {
        this->m_iGamblingSpecialItemRate[j] = 0;
    }

    for(int k=0;k<MAX_GAMBLING_EXC_OPTION_RATE;k++)
    {
        this->m_iGamblingExcOptionRate[k] = 0;
    }

    for(int l=0;l<MAX_GAMBLING_EXC_LEVEL;l++)
    {
        this->m_iGamblingExcSpecialLevel[l] = 0;
        this->m_iGamblingExcNormalLevel[l] = 0;
    }
    
    for(int m=0;m<MAX_GAMBLING_NORMAL_BAG_OPTION_RATE;m++)
    {
        this->m_iGamblingItemCount[m] = 0;
    }

    this->LoadFile(lpFileName);
}



bool CGamblingSystem::LoadFile(LPSTR lpFileName)
{
    int Token;
    int Group;
    int count;
    int Table = 0;

    SMDFile = fopen(lpFileName, "r");

    if(SMDFile != NULL)
    {
        while ( true )
        {
            Token = GetToken();
        
            if(Token == END)
            {
                break;
            }
            else if(Token == NUMBER)
            {
                Group = TokenNumber;
                
                switch ( Group )
                {
                    case 0:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 25 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingItemOptionRate[count].iSkillOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count].iLuckOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count].iAddOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count].iExOptionRate = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingItemOptionRate[count++].iSortOptionRate = TokenNumber;
                        }

                        break;
                    }

                    case 1:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 4 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingOptionRate[count++] = TokenNumber;
                        }

                        break;
                    }
                    
                    case 2:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 5 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingSpecialItemRate[count++] = TokenNumber;
                        }
                        
                        break;
                    }

                    case 3:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();

                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 4 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingExcOptionRate[count++] = TokenNumber;
                        }

                        break;
                    }

                    case 4:
                    {
                        count = 0;

                        while ( true )
                        {
                            Token = GetToken();
                            if(!strcmp("end", TokenString))
                                break;

                            if ( count > 4 )
                            {
                                MsgBox("Load Script Error %s", lpFileName);
                                break;
                            }

                            this->m_iGamblingExcSpecialLevel[count] = TokenNumber;

                            Token = GetToken();
                            this->m_iGamblingExcNormalLevel[count++] = TokenNumber;
                        }
                        
                        break;
                    }

                    default:
                    {
                        if ( Group >= 5 )
                        {
                            int count = 0;

                            while ( true )
                            {
                                Token = GetToken();
                                if(!strcmp("end", TokenString))
                                    break;

                                this->m_iGamblingItems[Table][count].wItemIndex = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btItemType = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btItemLevelMin = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btItemLevelMax = TokenNumber;
                                
                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btSkillOption = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btLuckOption = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btAddOption = TokenNumber;

                                Token = GetToken();
                                this->m_iGamblingItems[Table][count].btExOption = TokenNumber;

                                if(this->m_iGamblingItems[Table][count].btItemLevelMin >
                                    this->m_iGamblingItems[Table][count].btItemLevelMax)
                                {
                                    MsgBox("Load Script Error %s", lpFileName);
                                    return 0;
                                }

                                count++;
                                this->m_iGamblingAllItemCount++;

                                if(this->m_iGamblingAllItemCount > 149)
                                    break;
                            }

                            this->m_iGamblingItemCount[Table] = count;

                            Table++;

                            if(Table > 24)
                                break;
                            
                            this->m_iGamblingGroups = Table;
                        }
                    }
                }
            }
        }

        fclose(SMDFile);

        this->m_bFileLoad = true;
    }

    return this->m_bFileLoad;
}

int CGamblingSystem::GetItemLevel(int Group, int Item)
{
    if(Item < 0 && Item > 149)
    {
        return 0;
    }
    else
    {
        if(this->m_iGamblingItems[Group][Item].btItemLevelMin == this->m_iGamblingItems[Group][Item].btItemLevelMax)
        {
            return this->m_iGamblingItems[Group][Item].btItemLevelMin;
        }
        else
        {
            return rand() % (this->m_iGamblingItems[Group][Item].btItemLevelMax - this->m_iGamblingItems[Group][Item].btItemLevelMin +1) + this->m_iGamblingItems[Group][Item].btItemLevelMin;
        }
    }
}

int CGamblingSystem::GetExcellentOption(int Number)
{
    int v4 = 0;
    int Exc = 0;
    int i;
    for (i=0; ; i++)
    {
        if(this->m_iGamblingExcSpecialLevel[i] < GetLargeRand()%1000000)
            v4++;
        else
            Exc |= 1 << i;
        if(v4 >= 6 - Number)
            break;
    }

    while (true)
    {
        i++;
        if ( i >= 6 )
            break;
        Exc |= 1 << i;
    }

    return Exc;
}

bool CGamblingSystem::TryGambling(int aIndex, int a2, int a3, int a4, BYTE pos)
{
    if(!this->m_bFileLoad)
        return false;

    int Skill = 0, Luck = 0, Option = 0, Excellent = 0, Level = 0, RandomKey = 0, ItemNumber = -1;

    if ( this->GetItemCount() > 0 )
    {

        if ( this->m_iGamblingSpecialItemRate[pos] < GetLargeRand() % 1000000 )
        {
            int ItemGetMax = 0;
            int ItemGetMin = 0;
            int ItemCount = 0;
            int StartGroup = 0;

            switch ( pos )
            {
                case 0:
                    StartGroup = 0;
                    break;
                case 2:
                    StartGroup = 5;
                    break;
                case 4:
                    StartGroup = 10;
                    break;
                case 6:
                    StartGroup = 15;
                    break;
                case 24:
                    StartGroup = 20;
                    break;
            }

            RandomKey = GetLargeRand() % 1000000;
            int Sort = 0;
            for (int i = StartGroup; i < StartGroup+5; i++)
            {
                Sort += this->m_iGamblingItemOptionRate[i].iSortOptionRate;
                if ( RandomKey <= Sort )
                {
                    StartGroup = i;
                    break;
                }
            }

            while ( true )
            {
                ItemGetMax += this->m_iGamblingItemCount[ItemCount];
                if(StartGroup <= ItemCount)
                    break;
                ItemGetMin += this->m_iGamblingItemCount[ItemCount++];
            }

            int ItemIndex = GetLargeRand() % (ItemGetMax-ItemGetMin);
            Level = this->GetItemLevel(StartGroup, ItemIndex);
            ItemNumber = ItemGetNumberMake(this->m_iGamblingItems[StartGroup][ItemIndex].wItemIndex, this->m_iGamblingItems[StartGroup][ItemIndex].btItemType);
            if(ItemNumber == -1)
                return 0;

            if(this->m_iGamblingItems[StartGroup][ItemIndex].btSkillOption && this->m_iGamblingItemOptionRate[StartGroup].iSkillOptionRate >= GetLargeRand() % 1000000)
            {
                Skill = 1;
            }
            if(this->m_iGamblingItems[StartGroup][ItemIndex].btLuckOption && this->m_iGamblingItemOptionRate[StartGroup].iLuckOptionRate >= GetLargeRand() % 1000000)
            {
                Luck = 1;
            }
            if(this->m_iGamblingItems[StartGroup][ItemIndex].btAddOption && this->m_iGamblingItemOptionRate[StartGroup].iAddOptionRate >= GetLargeRand() % 1000000)
            {
                RandomKey = GetLargeRand()%1000000;

                if(RandomKey > this->m_iGamblingOptionRate[0])
                {
                    if(RandomKey > this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                    {
                        if(RandomKey > this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                        {
                            if(RandomKey <= this->m_iGamblingOptionRate[3] + this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                            {
                                Option = 4;
                            }
                        }
                        else
                        {
                            Option = 3;
                        }
                    }
                    else
                    {
                        Option = 2;
                    }
                }
                else
                {
                    Option = 1;
                }
            }
            
            if ( this->m_iGamblingItems[StartGroup][ItemIndex].btExOption )
            {
                if ( this->m_iGamblingItemOptionRate[StartGroup].iExOptionRate >= GetLargeRand() % 1000000 )
                {
                    Excellent = 1;
                    Luck = 0;
                    Skill = 1;
                    Level = 0;
                }
            }
        }
        else
        {
            Level = 0;
            Skill = 1;
            Luck = 0;

            RandomKey = GetLargeRand()%1000000;

            if(RandomKey > this->m_iGamblingOptionRate[0])
            {
                if(RandomKey > this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                {
                    if(RandomKey > this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                    {
                        if(RandomKey <= this->m_iGamblingOptionRate[3] + this->m_iGamblingOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingOptionRate[0])
                        {
                            Option = 4;
                        }
                    }
                    else
                    {
                        Option = 3;
                    }
                }
                else
                {
                    Option = 2;
                }
            }
            else
            {
                Option = 1;
            }

            RandomKey = GetLargeRand()%1000000;

            if(RandomKey > this->m_iGamblingExcOptionRate[0])
            {
                if(RandomKey > this->m_iGamblingExcOptionRate[1] + this->m_iGamblingExcOptionRate[0])
                {
                    if(RandomKey > this->m_iGamblingExcOptionRate[2] + this->m_iGamblingExcOptionRate[1] + this->m_iGamblingExcOptionRate[0])
                    {
                        if(RandomKey <= this->m_iGamblingExcOptionRate[3] + this->m_iGamblingExcOptionRate[2] + this->m_iGamblingOptionRate[1] + this->m_iGamblingExcOptionRate[0])
                        {
                            this->GetExcellentOption(4);
                        }
                    }
                    else
                    {
                        this->GetExcellentOption(3);
                    }
                }
                else
                {
                    this->GetExcellentOption(2);
                }
            }
            else
            {
                this->GetExcellentOption(1);
            }

            switch ( pos )
            {
                case 0:
                    ItemNumber = ItemGetNumberMake(3,11);
                    break;
                case 2:
                    ItemNumber = ItemGetNumberMake(5,33);
                    break;
                case 4:
                    ItemNumber = ItemGetNumberMake(4,24);
                    break;
                case 6:
                    ItemNumber = ItemGetNumberMake(2,18);
                    break;
                case 24:
                    ItemNumber = ItemGetNumberMake(5,34);
                    break;
            }
        }
        ItemSerialCreateSend(aIndex, 238, 0, 0, ItemNumber, Level, 255, Skill, Luck, Option, aIndex, Excellent, 0);

        LogAddTD("[Gambling][Try Gambling] (%s)(%s) Try item: %d Level:%d op1:%d op2:%d op3:%d ExOp:%d",
            gObj[aIndex].AccountID, gObj[aIndex].Name, ItemNumber, Level, Skill, Luck, Option, Excellent);
    }
    return 1;
}

It's not 100% 1:1 decompilation, but it works like original, IGCN have 100% decompiled gs .90 too ^^.
 
Back
Top