//Identical gs-cs 56
BOOL CMixSystem::CheckLevel2WingItem(int iItemCode) //func_5d83b0
{
if( iItemCode == ITEMGET(12,3) ||
iItemCode == ITEMGET(12,4) ||
iItemCode == ITEMGET(12,5) ||
iItemCode == ITEMGET(12,6) ||
iItemCode == ITEMGET(13,30) ||
iItemCode == ITEMGET(12,42) || //season3 addon
iItemCode == ITEMGET(12,49)) //Season6 addon
{
return TRUE;
}
return FALSE;
}
//func_005d8410
BOOL CMixSystem::CheckLevel3WingItem(int iItemCode)
{
if( iItemCode == this->iWingofStorm ||
iItemCode == this->iWingofEternal ||
iItemCode == this->iWingofIllusion ||
iItemCode == this->iWingofRuin ||
iItemCode == this->iCapeofLord ||
iItemCode == this->iWingofDimension ||
iItemCode == ITEMGET(12,50) ) //Season6 addon (need to made like WZ style)
{
return TRUE;
}
return FALSE;
}
//func_005d8480
BOOL CMixSystem::CheckItemCondition(CItem * lpItem, short Level, BYTE Op1, BYTE Op2, BYTE Op3, BYTE SetOption, BYTE NewOption) //identical gs-cs 56
{
if(lpItem == NULL){return FALSE;}
if(Level != FALSE){if(lpItem->m_Level < Level){return FALSE;}}
if(Op1 != FALSE){if(lpItem->m_Option1 < Op1){return FALSE;}}
if(Op2 != FALSE){if(lpItem->m_Option2 < Op2){return FALSE;}}
if(Op3 != FALSE){if(lpItem->m_Option3 < Op3){return FALSE;}}
if(SetOption != FALSE){if(!lpItem->m_SetOption){return FALSE;}}
if(NewOption != FALSE){if(!lpItem->m_NewOption){return FALSE;}}
return TRUE;
}
//func_005d85c0
void CMixSystem::ThirdWingMix1(LPOBJ lpObj)
{
lpObj->ChaosLock = TRUE;
int loc2 = 0;
int loc3 = 0;
int loc4 = 0;
int loc5 = 0;
int loc6 = 0;
int loc7 = 0;
int loc8 = 0;
int loc9 = 0;
int loc10 = 0;
PMSG_CHAOSMIXRESULT pMsg;
PHeadSetB((LPBYTE)&pMsg.h, 0x86, sizeof(PMSG_CHAOSMIXRESULT));
pMsg.Result = CB_ERROR;
for ( int n=0;n<CHAOS_BOX_SIZE;n++) //loc14
{
if ( lpObj->pChaosBox[n].IsItem() == TRUE )
{
if ( this->CheckLevel2WingItem(lpObj->pChaosBox[n].m_Type) != FALSE )
{
if( this->CheckItemCondition(&lpObj->pChaosBox[n],9,0,0,1,0,0) != FALSE )
{
loc2++;
}
}
else if( this->CheckItemCondition(&lpObj->pChaosBox[n],7,0,0,1,1,0) != FALSE )
{
loc3++;
loc8 += lpObj->pChaosBox[n].m_BuyMoney;
}
else if( lpObj->pChaosBox[n].m_Type == this->iJewelofChaos)
{
loc4++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iBundleofSoul)
{
loc5++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iJewelofCreation)
{
loc6++;
}
else if( lpObj->pChaosBox[n].m_Type == ITEMGET(14,53) )
{
loc10+= lpObj->pChaosBox[n].m_Durability;
}
else
{
loc7++;
}
}
}
if(loc10 > 10)
{
pMsg.Result = 0xF0; //new macro
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
lpObj->ChaosLock = FALSE;
return;
}
if(loc2 != 1 || loc3 < 1 || loc4 != 1 || loc5 != 1 || loc6 != 1 || loc7 > 0)
{
pMsg.Result = CB_INCORRECT_MIX_ITEMS;
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
lpObj->ChaosLock = FALSE;
return;
}
LogChaosItem(lpObj, "ThirdWingLevel1_Mix");
LogAddTD("[ThirdWing Mix][Level 01] Chaos Mix Start");
if(loc8 > 0)
{
lpObj->ChaosSuccessRate = loc8 / 300000;
}
if(lpObj->ChaosSuccessRate > 60)
{
lpObj->ChaosSuccessRate = 60;
}
else if( lpObj->ChaosSuccessRate < 1)
{
lpObj->ChaosSuccessRate = 1;
}
loc9 = lpObj->ChaosSuccessRate * 200000;
lpObj->ChaosSuccessRate += loc10;
loc9 = lpObj->ChaosSuccessRate * 200000; //why double? maybe inside some if
int iChaosTaxMoney = (int)((__int64)loc9 * (__int64)g_CastleSiegeSync.GetTaxRateChaos(lpObj->m_Index) / (__int64)100);
if(iChaosTaxMoney < 0)
{
iChaosTaxMoney = 0;
}
loc9 += iChaosTaxMoney;
if(loc9 < 0)
{
loc9 = 0;
}
if ( lpObj->Money < loc9 )
{
pMsg.Result = CB_NOT_ENOUGH_ZEN;
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
lpObj->ChaosLock = FALSE;
return;
}
lpObj->Money -= loc9;
g_CastleSiegeSync.AddTributeMoney(iChaosTaxMoney);
GCMoneySend(lpObj->m_Index, lpObj->Money);
if ( (rand()%100) < lpObj->ChaosSuccessRate )
{
int type = ITEMGET(13,53);
int level = 0;
int dur = 1;
ItemSerialCreateSend(lpObj->m_Index, -1, 0, 0, type , level, dur, 0, 0, 0, -1, 0, 0);
::gObjInventoryCommit(lpObj->m_Index);
LogAddTD("[ThirdWing Mix][Level 01] [%s][%s] CBMix Success %d Money : %d-%d, CharmRate : %d",
lpObj->AccountID, lpObj->Name, lpObj->ChaosSuccessRate, lpObj->Money, loc9, loc10);
}
else
{
this->ThirdWingMixItemDown(lpObj);
::GCUserChaosBoxSend(lpObj, 0);
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
LogAddTD("[ThirdWing Mix][Level 01] [%s][%s] CBMix Fail %d Money : %d-%d, CharmRate : %d",
lpObj->AccountID, lpObj->Name, lpObj->ChaosSuccessRate, lpObj->Money, loc9, loc10);
lpObj->ChaosLock = FALSE;
}
}
//func_5d8c70
void CMixSystem::ThirdWingMix2(LPOBJ lpObj)
{
lpObj->ChaosLock = TRUE;
int loc2 = 0;
int loc3 = 0;
int loc4 = 0;
int loc5 = 0;
int loc6 = 0;
int loc7 = 0;
int loc8 = 0;
int loc9 = 0;
int loc10 = 0;
int loc11 = 0;
int loc12 = 0;
PMSG_CHAOSMIXRESULT pMsg;
PHeadSetB((LPBYTE)&pMsg.h, 0x86, sizeof(PMSG_CHAOSMIXRESULT));
pMsg.Result = CB_ERROR;
for ( int n=0;n<CHAOS_BOX_SIZE;n++) //loc16
{
if ( lpObj->pChaosBox[n].IsItem() == TRUE )
{
if( this->CheckItemCondition(&lpObj->pChaosBox[n],7,0,0,1,0,1) != FALSE )
{
loc2++;
loc10 += lpObj->pChaosBox[n].m_BuyMoney;
}
else if( lpObj->pChaosBox[n].m_Type == this->iCondorFeather)
{
loc3++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iCondorFlame)
{
loc4++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iJewelofChaos)
{
loc5++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iBundleofBless)
{
loc7++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iBundleofSoul)
{
loc6++;
}
else if( lpObj->pChaosBox[n].m_Type == this->iJewelofCreation)
{
loc8++;
}
else if( lpObj->pChaosBox[n].m_Type == ITEMGET(14,53) )
{
loc12+= lpObj->pChaosBox[n].m_Durability;
}
else
{
loc9++;
}
}
}
if(loc12 > 10)
{
pMsg.Result = 0xF0; //new macro
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
lpObj->ChaosLock = FALSE;
return;
}
if(loc2 < 1 || loc3 != 1 || loc4 != 1 || loc5 != 1 || loc7 != 1 || loc6 != 1 || loc8 != 1 || loc9 > 0)
{
pMsg.Result = CB_INCORRECT_MIX_ITEMS;
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
lpObj->ChaosLock = FALSE;
return;
}
LogChaosItem(lpObj, "ThirdWingLevel2_Mix");
LogAddTD("[ThirdWing Mix][Level 02] Chaos Mix Start");
if(loc10 > 0)
{
lpObj->ChaosSuccessRate = loc10 / 3000000;
}
if(lpObj->ChaosSuccessRate > 40)
{
lpObj->ChaosSuccessRate = 40;
}
else if( lpObj->ChaosSuccessRate < 1)
{
lpObj->ChaosSuccessRate = 1;
}
loc11 = lpObj->ChaosSuccessRate * 200000;
lpObj->ChaosSuccessRate += loc12;
loc11 = lpObj->ChaosSuccessRate * 200000;
int iChaosTaxMoney = (int)((__int64)loc11 * (__int64)g_CastleSiegeSync.GetTaxRateChaos(lpObj->m_Index) / (__int64)100);
if(iChaosTaxMoney < 0)
{
iChaosTaxMoney = 0;
}
loc11 += iChaosTaxMoney;
if(loc11 < 0)
{
loc11 = 0;
}
if ( lpObj->Money < loc11 )
{
pMsg.Result = CB_NOT_ENOUGH_ZEN;
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
lpObj->ChaosLock = FALSE;
return;
}
lpObj->Money -= loc11;
g_CastleSiegeSync.AddTributeMoney(iChaosTaxMoney);
GCMoneySend(lpObj->m_Index, lpObj->Money);
if ( (rand()%100) < lpObj->ChaosSuccessRate )
{
int loc18 = rand()%6;
int loc19 = 0;
if(loc18 == 0)
{
loc19 = this->iWingofStorm;
}
else if( loc18 == 1)
{
loc19 = this->iWingofEternal;
}
else if( loc18 == 2)
{
loc19 = this->iWingofIllusion;
}
else if( loc18 == 3)
{
loc19 = this->iWingofRuin;
}
else if( loc18 == 4)
{
loc19 = this->iCapeofLord;
}
else if( loc18 == 5)
{
loc19 = this->iWingofDimension;
}
int loc20 = 0;
int loc21 = 0;
if( (rand()%1000) <= this->i3rdWingLuckRate )
{
loc21 = 1;
}
int loc22 = 0;
int loc23 = 0;
int loc24 = rand()%2;
int loc25;
int loc26;
int loc27;
int loc28;
int loc29;
switch ( loc24 )
{
case 0:
loc25 = rand()%1000;
if(loc25 < 400)
{
loc23 |= 0x10;
}
break;
case 1:
loc25 = rand()%1000;
if(loc24 < 300)
{
loc23 |= 0x20;
}
break;
}
loc26 = rand()%4;
loc27 = rand()%1000;
loc22 = 0;
switch( loc26 )
{
case 1:
{
if(loc27 < 120)
{
loc22 = 1;
}
}
break;
case 2:
{
if(loc27 < 60)
{
loc22 = 2;
}
}
break;
case 3:
{
if(loc27 < 30)
{
loc22 = 3;
}
}
break;
}
loc28 = rand()%4;
loc29 = rand()%1000;
switch( loc28 )
{
case 0:
{
if(loc29 < 40)
{
loc23 |= 1;
}
}
break;
case 1:
{
if(loc29 < 20)
{
loc23 |= 2;
}
}
break;
case 2:
{
if(loc29 < 70)
{
loc23 |= 4;
}
}
break;
case 3:
{
if(loc29 < 70)
{
loc23 |= 8;
}
}
break;
}
ItemSerialCreateSend(lpObj->m_Index, -1, 0, 0, loc19 , 0, 0, loc20, loc21, loc22, -1, loc23, 0);
::gObjInventoryCommit(lpObj->m_Index);
LogAddTD("[ThirdWing Mix][Level 02] [%s][%s] CBMix Success %d Money : %d-%d, CharmRate : %d",
lpObj->AccountID, lpObj->Name, lpObj->ChaosSuccessRate, lpObj->Money, loc11, loc12);
}
else
{
this->ThirdWingMixItemDown(lpObj);
::GCUserChaosBoxSend(lpObj, 0);
DataSend(lpObj->m_Index, (LPBYTE)&pMsg, pMsg.h.size);
LogAddTD("[ThirdWing Mix][Level 02] [%s][%s] CBMix Fail %d Money : %d-%d, CharmRate : %d",
lpObj->AccountID, lpObj->Name, lpObj->ChaosSuccessRate, lpObj->Money, loc11, loc12);
lpObj->ChaosLock = FALSE;
}
}