News:

Don't forget to visit the main site! There's lots of helpful docs, patches, and more!

Main Menu

Metroid Prime Hacking :3 (56k FORBIDDEN!)

Started by Antidote, November 10, 2009, 11:07:06 PM

Previous topic - Next topic

Antidote

Here I will post screen shots of my discoveries while hacking Metroid Prime some will be humorous, while others will be down right weird.

WTF is a parasite Queen Doing here?
[spoiler][/spoiler]

Where is Waldo (Samus Style)
[spoiler][/spoiler]

Hide 'n Go Seek
[spoiler][/spoiler]

0.o
[spoiler][/spoiler]

Here is what appears to be the sky from Talon 4 at dusk (if there would have been real time in the game)
[spoiler][/spoiler]

that's all i can find ATM when i find more images i'll be sure to post them

Lunaria


personitis

Well I can tell emulator is Dolphin. He has the .iso files apparently. So all we need to really know is what programs you're using to rearrange things and look at the models.

Antidote

I'm not using any "Tools" however I am using interdpth's viewer, (which i am helping him create) to view the models and levels. I edited the ISO directly with 010 Hex editor, and yes I'm using a custom Dolphin emulator which has been optimized to run on my machine with a "decent" framerate of between 20 and 30 FPS.

Antidote

Well today I decided to look at the FRME format for metroid prime 1 and found out that the format is quite simple, with some rather weird differences through out

here is what i have so far (It's hacked together and not guaranteed to work)


//--------------------------------------
//--- 010 Editor v3.0.6 Binary Template
//
// File:
// Author:
// Revision:
// Purpose:
//--------------------------------------
#include "common-types.bt"

// #pragma byteorder(big_endian)
BigEndian();

// mark used bytes with a light green background
SetBackColor(cLtGreen);
struct FRME_FILE
{
    struct FRME_HEADER
    {
        uint32 unknown0;
        uint32 unknown1;
        uint32 unknown2;
        uint32 unknown3;
        uint32 unknownCount;
    }fileHeader;

    struct FRME_DATA
    {
        local uint32 i = 0;
        for (i = 0; i < fileHeader.unknownCount; i++)
        {
            struct
            {
                char tag[4];
                //uint8 unk1;
                string Name1;
                //uint8 unk2;
                string Name2;
                uint16 unknown1[2];
                uint32 unknown2[4];
                uint32 unknown3;
                switch(tag)
                {
                    case "BWIG":
                        uint8 unknown4;
                        uint16 unknownArray[unknown4];
                        float4 unknown5;
                        uint8 data[0x32];
                    break;
                    case "CAMR":
                        float4 translateValue;
                        uint32 unknown5[2];
                        uint8 unknown6;
                        switch(unknown6)
                        {
                            case 1:
                                uint8 unknown7;
                            break;
                            case 2:
                                uint8 unknownArray[2];
                            break;
                            case 69:
                                uint32 unknown7[2];
                            break;
                        }
                        uint16 unknown[0x1F];
                    break;
                    case "ENRG":
                        uint8 data[0x47];
                    break;
                    case "GRUP":
                        uint8 unknown4;
                        uint16 unknown5[2];
                        uint8 unknown6;
                        if (unknown5[1] != 0)
                            float3 unknown7;
                        else
                            uint16 unknown7[5];

                        uint8 unknown8[0x36];
                        //uint16 unknown8;
                        //uint8 data[0x48];
                    break;
                    case "HWIG":
                        uint8 data[0x43];
                    break;
                    case "IMGP":
                        uint8 data[0xA7];
                    break;
                    case "LITE":
                        uint8 data[0x63];
                    break;
                    case "MODL":
                        uint32 CMDL;
                        uint32 unknown4[2];
                        uint8 unknown5;
                        uint16 unk[unknown5];
                        float4 translateValue[2];
                        uint32 unknown6[8];
                        uint16 unknown7;
                    break;             
                    case "METR":
                        Printf("%s Here %i\n", tag, i);
                        uint16 unknown4;
                        uint32 unknown5;
                        uint8 data[0x47];
                    break;   
                    case "SLGP":
                        uint8 data[0x53];
                    break;       
                    case "TBGP":
                        uint8 data[0x66];
                    break;
                    case "TXPN":
                        float4 translateValue[2];
                        uint16 unknown4;
                        uint32 unknown5[0x08];
                        uint32 unknown6[2];
                        uint32 FONT <format = hex>;
                        uint32 unknown7[2];
                        uint8 unknownArrayCount;
                        uint16 unknownArray[unknownArrayCount];
                        float4 translateValue2[2];
                        uint8 data[0x22];
                    break; 

                }
            }widgetInfo;
        }
    }fileData;
           
};

struct FRME_FILE fileInfo;

infact it won't work without a specific file interdpth, revel8n and my self all have. this is just to show that I haven't stopped hacking metroid prime. Remember i'm still rather green to this hacking stuff, however I seem to have found my niche so far.

Sting_Chameleon

Wow. Thats pretty crazy. Samus is invisible! And so is her ship. I mean, is this mission like, supposedly has to be a STEALTH mission? She doesn't have to be invisible to pwn space pirates. LOL

But anyways, until there is a hacking program made, I guess everyone should stick to hex editing and discover completely random results until then.  :razz:

THE DUDExD

I've gotten Dolphin up to a pretty high Frame rate (somewhere around 70 FPS). If you want, I can post the links to the hardware I bought that is able to run everything. It's best if you want to have a mid to high-end PC to buy all the hardware either from the manufacturer, or some other source, then construct your computer (don't forget to use an ESD strap) the way you want - its a helluva lot cheaper than buying an already assembled computer from a retailer. Anyway, I'm new to the 010 Hex editor, I primarily use Microsoft Visual Studios 2010 VB and C++ software, so could you give me some tips and suggestions on how to use the editor?

Antidote

ESD straps are for noobs, also i don't really care about your hardware :P but you can post links for the benefit of others.

Antidote

Got the STRG files documented


//--------------------------------------
//--- 010 Editor v4.0.3 Binary Template
//
// File:
// Author:
// Revision:
// Purpose:
//--------------------------------------

local int StrCount;

struct Unicode
{
    SetBackColor((FTell() + Random(0xFFFFFF)) % 0xFFFFFF);
    wchar_t  str[ReadWStringLength(FTell(),1024)] ;
};

struct LANG
{
    char lang[4];
    int padding;
    int blockSize;
    union
    {
        struct
        {
            int type; // unsure
            switch(type)
            {
                case 0x00000C:
                    int unk1[2];
                break;
                case 0x000008:
                    int unk1;
                break;
            };
            Unicode strings[StrCount] <optimize = false>;
        }data;
        char rawData[blockSize];
    }block;
};

struct STRG
{
    int ID <format = hex>;
    int padding;
    int version;
    int strCount; // String count
    StrCount = strCount;
    LANG lang;
    char padding1[(FileSize() - FTell())];
}file;

Antidote

Here is an updated STRG template that supports Metroid Prime 3,
I'll be releasing an updated tool for it here soon.

//--------------------------------------
//--- 010 Editor v5.0 Binary Template
//
// File:
// Author:
// Revision:
// Purpose:
//--------------------------------------

BigEndian();
struct Unicode
{
    wchar_t  str[ReadWStringLength(FTell(),1024)] ;
};

struct MP3LangIdent
{
    char Lang[4];
};

struct LangIdent
{
    char Lang[4];
    uint32 padding;
    uint32 blockSize;
};

// Metroid Prime 3 does something weird
// It specifies the size of the string
// AND uses a null terminated string
// Oh Retro how redundant you can be
struct MP3StringEntry
{
    int StringLen;
    string String;
};

struct LangEntry
{
    int length;
    if (length > 4)
        char data[length - 4];
    Unicode strings[file.stringCount] <optimize = false>;
};

struct STRGTemplate
{
    int magic <format = hex>;
    if (magic != 0x87654321)
    {
        Warning("Not an STRG File");
        return;
    }
    int version;

    if (version != 0 && version != 1 && version != 3)
    {
        Warning("Unsupported version");
        return;
    }

    int languageCount;
    int stringCount;

    if (version == 0 || version == 1)
    {
        LangIdent langIdents[languageCount];
        if (version == 1)
        {
            uint unknown1;
            uint unknown2;
        }
        LangEntry entries[languageCount] <optimize = false>;
    }
    else if (version == 3)
    {
        int unk[2];
        MP3LangIdent langIdents[languageCount];
        int unkValues[((languageCount*stringCount)+(sizeof(int)*2)-2)];

        while (!FEof())
        {
            MP3StringEntry entry;
        }
    }
    char padding1[(FileSize() - FTell())];
}file;