Halo 3 Retail Game Research

Discussion about modding Halo 3.
User avatar
LuxuriousMeat





Posts: 824
Joined: Thu Nov 03, 2005 6:43 pm
Location: zzzzzzzzzzzzzzzz
Contact:

Post by LuxuriousMeat »

grimdoomer wrote:
Tural wrote:Bitmap raws are encrypted just like model raws are, if bitmaps could be, models could be too.
There encrypted? I thought they where just compressed?
I'm pretty sure they're encrypted.
Image
User avatar
kibito87




Stylist Connoisseur Advisor Bloodhound
Droplet Articulatist 500

Posts: 3461
Joined: Mon Feb 21, 2005 7:49 pm
Location: Ohio
Contact:

Post by kibito87 »

I thought they were both encrypted and compressed? Unless I heard wrong...I can't remember.
Image
User avatar
Tural




Conceptionist Acolyte Bloodhound Recreator
Socialist Connoisseur Droplet Scorched Earth
Grunge

Posts: 15628
Joined: Thu Jun 16, 2005 3:44 pm
Location: Lincoln, NE
Contact:

Post by Tural »

Semantics.
They aren't just the standard raws like the beta had.
User avatar
xzodia




Translator Connoisseur Coagulator

Posts: 1981
Joined: Sun May 15, 2005 10:31 am
Location: UK
Contact:

Post by xzodia »

Tural wrote:Semantics.
Not really, since a compression form would be a lot easier to figure out.
Image
Halo 2 Plugins | Lock-on To Just About Anything | My Sites | Snow Hog
Old Plugins you have, upgrade you must...
Always Maintain a High Quality-To-Crap Ratio.
User avatar
Tural




Conceptionist Acolyte Bloodhound Recreator
Socialist Connoisseur Droplet Scorched Earth
Grunge

Posts: 15628
Joined: Thu Jun 16, 2005 3:44 pm
Location: Lincoln, NE
Contact:

Post by Tural »

hj a[oy0y7qe5v]y uq350v-yh7q34h8g ae4yjtpq347bc

I was saying there is something preventing them from being extracted, unlike the beta, and that if one could be extracted, both could be. It doesn't matter if it's encryption, compression, or a giant damn padlock on the DVD case. That is not the important part of my post, at all. That is semantic. In addition, they've already been extracted, as was discussed before you went off on the unimportant tangent stemming from false prioritization of portions of my message.
User avatar
kornman00




ONI New Age

Posts: 146
Joined: Fri Dec 12, 2003 6:30 pm
Contact:

Post by kornman00 »

xzodia wrote: Not really, since a compression form would be a lot easier to figure out.
what makes you say that? they could very easily use a proprietary compression format which isn't documented...
Patrickssj6




Pi Collaborator

Posts: 5426
Joined: Sat Jul 24, 2004 12:12 pm
Location: I'm a Paranoid
Contact:

Post by Patrickssj6 »

kornman00 wrote:
xzodia wrote: Not really, since a compression form would be a lot easier to figure out.
what makes you say that? they could very easily use a proprietary compression format which isn't documented...
Well I'm pretty sure that every known compression method to man has already been documented. Unless of course Bungie employees have an average IQ of 180.

Trying to whip up a new efficient (I created one myself a long time ago; far from efficient but it worked) compressor is not that quite easy.

Mine was really easy...every time there was a sequence of more than three of the same numbers like 0000 it would store those as an array defined by "&" as the indicator for the array than "0" as the data and "4" as the number of how many times it appears so in the end you compressed "0000" to "&04".

Of course this would only save space if the file has big chunks of empty space like the map files originally did.

Anyway I drifted unintentionally off-topic.
...left for good
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

Prey if your still active I updated the Map Info whitepaper. If you want you can add it to the first post.

Code: Select all

public class BLF_Header : Chunk //48 Bytes
{
    [String(4)]
    public char[] _BLF;
    public int blfHeaderSize;
    public short unknown8;
    public short unknown10;
    public short asciiStartMarker;
    [String(34)]
    public char[] blfDescription;
}

public class LEVL : Chunk
{
    [String(4)]
    public char[] levl;
    [Size(2)]
    public byte[] unused;
    [String(2)]
    public char[] MP;
    public short unknown8; //Always 0003?
    public short unknown10; //Always 0001?
    public int mapIDEnd;
    public int mapIDStart;
    [String(StringType.Unicode, 32)]
    public char[] englishName;
    [String(StringType.Unicode, 32)]
    public char[] japaneseName;
    [String(StringType.Unicode, 32)]
    public char[] germanName;
    [String(StringType.Unicode, 32)]
    public char[] frenchName;
    [String(StringType.Unicode, 32)]
    public char[] spanishName;
    [String(StringType.Unicode, 32)]
    public char[] latinAmericanName;
    [String(StringType.Unicode, 32)]
    public char[] italianName;
    [String(StringType.Unicode, 32)]
    public char[] koreanName;
    [String(StringType.Unicode, 32)]
    public char[] chineseName;
    [String(StringType.Unicode, 32)]
    public char[] unknownName;
    [String(StringType.Unicode, 32)]
    public char[] portugueseName;
    [Size(64)]
    public byte[] unused724;
    [String(StringType.Unicode, 256)]
    public char[] englishDescription;
    [String(StringType.Unicode, 256)]
    public char[] japaneseDescription;
    [String(StringType.Unicode, 256)]
    public char[] germanDescription;
    [String(StringType.Unicode, 256)]
    public char[] frenchDescription;
    [String(StringType.Unicode, 256)]
    public char[] spanishDescription;
    [String(StringType.Unicode, 256)]
    public char[] latinAmericanName;
    [String(StringType.Unicode, 256)]
    public char[] italianDescription;
    [String(StringType.Unicode, 256)]
    public char[] koreanDescription;
    [String(StringType.Unicode, 256)]
    public char[] chineseDescription;
    [String(StringType.Unicode, 256)]
    public char[] unknownDescription;
    [String(StringType.Unicode, 256)]
    public char[] portugueseDescription;
    [String(256)]
    public char[] mapImageFileName;
    [String(256)]
    public char[] mapName;
    public int unknown4372;
    public int unknown4376;
    public byte maxTeamsGameType0;
    public byte maxTeamsGameType1;
    public byte maxTeamsGameType2;
    public byte maxTeamsGameType3;
    public byte maxTeamsGameType4;
    public byte maxTeamsGameType5;
    public byte maxTeamsGameType6;
    public byte maxTeamsGameType7;
    public byte maxTeamsGameType8;
    public byte maxTeamsGameType9;
    public byte maxTeamsGameType10;
    public byte maxTeamsGameType11;
    public byte maxTeamsGameType12;
    public byte maxTeamsGameType13;
    public byte maxTeamsGameType14;
    public byte maxTeamsGameType15;
    [Size(40)]
    public byte[] unused4380;
    public int missionNumber;
    [Size(32)]
    public byte[] unused4424;
    [String(StringType.Unicode, 32)]
    public char[] englishFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] japaneseFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] germanFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] frenchFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] spanishFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] latinAmericanFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] italianFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] koreanFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] chineseFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] unknownFirstCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] portugueseFirstCheckPointName;
    [Size(64)]
    public byte[] unused5160;
    [String(StringType.Unicode, 128)]
    public char[] englishFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] japaneseFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] germanFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] frenchFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] spanishFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] latinFirstCheckPointAmericanName;
    [String(StringType.Unicode, 128)]
    public char[] italianFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] koreanFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] chineseFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] unknownFirstCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] portugueseFirstCheckPointDescription;
    [Size(256)]
    public byte[] unused8040;
    public short unknown8296;
    public short unknown8298;
    [Size(4)]
    public byte[] unused8300;
    [String(StringType.Unicode, 32)]
    public char[] englishSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] japaneseSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] germanSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] frenchSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] spanishSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] latinAmericanSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] italianSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] koreanSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] chineseSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] unknownSecondCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] portugueseSecondCheckPointName;
    [Size(64)]
    public byte[] unused9008;
    [String(StringType.Unicode, 128)]
    public char[] englishSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] japaneseSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] germanSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] frenchSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] spanishSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] latinSecondCheckPointAmericanName;
    [String(StringType.Unicode, 128)]
    public char[] italianSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] koreanSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] chineseSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] unknownSecondCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] portugueseSecondCheckPointDescription;
    [Size(256)]
    public byte[] unused11888;
    public short unknown12136;
    public short unknown12138;
    [Size(4)]
    public byte[] unused12140;
    [String(StringType.Unicode, 32)]
    public char[] englishThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] japaneseThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] germanThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] frenchThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] spanishThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] latinAmericanThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] italianThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] koreanThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] chineseThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] unknownThirdCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] portugueseThirdCheckPointName;
    [Size(64)]
    public byte[] unused12848;
    [String(StringType.Unicode, 128)]
    public char[] englishThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] japaneseThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] germanThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] frenchThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] spanishThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] latinThirdCheckPointAmericanName;
    [String(StringType.Unicode, 128)]
    public char[] italianThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] koreanThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] chineseThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] unknownThirdCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] portugueseThirdCheckPointDescription;
    [Size(256)]
    public byte[] unused15728;
    public short unknown15976;
    public short unknown15978;
    [Size(4)]
    public byte[] unused15980;
    [String(StringType.Unicode, 32)]
    public char[] englishFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] japaneseFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] germanFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] frenchFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] spanishFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] latinAmericanFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] italianFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] koreanFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] chineseFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] unknownFourthCheckPointName;
    [String(StringType.Unicode, 32)]
    public char[] portugueseFourthCheckPointName;
    [Size(64)]
    public byte[] unused16688;
    [String(StringType.Unicode, 128)]
    public char[] englishFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] japaneseFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] germanFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] frenchFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] spanishFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] latinFourthCheckPointAmericanName;
    [String(StringType.Unicode, 128)]
    public char[] italianFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] koreanFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] chineseFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] unknownFourthCheckPointDescription;
    [String(StringType.Unicode, 128)]
    public char[] portugueseFourthCheckPointDescription;
    [Size(256)]
    public byte[] unused19568;
    [Size(14)]
    public byte[] unknown19824;
    [String(4)]
    public char[] _eof;
}

public class Certificate : Chunk
{
    public int EOFSize; 
    [Size(4)]
    public byte[] exponent; //?
    public int FileSize; //With out EOF 
    public byte unknown12;
    [Size(256)]
    public byte[] cypherText;
}
Last edited by shade45 on Sun Jul 06, 2008 2:24 pm, edited 2 times in total.
User avatar
grimdoomer




System Engineer

Posts: 1440
Joined: Mon Oct 09, 2006 4:36 pm

Post by grimdoomer »

:D

Code: Select all

public class Certificate : Chunk 
{ 
    public int EOFSize; 
    [Size(4)] 
    public byte[] exponent;
    public int FileSize; //With out EOF 
    public byte unknown12; 
    [Size(256)] 
    public byte[] cypherText; 
} 
Image
AI Zones in MP | Ambiance | Gravemind Beta v1.1
Aumaan Anubis wrote:Grimdoomer. The first person ever to mod Halo 2 Vista.
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

grimdoomer wrote::D

Code: Select all

public class Certificate : Chunk 
{ 
    public int EOFSize; 
    [Size(4)] 
    public byte[] exponent;
    public int FileSize; //With out EOF 
    public byte unknown12; 
    [Size(256)] 
    public byte[] cypherText; 
} 
Thanks I completely overlooked those values :D
User avatar
turk645




Artisan Translator Pyre

Posts: 2887
Joined: Wed May 18, 2005 12:32 pm
Location: In my special pillow fort.
Contact:

Post by turk645 »

:P ok, Veegie didnt give me a straight answer so i'm coming here. Where does the gametype information start in a saved film? I want to make forge FFA so i can see custom colors instead of team colors.
Image
ScottyGee wrote:Smokers suck >_< (to avoid someone saying it later, both literally and in the derogatory way)
"Before you criticize someone, walk a mile in their shoes. That way after you make fun of them, you still have their shoes."-Dranciel ಠ_ಠ
User avatar
Anthony




Translator Connoisseur New Age ONI

Posts: 1001
Joined: Thu Jul 06, 2006 10:19 pm
Location: Whittier, CA
Contact:

Post by Anthony »

shade45 wrote:
grimdoomer wrote::D

Code: Select all

public class Certificate : Chunk 
{ 
    public int EOFSize; 
    [Size(4)] 
    public byte[] exponent;
    public int FileSize; //With out EOF 
    public byte unknown12; 
    [Size(256)] 
    public byte[] cypherText; 
} 
Thanks I completely overlooked those values :D
well you never had to look at them... they are a few simple values that really dont help us with anything that we need to do
-DeToX-




Illusionist Recreator Connoisseur Acolyte
Sigma Decryptor Droplet Pyre
Blacksmith Socialist New Age System Engineer
ONI

Posts: 4589
Joined: Sun Jun 18, 2006 3:58 pm
Location: ...

Post by -DeToX- »

Cleaned up. Glad you guys could settle that.

Back on track now.
Image
User avatar
DEEhunter





Posts: 897
Joined: Sun Jun 19, 2005 4:04 pm
Location: 127.0.0.1
Contact:

Post by DEEhunter »

LuxuriousMeat wrote:

Code: Select all

public enum ImageKey : short
    {
        AButton              = 0x8480,
        BButton              = 0x8481,
        XButton              = 0x8482,
        YButton              = 0x8483,
        LeftShoulderButton   = 0x8484,
        RightShoulderButton  = 0x8485,
        LeftTrigger          = 0x8486,
        RightTrigger         = 0x8487,
        DPadUp               = 0x8488,
        DPadDown             = 0x8489,
        DpadLeft             = 0x848A,
        DPadRight            = 0x848B,
        StartButton          = 0x848C,
        BackButton           = 0x848D,
        LeftThumbStickStick  = 0x848E,
        RightThumbStickStick = 0x848F
    }
Image

Deviantart | My City | Wmclan | Gamertag | [url=irc://irc.halomods.com/melon]#melon[/url]
-DeToX-




Illusionist Recreator Connoisseur Acolyte
Sigma Decryptor Droplet Pyre
Blacksmith Socialist New Age System Engineer
ONI

Posts: 4589
Joined: Sun Jun 18, 2006 3:58 pm
Location: ...

Post by -DeToX- »

I looked at zanzibar.map and warehouse.map... Looked at what stringID's should be left_foot and right_foot in bipd, read the value...

The string ID was just an Int32 indicating the index.

Worked for everything I've read so far.

=|
Last edited by -DeToX- on Sat Jul 12, 2008 8:54 pm, edited 1 time in total.
Image
User avatar
Argon





Posts: 167
Joined: Sat Jun 28, 2008 6:05 pm

Post by Argon »

Nice, should help with plugins and even actual modding.
User avatar
Eaton




Enthraller

Posts: 1639
Joined: Thu Jun 14, 2007 4:16 pm
Location: USA

Post by Eaton »

Cool. So you have pretty much figured out String IDs now?
Image
Supermodder911




Connoisseur Coroner

Posts: 1262
Joined: Sun Sep 03, 2006 10:43 pm
Location: Michigan

Post by Supermodder911 »

-DeToX- wrote:I thought StringID's were hard to do based off what I was told?

I looked at zanzibar.map and warehouse.map... Looked at what stringID's should be left_foot and right_foot in bipd, read the value...

The string ID was just an Int32 indicating the index.

Worked for everything I've read so far.

=|
Good job.
Image
C Wizzle
User avatar
shade45




Translator Artisan Enthraller Logistician
Stylist Wave Firestorm New Age

Posts: 2270
Joined: Fri Apr 01, 2005 1:04 pm

Post by shade45 »

-DeToX- wrote:I looked at zanzibar.map and warehouse.map... Looked at what stringID's should be left_foot and right_foot in bipd, read the value...

The string ID was just an Int32 indicating the index.

Worked for everything I've read so far.

=|
Wow it was that easy lol :P Good find thanks for sharing.
-DeToX-




Illusionist Recreator Connoisseur Acolyte
Sigma Decryptor Droplet Pyre
Blacksmith Socialist New Age System Engineer
ONI

Posts: 4589
Joined: Sun Jun 18, 2006 3:58 pm
Location: ...

Post by -DeToX- »

Well shade, thats only for the first "group" I'm assuming.

It gets more complicated.

Code: Select all

Map: Sidewinder.map
Index: 1515(dec)
Offset in stringTable: 21805(dec)
Name: helmet
valueWritten: 00010134(hex)

Code: Select all

map: zanzibar
index: 5208(dec)
offset in stringTable: 102238(dec)
name: warthog_d
valueWritten: 0000199D(hex)

Code: Select all

map: sidewinder
index: 4425(dec)
offset in stringTable: 94224(dec)
name: warthog_d
valueWritten: 00000828(hex)
Image
Post Reply