..:: Forum Imperium Diablo ::..

Edycja Saves - [Program]Konwerter do postaci ladderowych na nonladderowe

Eps - 2015-04-12, 06:16
: Temat postu: [Program]Konwerter do postaci ladderowych na nonladderowe
Nazwa programu: chksum.exe
Opis: Konwerter postaci ladderowych na nonladderowe i odwrotnie.
Program oblicza sumę kontrolną w celu poprawności uruchomienia postaci bez używania programów do edycji save.
Przeznaczenie programu kierowane jest dla prywatnych serwerów w celu wykonania resetu laddera, jaki odbywa się na serwerach Blizzarda i dzięki temu można kontynuować grę pozbawiając się korzyści płynących z postaci ladderowych.
Sposób użycia:
1. Metoda przeciągnij/upuść save postaci.
2. Metoda stworzenia pliku *.bat. W pliku umieść poniższy wpis:
chksum <nazwapostaci>
Zapisz plik *.bat i uruchom go.

Epilepsja Studio 2015 by Eps.

Link do pobrania: http://www.mediafire.com/...r1it/chksum.zip
Jamajka - 2015-04-21, 20:59
:
Można by dodać do Imperialnego działu download ;) .
Szeranf - 2015-04-21, 21:04
:
Bardzo fajne, gratulacje! :)
Eps - 2015-04-21, 21:44
:
Jeszcze lepiej, jakby się takie coś stosowało na ID REALM. Może niektórzy, by pozostali na realmie, których już od dawna nie ma. Nie byłoby zaczynania od zera (mimo utraty tego co daje ladder). Ale co ja tam wiem. ;)
Szeranf - 2015-04-22, 08:11
:
A dałoby się zrobić operację odwrotną, tudzież przekonwertować programem postać nld na ld? Kiedyś myślałem dużo nad systemem ladderowym w d2 i wykombinowałem, że może dobrą opcją byłaby nieco inna organizacja tego systemu. Trybem podstawowym byłby nld, a gracze mogliby sobie z konta raz na tydzień przenieść na ld tylko jedną postać. Na takim ladderze rywalizowaliby o miejsca w drabinkach z expem, zabiciem potworów, zebraniem określonych przedmiotów i innych rzeczach - na bn tego nie będzie, ale realm to inna bajka. Również eventy mogłyby się odbywać tylko w takim systemie ladderowym, gdzie zabiera się tylko jedną postać na tydzień, pokrywający się z tygodniem, w którym trwałby event - zwolennicy jak i przeciwnicy eventów byliby zadowoleni.

A co do save'ów, to domyślam się, że ktoś przed resetami realmu pozgrywał gdzieś te postacie, w razie gdyby coś poszło nie tak. Fajnie by było, gdyby zostały spakowane do jednego pliku i wrzucone do downloadu, żeby gracze sp mogli się nimi pobawić.
Eps - 2015-04-22, 09:36
:
Teoretycznie: Bez problemu da się to zrobić. Np. będzie trzeba jedynie znaleźć w kodzie gry funkcję odpowiadającą za stworzenie postaci ladderowej i utworzyć nowy przycisk, który by umożliwiał konwertowanie postaci na ladder.
Ewentualnie przez stronę www dorobić taki dodatek.
Praktycznie: Trzeba działać i próbować.
Szeranf napisał/a:
Również eventy mogłyby się odbywać tylko w takim systemie ladderowym, gdzie zabiera się tylko jedną postać na tydzień, pokrywający się z tygodniem, w którym trwałby event - zwolennicy jak i przeciwnicy eventów byliby zadowoleni.

Wtedy postacie nonladder musiałyby być przekierowywane na zupełnie inny GS, bo tu zwiększenie ilości potworów, alvl i inne poprzez wprowadzone zmiany z eventu nie mają znaczenia czy to ladder czy tez nonladder. Działa to na obu trybach. Niestety...
phxpro - 2015-08-02, 03:35
:
Eps ten programik od Ciebie nie działa mi;/
zacząłem pisać własny i mi nie wychodzi;/ źle liczy sumę kontrolną:
Kod:
#include <iostream>
#include <fstream>
#include <iomanip>// std::setfill, std::setw
using namespace std;

int main()
{
    int tablica[10000];

    int a1=0;
    int a2=0;
    int a3=0;
    int a4=0;
    int d=0;
    int b=0;
    int length=0;

    fstream f;
    f.open("ab.d2s",ios::in|ios::binary);

    if ( f )
    {
        // przesun pozycje na koniec
        f.seekg( 0, ios::end );
        // odczytaj pozycje w pliku -> rozmiar pliku
        length = f.tellg();
        // wroc na poczatek pliku!
        f.seekg( 0, ios::beg );
        cout << "Rozmiar pliku to: " << length << endl;
    }

    for(int a=0; a<length; a++)
    {
        tablica[a]=f.get();
    }
    f.close();

//tablica[36]=tablica[36]+64;

    tablica[13]=0;
    tablica[14]=0;
    tablica[15]=0;
    tablica[16]=0;

    for(int i=0; i<length; i++)
    {
        d=tablica[i]+b;

        a1=(a1*2)+d;
        a2=a2*2;

        if (a1>255)
        {
            a2=a2+((a1-(a1%256))/256);
            a1=a1%256;
        }

        a3=a3*2;

        if (a2>255)
        {
            a3=a3+((a2-(a2%256))/256);
            a2=a2%256;
        }

        a4=a4*2;
        if (a3>255)
        {
            a4=a4+((a3-(a3%256))/256);
            a3=a3%256;
        }
        if (a4>255)
        {
            a4=a4%256;
        }
        if((a4&&128/*&&&H80*/)!=0)
            b=1;
        else
            b=0;

        cout<<hex<<a4<<" "<<a3<<" "<<a2<<" "<<a1<<endl;
    }

    tablica[13]=a1;
    tablica[14]=a2;
    tablica[15]=a3;
    tablica[16]=a4;

//cout<<hex<<a4<<" "<<a3<<" "<<a2<<" "<<a1<<endl;
//64 06 5D 13
    /*
        for(int a=0;a<length;a++)
        {

           cout<<hex<<setfill ('0')<<setw (2)<<tablica[a]<<" ";
        }*/
    return 0;
}

jeśli widzisz jakiś błąd to daj znać:)

e: potem znalazłem nowa wersja algotmu:
Kod:
for ( int i = 0; i < length; i++ )
              b = (b<<1) + tablica[i] + ( b & 0x80000000 ? 1 : 0 );

o dziwo suma kontrolna jest już blisko/ lecz jest niedokładna...

e: rozwiazany problem:)
Kod:
// pucData - pointer to the byte stream of the .d2s file
// iSize - number of bytes in the stream ( filesize )
void Checksum( unsigned char *pucData, int iSize )
{
// delete old checksum at offset 0x0C
*((unsigned int*)(pucData+12)) = 0;
// init new checksum with 0
unsigned int uiCS = 0;
// this is the whole checksum calculation
for ( int j = 0; j < iSize; ++j )
uiCS = (uiCS<<1) + pucData[j] + ( uiCS & 0x80000000 ? 1 : 0 );
// write new checksum to stream
*((unsigned int*)(pucData+12)) = uiCS;
}