Content: Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Background: Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Pattern: Blank Waves Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Welcome to Xbox Chaos: Modding Evolved

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

Sign in to follow this  
Followers 0
0xdeafcafe

Reach
Feature Film Format

7 posts in this topic

This is the format of Halo: Reach Films. enjoy.

Header of film:


struct FilmHeader
{
Int32 CreationDate, // Offset: 0x7C
AsciiString CreationAuthor, //Offset 0x88
Int32 ModificationDate, // Offset: 0xA0
AsciiString ModificationAuthor, // Offset: 0xAC
UnicodeString FilmName, //Offset 0xC0
UnicodeString FilmDescription, //Offset 0x1C0
AsciiString InfoString, // Offset: 0x3D8
UnicodeString GametypeName, //Offset 0x998
UnicodeString GametypeDescription, //Offset 0xA98
AsciiString MapName, // Offset: 0x1011C
AsciiString MapRallyPoint, // Offset: 0x10220
UnicodeString MatchmakingPlaylistName, //Offset 0x10342
UnicodeString UsermapName, //Offset 0x10460
UnicodeString usermapDescription //Offset 0x10560
}

Now, the player table is a table which holds the data of each unique player. Sadly unlike in Halo3 they don't give you the length of the number of people in the player table, and it can be aslong as it needs to be (think about it, you can have films with more than 16 people..). Anyway, i'll come onto that later. This is the location of the table and length of each entry.


class PlayerTableData
{
int PlayerTableStartLocation = 0x01DE11;
int PlayerTableEntryLength = 0x108;
}

Now we have that, I'll explain my hacky of grabbing each player from the table.


void LoadPlayerTable()
{
bool contReadingPlayerTable = true;
int playerTableIndex = 0;

// Keep looping until we set 'contReadingPlayerTable' to false.
while (contReadingPlayerTable)
{
// Get the offset of the start of the current player table entry
long currentEntryOffset = PlayerTable.PlayerTableStartLocation + (PlayerTable.PlayerTableEntryLength * playerTableIndex);

// Read the gamertag at the start of the entry
_filmReader.SeekTo(currentEntryOffset + 0x0F);
string tmpGamertag = _filmReader.ReadUTF16();

// Is the string a Null or just Whitespace?
if (String.IsNullOrWhiteSpace(tmpGamertag))
// Yes, the player doesn't exist and there are no more. Stop looping.
contReadingPlayerTable = false;
else
{
// Nope, the player exists, load all data about player.
// Insert ALL the loading code.

// Increase player Table Index
playerTableIndex++;
}
}
}

Okay, now for the "fun" stuff. This contains the offsets of every customizable object the game stores in the 'PlayerTableEntry'. (Look below for the enum's for everything you shall read). All the offsets are relative to the start of the current 'PlayerTableEntry'.


struct PlayerTableEntry
{
UnicodeString Gamertag, // Offset: 0x0F
UnicodeString ServiceTag, // Offset: 0x53
UnicodeString Gamertag2, // Offset: 0xC7

byte Gender, // Offset: 0x37
byte ArmourColourPrimary,
byte ArmourColourSecondary,
byte VisorColour,
byte Species,

byte EmblemForeground, // Offset: 0x3F
byte EmblemBackground,
byte EmblemForegroundTog,
byte EmblemPrimaryColour,
byte EmblemSecondaryColour,
byte EmblemBackgroundColour,
byte EmblemBackground,
byte EmblemBackground,

byte Helmet, // Offset: 0x47
byte LeftShoulder,
byte RightShoudler,
byte Chest,
byte Wrist,
byte Utility,
byte KneeGuards,
byte EliteMilitaryArmour,
byte ArmourEffect, // For some reason the engine writes the same byte 2 times. So this and the next byte are the ArmourEffect
byte ArmourEffect, // Simply just read the first one, then write it back 2 times.
byte FirefightVoice
}

Now for the repetitive part. These are the enum's for everything stored:


/// <summary>
/// Offset: 0x37
/// </summary>
public enum SpartanGender
{
Male,
Female
}

/// <summary>
/// Offset: 0x3B
/// </summary>
public enum Species
{
Spartan,
Elite
}

/// <summary>
/// Offset: 0x3A
/// </summary>
public enum VisorColour
{
Default = 0x00,
Silver = 0x01,
Blue = 0x02,
Gold = 0x03,
Black = 0x04
}

/// <summary>
/// Offset: 0x47
/// </summary>
public enum Helmet
{
MarkVBase = 0x00,
MarkVUA = 0x01,
MarkVUAHUL = 0x02,
CQCBase = 0x03,
CQCCBRN = 0x04,
CQCUAHUL = 0x05,
MilitaryPoliceBase = 0x06,
MilitaryPoliceCBRNHURS = 0x07,
MilitaryPoliceHURSCNM = 0x08,
ODSTBase = 0x09,
ODSTUACNM = 0x0A,
ODSTCBRNHUL = 0x0B,
HazopBase = 0x0C,
HazopCBRNHUL = 0x0D,
HazopCNMI = 0x0E,
EODBase = 0x0F,
EODCNM = 0x10,
EODUANUL = 0x11,
OperatorBase = 0x12,
OperatorUAHUL = 0x13,
OperatorCNM = 0x14,
GrenadierBase = 0x15,
GrenadierUA = 0x16,
GrenadierUAFC = 0x17,
AirAssaultBase = 0x18,
AirAssaultUACNM = 0x19,
AirAssaultFCI = 0x1A,
ScoutBase = 0x1B,
ScoutHURS = 0x1C,
ScoutCBRNCNM = 0x1D,
EVABase = 0x1E,
EVACNM = 0x1F,
EVAAUAHUL3 = 0x20,
JFOBase = 0x21,
JFOHULI = 0x22,
JFOUA = 0x23,
CommandoBase = 0x24,
CommandoCBRNCNM = 0x25,
CommandoUAFCI2 = 0x26,
MjolnirMkVBase = 0x27,
MjolnirMkVCNM = 0x28,
MjolnirMkVUA = 0x29,
PilotBase = 0x2A,
PilotHUL3 = 0x2B,
PilotUAHUL3 = 0x2C,
PilotHaunted = 0x2D,
SecurityBase = 0x2E,
SecurityUAHUL = 0x2F,
SecurityCBRNCNM = 0x30,
ReconBase = 0x3A,
ReconHUL = 0x3B,
ReconUAHUL3 = 0x3C,
EVACBase = 0x3D,
EVACCNM = 0x3E,
EVACHUL3 = 0x3F,
MjolnirMkVIBase = 0x31,
MjolnirMkVIFCI2 = 0x32,
MjolnirMkVIUAHULI = 0x33,
CQBBase = 0x34,
CQBHURSCNM = 0x35,
CQBUAHUL = 0x36,
GungnirBase = 0x37,
GungnirHURS = 0x38,
GungnirCBRN = 0x39,
}

/// <summary>
/// Left Shoulder Offset: 0x48
/// Right Shoulder Offset: 0x49
/// </summary>
public enum Shoulder
{
Default = 0x00,
FJPara = 0x01,
Hazop = 0x02,
JFO = 0x03,
Recon = 0x04,
UAMultiThread = 0x05,
JumpJet = 0x06,
Eva = 0x07,
Gungnir = 0x08,
ODST = 0x11,
UABaseSecurity = 0x09,
CQC = 0x0A,
Operator = 0x0B,
Commando = 0x0C,
Grenadier = 0x0D,
Sniper = 0x0E,
MjolnirMkV = 0x0F,
Security = 0x10
}

/// <summary>
/// Offset: 0x4A
/// </summary>
public enum Chest
{
Default = 0x00,
UABaseSecurity = 0x01, // Lord Zedd r cool.
UAMultiThreat = 0x02, // Lord Zedd r cool.
HPHalo = 0x03,
UACounterAssault = 0x04,
TacticalLRP = 0x05,
TacticalRecon = 0x06,
CollarGrenadier = 0x07,
TacticalPatrol = 0x08,
CollarBreacher = 0x09,
AssaultSapper = 0x0A,
AssaultCommando = 0x0B,
HPParafoil = 0x0C,
CollarGrenadierUA = 0x0D,
UAMultuThreatW = 0x0E,
UABaseSecurityW = 0x0F,
CollarBreacherR = 0x10,
HPParafoilR = 0x11,
AssaultSapperR = 0x12,
UAODST = 0x13
}

/// <summary>
/// Offset: 0x4B
/// </summary>
public enum Wrist
{
Default = 0x00,
UABuckler = 0x01,
UABracer = 0x02,
TacticalTacPad = 0x03,
AssaultBreacher = 0x04,
TacticalUGPS = 0x05
}

/// <summary>
/// Offset: 0x4C
/// </summary>
public enum Utility
{
Default = 0x00,
TacticalSoftCase = 0x01,
UAChobam = 0x02,
UANxRA = 0x03,
TacticalTraumaKit = 0x04,
TacticalHardCase = 0x05
}

/// <summary>
/// Offset: 0x4D
/// </summary>
public enum KneeGuards
{
Default = 0x00,
JFPara = 0x01,
Gungnir = 0x02,
Grenadier = 0x03
}

/// <summary>
/// Offset: 0x4E
/// </summary>
public enum EliteMilitaryRank
{
Minor = 0x00,
SpecOps = 0x01,
Ranger = 0x02,
Ultra = 0x03,
Zealot = 0x04,
General = 0x05,
FieldMarshall = 0x06,
Officer = 0x07
}

/// <summary>
/// Offset: 0x4F
/// </summary>
public enum ArmourEffect
{
Default = 0x00,
RedFlames = 0x01,
BlueFlames = 0x02,
BirthdayParty = 0x03,
HeartAttack = 0x04,
Pestilence = 0x05,
InclementWeather = 0x06
}

/// <summary>
/// Offset: 0x51
/// </summary>
public enum FirefightVoice
{
NobleSix = 0x00,
CortanaAI = 0x01,
JohnS117 = 0x02,
GYSGTBuck = 0x03,
SGTMAJJohnson = 0x04,
GYSGTStacker = 0x05,
CarterS259 = 0x06,
KatS320 = 0x07,
JunS226 = 0x08,
Emile239 = 0x09,
JorgeS052 = 0x0A,
AuntieDotAI = 0x0B
}

public enum Colours
{
Steel,
Silver,
White,
Brown,
Tan,
Khaki,
Sage,
Olive,
Drab,
Forest,
Green,
SeaFoam,
Teal,
Aqua,
Cyan,
Blue,
Cobalt,
Ice,
Violet,
Orchid,
Lavender,
Maroon,
Brick,
Rose,
Rust,
Coral,
Peach,
Gold,
Yellow,
Pale,
UltraWhite = 0x1F
}
public enum EmblemBackground
{
Blank,
Circle,
Diamond,
Plus,
Square,
Triangle,
VerticalStripe,
HorizontalStripe,
Cleft,
CrissCross,
PointedStar8,
Star,
CowboyHat,
ThickStar,
Banner,
Diamonds4,
Sun,
Hexagon,
VerticalHexagon,
Chalice,
Octagon,
Pentagon,
InvertedPentagon,
RacingStripes,
HorizontagStripes,
Gradient,
HorizontalGradient,
Oval,
VerticalOval,
BluntDiamond,
BluntDiamond2,
SharpDiamond,
SharpDiamond2,
Aero,
DeltaWing,
Asterisk,
Blam,
Blam2,
Shield,
Display,
DreamCatcher,
BuzzSaw,
FourPlots,
BalloFire,
Cog,
Sprocket,
FaceMask,
FaceMask2,
SmallCircle,
Cancel,
Crown,
SnappyHat,
ThreePlots
}
public enum EmblemForeground
{
SeventhColumn,
BullsEye,
Vortex,
Halt,
Spartan,
PowerIsOn,
SpartanLeague,
Delta,
Noted,
Stuck,
Phoenix,
Champion,
JollyRoger,
ActiveRooster,
Campfire,
RadioActive,
Smiley,
Frowney,
NoCampaing,
Sol,
DoubleCrescent,
TinYang,
Helmet,
Triad,
CupOfDeath,
Rose,
Thor,
SkullKing,
DogTags,
Castle,
FlamingNinja,
Pirate,
Spades,
Clubs,
Diamonds,
Hearts,
Wasp,
Mombassa,
Drone,
Grunt,
Lips,
Capsule,
Buffalo,
GasMask,
Jokers,
SpartanHelmet,
Atomic,
Valkyrie,
Headshot,
ConeD,
Leo,
Bulltrue,
Runes,
Arrowhead,
CrossedSwords,
Unicorn,
Wolf,
Anchor,
Chaos,
Elephant,
Daisy,
Crosshairs,
Infected,
Tomcat,
Supernova,
FleurDeLis,
BearClaw,
FlamingHorns,
BlackWidow,
Peacefist,
Number1,
Number2,
Number3,
Number4,
Number5,
Number6,
Number7,
Number8,
Number9,
Number0
}
public enum EmblemForegroundToggle
{
Toggled,
UnToggled
}

SnipeStyle, halolordkiller3 and AMD like this

Share this post


Link to post
Share on other sites

Going to research H3 Films tonight. Should only take 2 hours or so. A lot less Armour/Colours/Emblems.

Share this post


Link to post
Share on other sites
Sign in to follow this  
Followers 0