⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 网络游戏《红月》客户端RMM文件查看修改工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void TForm1::loadtlelst(void)
{
    FILE *f;
    char *buff, *bptr;
    long flength;
    AnsiString Value; //temp string value
    AnsiString Version; //temp string value
    int t1 = 0; //temp int value
    int t2 = 0; //temp int value

    Value = "C:\\Redmoon\\RLEs\\tle.lst";
    f = fopen(Value.c_str(),"rb");
    if (f == NULL) {
        return;
    }

    fseek(f,0,SEEK_END);  // seek to end
    flength = ftell(f);        // get length of file in bytes
    buff = new char[flength+1];   // allocate full size of file
    if (buff==NULL) {
        fclose(f);
        ShowMessage("Not enough Memory");
        return;
    }
    fseek(f,0,SEEK_SET);  // rewind to beginning
    fread(buff,1,flength,f);   // grab whole file into buff[]
    fclose(f);
    buff[flength]=0; // ensure null terminator at eof
    bptr = buff;
    int ilength = *bptr++;
    Value = "";
    for (int j=0;j<ilength;j++) {
        Value = Value + AnsiString(*bptr++);
    }
    ilength = *bptr++;
    Version = "";
    for (int j=0;j<ilength;j++) {
        Version = Version + AnsiString(*bptr++);
    }
    t1 = (*bptr++ & 0xFF);
    t1 |= (*bptr++ & 0xFF) << 0x08;
    t1 |= (*bptr++ & 0xFF) << 0x10;
    t1 |= (*bptr++ & 0xFF) << 0x18;
    t1 = (*bptr++ & 0xFF);
    t1 |= (*bptr++ & 0xFF) << 0x08;
    t1 |= (*bptr++ & 0xFF) << 0x10;
    t1 |= (*bptr++ & 0xFF) << 0x18;
    int total = t1;
    //166186
    //13984
    for (int i=0; i<total; i++) {
        int tilenum,filenum,index;
        ilength = *bptr++;
        Value = "";
        for (int j=0;j<ilength;j++) {
            Value = Value + AnsiString(*bptr++);
        }
        //Name
        t1 = (*bptr++ & 0xFF);          t1 |= (*bptr++ & 0xFF) << 0x08;
        t1 |= (*bptr++ & 0xFF) << 0x10; t1 |= (*bptr++ & 0xFF) << 0x18;
        tilenum = t1;
        //TileNum
        t2 = (*bptr++ & 0xFF);          t2 |= (*bptr++ & 0xFF) << 0x08;
        t2 |= (*bptr++ & 0xFF) << 0x10; t2 |= (*bptr++ & 0xFF) << 0x18;
        filenum = t2;
        //FileNum
        t1 = (*bptr++ & 0xFF);          t1 |= (*bptr++ & 0xFF) << 0x08;
        t1 |= (*bptr++ & 0xFF) << 0x10; t1 |= (*bptr++ & 0xFF) << 0x18;
        index = t1;
        //Index
        for (int tlei=0;tlei<241;tlei++) {
            for (int tlej=0;tlej<128;tlej++) {
                if (tleData[tlei][tlej].tlenumber == tilenum) {
                    if (tleData[tlei][tlej].loaded == true) {
                        tleData[tlei][tlej].filename = "C:\\Projects\\mmview\\tle\\" + Value + ".bmp";
                    }
                }
            }
        }
        if (Version == "1.2") {
            t1 = (*bptr++ & 0xFF);          t1 |= (*bptr++ & 0xFF) << 0x08;
            t1 |= (*bptr++ & 0xFF) << 0x10; t1 |= (*bptr++ & 0xFF) << 0x18;
        }
    }
    free(buff);
}
//---------------------------------------------------------------------------

void TForm1::loadobjlst(void)
{
    FILE *f;
    char *buff, *bptr;
    long flength;
    AnsiString Value; //temp string value
    AnsiString Version; //temp string value
    int t1 = 0; //temp int value
    int t2 = 0; //temp int value

    Value = "C:\\Redmoon\\RLEs\\obj.lst";
    f = fopen(Value.c_str(),"rb");
    if (f == NULL) {
        return;
    }

    fseek(f,0,SEEK_END);  // seek to end
    flength = ftell(f);        // get length of file in bytes
    buff = new char[flength+1];   // allocate full size of file
    if (buff==NULL) {
        fclose(f);
        ShowMessage("Not enough Memory");
        return;
    }
    fseek(f,0,SEEK_SET);  // rewind to beginning
    fread(buff,1,flength,f);   // grab whole file into buff[]
    fclose(f);
    buff[flength]=0; // ensure null terminator at eof
    bptr = buff;
    int ilength = *bptr++;
    Value = "";
    for (int j=0;j<ilength;j++) {
        Value = Value + AnsiString(*bptr++);
    }
    ilength = *bptr++;
    Version = "";
    for (int j=0;j<ilength;j++) {
        Version = Version + AnsiString(*bptr++);
    }
    t1 = (*bptr++ & 0xFF);
    t1 |= (*bptr++ & 0xFF) << 0x08;
    t1 |= (*bptr++ & 0xFF) << 0x10;
    t1 |= (*bptr++ & 0xFF) << 0x18;
    t1 = (*bptr++ & 0xFF);
    t1 |= (*bptr++ & 0xFF) << 0x08;
    t1 |= (*bptr++ & 0xFF) << 0x10;
    t1 |= (*bptr++ & 0xFF) << 0x18;
    int total = t1;
    //166186
    //13984
    for (int i=0; i<total; i++) {
        int tilenum,filenum,index;
        ilength = *bptr++;
        Value = "";
        for (int j=0;j<ilength;j++) {
            Value = Value + AnsiString(*bptr++);
        }
        //Name
        t1 = (*bptr++ & 0xFF);          t1 |= (*bptr++ & 0xFF) << 0x08;
        t1 |= (*bptr++ & 0xFF) << 0x10; t1 |= (*bptr++ & 0xFF) << 0x18;
        tilenum = t1;
        //TileNum
        t2 = (*bptr++ & 0xFF);          t2 |= (*bptr++ & 0xFF) << 0x08;
        t2 |= (*bptr++ & 0xFF) << 0x10; t2 |= (*bptr++ & 0xFF) << 0x18;
        filenum = t2;
        //FileNum
        t1 = (*bptr++ & 0xFF);          t1 |= (*bptr++ & 0xFF) << 0x08;
        t1 |= (*bptr++ & 0xFF) << 0x10; t1 |= (*bptr++ & 0xFF) << 0x18;
        index = t1;
        //Index
        for (int tlei=0;tlei<1417;tlei++) {
            for (int tlej=0;tlej<128;tlej++) {
                if (objData[tlei][tlej].tlenumber == tilenum) {
                    if (objData[tlei][tlej].loaded == true) {
                        objData[tlei][tlej].filename = "C:\\Projects\\mmview\\obj\\" + Value + ".bmp";
                    }
                }
            }
        }
        if (Version == "1.2") {
            t1 = (*bptr++ & 0xFF);          t1 |= (*bptr++ & 0xFF) << 0x08;
            t1 |= (*bptr++ & 0xFF) << 0x10; t1 |= (*bptr++ & 0xFF) << 0x18;
        }
    }
    free(buff);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Memo1->Lines->Add("Loading RMD Data Files");
    Application->ProcessMessages();
    for (int i=0;i<height;i++) {
        for (int j=0;j<width;j++) {
            int filenum = 0;
            filenum = (int)(mapData[i][j].tle2 * 2);
            filenum += (int)(mapData[i][j].tle1 / 128);
            if (filenum < 241) {
                loadtle(filenum);
            }
            filenum = (int)(mapData[i][j].obj1/4);
            filenum += (int)(mapData[i][j].obj2 % 32)*64;
            if ((filenum > 0) && (filenum < 1417)) {
                loadobj(filenum);
            }
        }
    }
    Memo1->Lines->Add("Loading Til LST and RLE Files");
    Application->ProcessMessages();
    loadtlelst();
    Memo1->Lines->Add("Loading Obj LST and RLE Files");
    Application->ProcessMessages();
    loadobjlst();
    Memo1->Lines->Add("Drawing Map on Image");
    Application->ProcessMessages();
    Form2->Image1->Canvas->Brush->Color = clBlack;
    Form2->Image1->Canvas->Rectangle(0,0,Form2->Image1->Width,Form2->Image1->Height);
    int xOffset = 0;
    int yOffset = 0;
    int xStart, yStart;
    xStart = atoi(Edit1->Text.c_str());
    yStart = atoi(Edit2->Text.c_str());
    //load tiles
    for (int i=xStart;i<height;i++) {
        for (int j=yStart;j<width;j++) {
            if (xOffset < Form2->Image1->Width) {
                if (yOffset < Form2->Image1->Height) {
                    int fnum, inum;
                    fnum = (int)(mapData[i][j].tle2 * 2);
                    fnum += (int)(mapData[i][j].tle1 / 128);
                    inum = (int)(mapData[i][j].tle1 % 128)*8;
                    inum += (int)(mapData[i][j].obj2 / 32);

                    Graphics::TBitmap *Bitmap;

                    TRect   MyRect, MyOther;

                    MyRect = Rect(xOffset,yOffset,xOffset+(tleData[fnum][inum].xend-tleData[fnum][inum].xstart),yOffset+(tleData[fnum][inum].yend-tleData[fnum][inum].ystart));

                    MyOther = Rect(tleData[fnum][inum].xstart,tleData[fnum][inum].ystart,tleData[fnum][inum].xend, tleData[fnum][inum].yend);
                    if (tleData[fnum][inum].filename != "") {
                        Bitmap = new Graphics::TBitmap;
                        Bitmap->LoadFromFile(tleData[fnum][inum].filename);
                        Form2->Image1->Canvas->BrushCopy(MyRect, Bitmap, MyOther, RGB(255,0,255));
                        delete Bitmap;
                    }
                }
            }
            xOffset += 48;
        }
        xOffset = 0;
        yOffset += 24;
    }
    //load objects
    xOffset = 0;
    yOffset = 0;
    for (int i=xStart;i<height;i++) {
        for (int j=yStart;j<width;j++) {
            int fnum, inum;
            fnum = (int)(mapData[i][j].obj1/4);
            fnum += (int)(mapData[i][j].obj2 % 32)*64;
            inum = (int)(mapData[i][j].unk3)*2;
            inum += (int)(mapData[i][j].unk2 / 128);

            if (fnum != 0) {
                if (xOffset < Form2->Image1->Width) {
                    if (yOffset < Form2->Image1->Height) {

                        Graphics::TBitmap *Bitmap;

                        TRect   rDest, rSource;
                        int lwidth, lheight;
                        lheight = objData[fnum][inum].yend-objData[fnum][inum].ystart;
                        lwidth = objData[fnum][inum].xend-objData[fnum][inum].xstart;

                        rSource = Rect(objData[fnum][inum].xstart,objData[fnum][inum].ystart,objData[fnum][inum].xend, objData[fnum][inum].yend);
                        rDest   = Rect(xOffset,yOffset,xOffset+width,yOffset+height);

                        if (objData[fnum][inum].filename != "") {
                            Bitmap = new Graphics::TBitmap;
                            Bitmap->LoadFromFile(objData[fnum][inum].filename);
                            for (int ii=0;ii<lheight;ii++) {
                                for (int jj=0;jj<lwidth;jj++) {
                                    if (Bitmap->Canvas->Pixels[objData[fnum][inum].xstart+jj][objData[fnum][inum].ystart+ii] != RGB(255,0,255)) {
                                        if ((Bitmap->Canvas->Pixels[objData[fnum][inum].xstart+jj][objData[fnum][inum].ystart+ii] != -1) &&
                                            (Bitmap->Canvas->Pixels[objData[fnum][inum].xstart+jj][objData[fnum][inum].ystart+ii] != 0)) {
                                            Form2->Image1->Canvas->Pixels[xOffset+jj][yOffset+ii] = Bitmap->Canvas->Pixels[objData[fnum][inum].xstart+jj][objData[fnum][inum].ystart+ii];
//                                            Form2->Image1->Canvas->Pixels[xOffset+jj+objData[fnum][inum].xOffset][yOffset+ii+objData[fnum][inum].yOffset] = Bitmap->Canvas->Pixels[objData[fnum][inum].xstart+jj][objData[fnum][inum].ystart+ii];
                                        }
                                    }
                                }
                            }
//                            Form2->Image1->Canvas->BrushCopy(rDest, Bitmap, rSource, RGB(255,0,255));
//                            Form2->Image1->Canvas->CopyMode = cmSrcCopy;
//                            Form2->Image1->Canvas->CopyRect(rDest, Bitmap->Canvas, rSource);
                            delete Bitmap;
                        }
                    }
                }
            }
            xOffset += 48;
        }
        xOffset = 0;
        yOffset += 24;
    }
    Form2->Show();
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Button4Click(TObject *Sender)
{
    Screen->Cursor = crHourGlass;
    FILE *f;
    char c;
    int iTemp;
    AnsiString Value;

    char tmp[100];
    sprintf(tmp,"C:\\Redmoon\\DATAs\\Map\\map%5d.rmm",++map);
    for (int i = 0; i < strlen(tmp); i++) {
        if (tmp[i] == ' ') {
            tmp[i] = '0';
        }
    }
    f = fopen(tmp,"rb");
    if (f == NULL) {
//            ShowMessage("Error Loading File");
        Screen->Cursor = crDefault;
        return;
    }
    iTemp = fgetc(f);
    Value = "";
    for (int i=0;i<iTemp;i++) {
        c = fgetc(f);
        Value = Value + AnsiString(c);
    }
    Memo1->Lines->Clear();
    Memo1->Lines->Add(Value);
    width = fgetc(f);
    width += fgetc(f) << 8;
    width += fgetc(f) << 16;
    width += fgetc(f) << 24;
    Memo1->Lines->Add("Tiles across: " + IntToStr(width));

    height = fgetc(f);
    height += fgetc(f) << 8;
    height += fgetc(f) << 16;
    height += fgetc(f) << 24;
    Memo1->Lines->Add("Tiles down: " + IntToStr(height));

    iTemp = fgetc(f);
    Memo1->Lines->Add("Unknown ??: " + IntToStr(iTemp));
    Value = "";
    if (buffer != NULL) {
        free(buffer);
        buffer = NULL;
    }
    buffer = new byte[iTemp];
    buffersize = iTemp;
    for (int i=0;i<iTemp;i++) {
        buffer[i] = fgetc(f);
        Value = Value + IntToStr(buffer[i]) + ", ";
    }
    Value = Value.SubString(0,Value.Length()-2);
    Memo1->Lines->Add(Value);

    map = fgetc(f);
    map += fgetc(f) << 8;
    map += fgetc(f) << 16;
    map += fgetc(f) << 24;
    Memo1->Lines->Add("Map Number: " + IntToStr(map));

    unk = fgetc(f);
    unk += fgetc(f) << 8;
    unk += fgetc(f) << 16;
    unk += fgetc(f) << 24;
    Memo1->Lines->Add("Unknown ???: " + IntToStr(unk));
    if (buffer2 != NULL) {
        free(buffer2);
        buffer2 = NULL;
    }
    if (unk > 0) {
        buffer2 = new byte[unk*18];
        buffer2size = unk*18;
    }
    for (int i=0;i<unk*18;i++) {
        buffer2[i] = fgetc(f);
        Value = Value + IntToStr(buffer2[i]) + ", ";
        if (i%18 == 0) {
//                Memo1->Lines->Add(Value);
            Value = "";
        }
    }
    AdvStringGrid1->RowCount = (height*width)+1;
    AdvStringGrid1->Cells[0][0] = "X/Y";
    AdvStringGrid1->Cells[1][0] = "obj";
    AdvStringGrid1->Cells[2][0] = "tlei*32+obj2";
    AdvStringGrid1->Cells[3][0] = "tlei/8+tlef%2";
    AdvStringGrid1->Cells[4][0] = "tlef/2";
    AdvStringGrid1->Cells[5][0] = "cursor";
    AdvStringGrid1->Cells[6][0] = "??";
    AdvStringGrid1->Cells[7][0] = "??";
    AdvStringGrid1->Cells[8][0] = "??";
    int iRow = 1;
    iTemp = 0;
    iTemp = 0;
    int wcurrent, hcurrent;
    wcurrent = hcurrent = 0;
    while (hcurrent != height) {
        AdvStringGrid1->Cells[0][iRow] = IntToStr(int(hcurrent)) + " " + IntToStr(int(wcurrent));
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[1][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].obj1 = iTemp;
        if (iTemp%4 != 0) {
            Memo1->Lines->Add(IntToStr(int(hcurrent)) + " " + IntToStr(int(wcurrent)));
        }
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[2][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].obj2 = iTemp;
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[3][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].tle1 = iTemp;
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[4][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].tle2 = iTemp;
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[5][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].cursor1 = iTemp;
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[6][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].unk1 = iTemp;
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[7][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].unk2 = iTemp;
        iTemp = fgetc(f);
        AdvStringGrid1->Cells[8][iRow] = IntToStr(iTemp);
        mapData[hcurrent][wcurrent].unk3 = iTemp;
        iRow++;
        wcurrent++;
        if (wcurrent == width) {
            wcurrent = 0;
            hcurrent++;
        }
    }
    fclose(f);
    Screen->Cursor = crDefault;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -