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

📄 unit1.cpp

📁 网络游戏《红月》客户端RMM文件查看修改工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AdvGrid"
#pragma link "BaseGrid"
#pragma resource "*.dfm"
TForm1 *Form1;
byte *buffer;
int buffersize;
byte *buffer2;
int buffer2size;

int mapx, mapy;
const int cobjNum = 1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    mapx = mapy = 0;
    for (int i=0;i<241;i++) {
        for (int j=0;j<128;j++) {
            tleData[i][j].loaded = false;
            tleData[i][j].imageloaded = false;
        }
    }
    for (int i=0;i<1417;i++) {
        for (int j=0;j<128;j++) {
            objData[i][j].loaded = false;
            objData[i][j].imageloaded = false;
        }
    }
}
//---------------------------------------------------------------------------

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

        f = fopen(OpenDialog1->FileName.c_str(),"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;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SaveDialog1->FileName = OpenDialog1->FileName;
    if (SaveDialog1->Execute()) {
        Screen->Cursor = crHourGlass;
        FILE *f;
        char c;
        int iTemp;
        AnsiString Value;

        f = fopen(SaveDialog1->FileName.c_str(),"wb");
        if (f == NULL) {
//            ShowMessage("Error Loading File");
            Screen->Cursor = crDefault;
            return;
        }
        iTemp = 19;
        fwrite(&iTemp,1,1,f);
        Value = "RedMoon MapData 1.0";
        fwrite(Value.c_str(), Value.Length(), 1, f);
        fwrite(&width,4,1,f);
        fwrite(&height,4,1,f);
        fwrite(&buffersize,1,1,f);
        fwrite(buffer,buffersize,1,f);
        fwrite(&map,4,1,f);
        fwrite(&unk,4,1,f);
        fwrite(buffer2,buffer2size,1,f);

        for (int i=1;i<AdvStringGrid1->RowCount;i++) {
            iTemp = atoi(AdvStringGrid1->Cells[1][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[2][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[3][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[4][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[5][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[6][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[7][i].c_str());
            fwrite(&iTemp,1,1,f);
            iTemp = atoi(AdvStringGrid1->Cells[8][i].c_str());
            fwrite(&iTemp,1,1,f);
        }
        fclose(f);
        Screen->Cursor = crDefault;
    }
}
//---------------------------------------------------------------------------

void TForm1::loadtle(int filenum)
{
    if (tleData[filenum][0].loaded == true) {
        return;
    }
    Screen->Cursor = crHourGlass;
    FILE *f;
    char c;
    int iTemp;
    int rmdnum, count;
    AnsiString Value;

    Value.sprintf("%5d",filenum);
    Value = StringReplace(Value," ","0", TReplaceFlags() << rfReplaceAll);
    Value = "C:\\Redmoon\\Datas\\Tle\\tle" + Value + ".rmd";
    f = fopen(Value.c_str(),"rb");
    if (f == NULL) {
        Screen->Cursor = crDefault;
        return;
    }
    iTemp = fgetc(f);
    Value = "";
    for (int i=0;i<iTemp;i++) {
        c = fgetc(f);
        Value = Value + AnsiString(c);
    }
    rmdnum = fgetc(f);
    rmdnum += fgetc(f) << 8;
    rmdnum += fgetc(f) << 16;
    rmdnum += fgetc(f) << 24;

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);

    count = fgetc(f);
    count += fgetc(f) << 8;
    count += fgetc(f) << 16;
    count += fgetc(f) << 24;
    int iRow = 1;
    int items = 0;
    while (items <= count) {
        int iNum=0;
        iNum = fgetc(f);
        iNum += fgetc(f) << 8;
        iNum += fgetc(f) << 16;
        iNum += fgetc(f) << 24;
        for (int j=0;j<iNum;j++) {
            for (int i=1;i<13;i++) {
                iTemp = fgetc(f);
                iTemp += fgetc(f) << 8;
                iTemp += fgetc(f) << 16;
                iTemp += fgetc(f) << 24;
                switch (i) {
                    case 1:
                        tleData[filenum][items].xstart = iTemp;
                        break;
                    case 2:
                        tleData[filenum][items].ystart = iTemp;
                        break;
                    case 3:
                        tleData[filenum][items].xend = iTemp;
                        break;
                    case 4:
                        tleData[filenum][items].yend = iTemp;
                        break;
                    case 12:
                        tleData[filenum][items].tlenumber = iTemp;
                        break;
                }
            }
            iRow++;
        }
        tleData[filenum][items].loaded = true;
        items++;
    }
    fclose(f);
    Screen->Cursor = crDefault;
}
//---------------------------------------------------------------------------

void TForm1::loadobj(int filenum)
{
    if (objData[filenum][0].loaded == true) {
        return;
    }
    Screen->Cursor = crHourGlass;
    FILE *f;
    char c;
    int iTemp;
    int rmdnum, count;
    AnsiString Value;

    Value.sprintf("%5d",filenum);
    Value = StringReplace(Value," ","0", TReplaceFlags() << rfReplaceAll);
    Value = "C:\\Redmoon\\Datas\\obj\\obj" + Value + ".rmd";
    f = fopen(Value.c_str(),"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);
    }
    rmdnum = fgetc(f);
    rmdnum += fgetc(f) << 8;
    rmdnum += fgetc(f) << 16;
    rmdnum += fgetc(f) << 24;

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);
    iTemp += fgetc(f) << 8;
    iTemp += fgetc(f) << 16;
    iTemp += fgetc(f) << 24;

    iTemp = fgetc(f);

    count = fgetc(f);
    count += fgetc(f) << 8;
    count += fgetc(f) << 16;
    count += fgetc(f) << 24;

    int iRow = 1;
    int items = 0;
    while (items <= count) {
        int iNum=0;
        iNum = fgetc(f);
        iNum += fgetc(f) << 8;
        iNum += fgetc(f) << 16;
        iNum += fgetc(f) << 24;
        for (int j=0;j<iNum;j++) {
            for (int i=1;i<13;i++) {
                iTemp = fgetc(f);
                iTemp += fgetc(f) << 8;
                iTemp += fgetc(f) << 16;
                iTemp += fgetc(f) << 24;
                if (j == cobjNum) {
                    switch (i) {
                        case 1:
                            objData[filenum][items].xstart = iTemp;
                            break;
                        case 2:
                            objData[filenum][items].ystart = iTemp;
                            break;
                        case 3:
                            objData[filenum][items].xend = iTemp;
                            break;
                        case 4:
                            objData[filenum][items].yend = iTemp;
                            break;
                        case 5:
                            objData[filenum][items].xOffset = iTemp;
                            break;
                        case 6:
                            objData[filenum][items].yOffset = iTemp;
                            break;
                        case 12:
                            objData[filenum][items].tlenumber = iTemp;
                            break;
                    }
                }
            }
            iRow++;
        }
        objData[filenum][items].loaded = true;
        items++;
    }
    fclose(f);
    Screen->Cursor = crDefault;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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