BYTE * readExtendedSaveFile(char* name, DWORD* size)//WORKS { char filename[512]; BYTE* data; d2_assert(!name, "Bad file name (NULL)", __FILE__, __LINE__); D2FogGetSavePath( filename, 512-5); strncat(filename, name, 512 - strlen(filename) - 5); strcat(filename, ".d2x"); log_msg("Extended file to read : %s\n",filename); FILE* file = fopen(filename, "rb"); if (file) { fseek(file, 0, SEEK_END); *size = ftell(file); fseek(file, 0, SEEK_SET); data = (BYTE*)D2FogMemAlloc(*size,__FILE__,__LINE__,0); DWORD nbRead = fread(data, 1, *size, file); fclose(file); d2_assert(nbRead != *size , "nbRead from extented save file != size", __FILE__, __LINE__); } else { log_msg("Can't open extented save file in mode \"rb\" (is not an error if it's a new player)\n"); DWORD maxSize = 100; data = (BYTE*)D2FogMemAlloc(maxSize,__FILE__,__LINE__,0); *size = 14; *((DWORD*)&data[0]) = FILE_EXTENDED; //"CSTM" *((WORD *)&data[4]) = FILE_VERSION; *((DWORD*)&data[6]) = 0;// not used *((DWORD*)&data[10]) = 0;// number of stash TCustomDll* currentDll = customDlls; while (currentDll) { currentDll->initExtendedSaveFile(&data, &maxSize, size); currentDll=currentDll->nextDll; } } return data; }
void STDCALL printPlugYVersion(void** childrens, DWORD* sgnNumChildren) { if (active_Windowed) SetWindowedOptions(); if (active_PrintPlugYVersion) { char buf[20]; void* textbox = D2CreateTextBox(newTextBoxData); childrens[*sgnNumChildren] = textbox; d2_assert((*sgnNumChildren)++ >= 40, "sgnNumChildren < MAX_CHILDREN", __FILE__, __LINE__); sprintf(buf, "PlugY %s", PLUGY_VERSION); D2PrintLineOnTextBox(textbox, buf, colorOfPlugYVersion); } }
void printRuneword(RunesBIN* runesData, DWORD pos) { WCHAR temp[50]; WCHAR runesList[50]; WCHAR typesList[50]; LPWSTR lpText = D2GetStringFromIndex(runesData->RuneNameID); D2SetFont(6); DWORD nbPixel = D2GetPixelLen(lpText); DWORD x1 = (nbPixel >= 195) ? 0 : 195-nbPixel; D2PrintString(lpText, x1, 10 + pos*20, GOLD, 0);//MILIEU(0x00,0x70,nbPixel) typesList[0]=L'\0'; DWORD numItype=0; while (numItype<6) { WORD type = runesData->Itypes[numItype]; if (!type) break; ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(type); LPCWSTR typeName = getLocalTypeString(itemTypeData->code); if (numItype) wcscat(typesList,L"/"); wcscat(typesList, typeName); numItype++; } nbPixel = D2GetPixelLen(typesList); x1 = (nbPixel >= 195) ? 0 : 195-nbPixel; D2PrintString(typesList, x1, 20 + pos*20, WHITE, 0);//MILIEU(0x70,0xA0,nbPixel) runesList[0]=L'\0'; DWORD numRune=0; int curRuneID = runesData->Runes[0]; while ((curRuneID>0) && (numRune<6)) { ItemsBIN* itemsData = D2GetItemsBIN(curRuneID); d2_assert( !itemsData , "itemsData", __FILE__, __LINE__); GemsBIN* gemData = D2GetGemsBIN(itemsData->GemOffset); if (gemData) { d2_assert( !gemData , "gemData", __FILE__, __LINE__); mbstowcs(temp, gemData->letter, 50); if (numRune) wcscat(runesList,L" "); // else wcscat(runesList,L""); wcscat(runesList,temp);} numRune++; curRuneID = runesData->Runes[numRune]; } // wcscat(runesList,L""); D2SetFont(1); DWORD y1; nbPixel = D2GetPixelLen(runesList); if (nbPixel>195) { D2SetFont(6); nbPixel = D2GetPixelLen(runesList); y1=16; x1 = nbPixel>195 ? 395-nbPixel : 204; } else { x1=205; y1=18; } // x1 = (nbPixel < 145) ? 155 : 300-nbPixel; D2PrintString(runesList, x1, y1 + pos*20, WHITE, 0);//MILIEU(0xD0,0xA0,nbPixel) }
void STDCALL printNewStatsPageTwo(int currentPage) { if (!D2isLODGame()) return D2PrintStatsPage(); WCHAR text[BUFSIZE]; LPWSTR lpText; bDontPrintBorder = false; Unit* ptChar = D2GetClientPlayer(); d2_assert(!ptChar, "Printing stats page : no character selected",__FILE__,__LINE__); d2_assert(ptChar->nUnitType != UNIT_PLAYER, "Printing stats page : bad unit type",__FILE__,__LINE__); //Init data for print image sDrawImageInfo data; ZeroMemory(&data,sizeof(data)); //print background fillRect(RX(0),RY(480),320,432,0,5);//552 setImage(&data, newStatsInterfaceImages); setFrame(&data, 0); D2PrintImage(&data, RX(0), RY(224), -1, 5, 0); setFrame(&data, 1); D2PrintImage(&data, RX(256),RY(224), -1, 5, 0);//256 setFrame(&data, 2); D2PrintImage(&data, RX(0), RY(48), -1, 5, 0);//432 setFrame(&data, 3); D2PrintImage(&data, RX(256),RY(48), -1, 5, 0); D2SetFont(1); for (int i=0; i<nbStatsInterface; i++) manageStatLine(ptChar, &statsInterface[i], currentPage, text); /* // DWORD x,y; // DWORD curValue; // CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass); // DifficultyLevelsBIN* difficultyLevels = D2GetDifficultyLevelsBIN (D2GetDifficultyLevel()); //print deadly Strike / Critical Strike x=RX(25); y=RY(445); Unit* ptItem = D2GetSkillItem(ptChar); DWORD cs = ptItem ? D2GetCriticalStrikeFromMasteries(ptChar,ptItem,0,2) : 0; cs = cs>100?100:cs; cs += D2GetPlayerStat(ptChar, STATS_PASSIVE_CRITICAL_STRIKE, 0)*(100-cs)/100; cs = cs>100?100:cs; //SkillDescBIN* skilldesc = SgptDataTables->skilldesc + 9; LPWSTR lpCS = D2GetStringFromIndex(skilldesc->strNameID); lpText = D2GetStringFromIndex(getDescStrPos(STATS_ITEM_DEADLYSTRIKE)); curValue = D2GetPlayerStat(ptChar, STATS_ITEM_DEADLYSTRIKE, 0); cs += curValue*(100-cs)/100; curValue = cs>100?100:cs; swprintf(text,L"%i%% %s/%s",curValue,lpCS,lpText); D2SetFont(1); D2SetFont( D2GetPixelLen(text)>0x110 ? 6 : 1); D2PrintString(text, x, y, WHITE, 0); */ //print background previous/next page buttons setImage(&data, statsBackgroundImages); setFrame(&data, D2GetResolution()?1:0); D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0); //print button close setImage(&data, D2LoadBuySelBtn()); setFrame(&data, 10 + isDownBtn.close); D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0); //print previous page button setFrame(&data, 12 + isDownBtn.previousPage); D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0); //print next page button setFrame(&data, 14 + isDownBtn.nextPage); D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0); //////////////////// POPUP PRINTING //////////////////// //set MouseX & MouseY DWORD mx = D2GetMouseX(); DWORD my = D2GetMouseY(); D2SetFont(1); if (isOnCloseBtn(mx,my)) // print popup "close" { D2PrintPopup(D2GetStringFromIndex(0x1030), getXCloseBtn()+getLCloseBtn()/2, getYCloseBtn()-getHCloseBtn(), WHITE, 1); } else if (isOnPreviousPageBtn(mx,my)) //print popup "previous page" { lpText = getLocalString(STR_PREVIOUS_PAGE); D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1); } else if (isOnNextPageBtn(mx,my)) //print popup "next page" { lpText = getLocalString(STR_NEXT_PAGE); D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1); } }
//6FC8CE8A |. E8 A16BFAFF CALL D2Game.6FC33A30 //$+C0 > 1F 00 00 00 03 00 00 06 ..... // 28 0010 1000 BYTE* readSharedSaveFile(char* name, DWORD* size) { char filename[512]; BYTE* data=NULL; BYTE isHardCore=0; FILE* file=NULL; if (separateHardSoftStash)//Get hardcore flag { D2FogGetSavePath( filename, 512-strlen(name)-5); strcat(filename,name); strcat(filename,".d2s"); log_msg("Normal file to read if it's hardcore character : %s\n",filename); file = fopen(filename, "rb"); if (file) { fseek(file, 0x24, SEEK_SET); DWORD nbRead = fread(&isHardCore, 1, 1, file); isHardCore = (nbRead==1)? ((isHardCore & 4) == 4) : 0; fclose(file); file=NULL; } log_msg("%s is a HardCore character = %d\n",name,isHardCore); } if (active_sharedStash) { D2FogGetSavePath( filename, 512-strlen("_LOD_HC_SharedStashSave")-5); strcat(filename,isHardCore? "_LOD_HC_" : "_LOD_"); strcat(filename, sharedStashFilename); strcat(filename,".sss"); log_msg("Shared file to read : %s\n",filename); file = fopen(filename, "rb"); } if (file) { fseek(file, 0, SEEK_END); *size = ftell(file); fseek(file, 0, SEEK_SET); data = (BYTE*)D2FogMemAlloc(*size,__FILE__,__LINE__,0); DWORD nbRead = fread(data, 1, *size, file); fclose(file); d2_assert(nbRead != *size , "nbRead from shared save file != size", __FILE__, __LINE__); } else { log_msg("Can't open shared save file in mode \"rb\" (is not an error if it's the first start of the mod)\n"); *size = 14; DWORD maxSize = 100; data = (BYTE*)D2FogMemAlloc(maxSize,__FILE__,__LINE__,0); *((DWORD *)&data[0]) = FILE_SHAREDSTASH; *((WORD *)&data[4]) = FILE_VERSION; *((DWORD *)&data[6]) = 0; *((DWORD *)&data[10]) = 0;// number of stash TCustomDll* currentDll = customDlls; while (currentDll) { currentDll->initSharedSaveFile(&data, &maxSize, size); currentDll=currentDll->nextDll; } } return data; }