1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
/******************************************************************************
* brlan.h *
* Part of Benzin *
* Handles BRLAN banner datas. *
* Copyright (C)2009 SquidMan (Alex Marshall) <SquidMan72@gmail.com> *
* Copyright (C)2009 megazig (Stephen Simpson) <megazig@hotmail.com> *
* Copyright (C)2009 Matt_P (Matthew Parlane) *
* Copyright (C)2009 comex *
* Copyright (C)2009 booto *
* All Rights Reserved, HACKERCHANNEL. *
******************************************************************************/
#ifndef BRLAN_H_
#define BRLAN_H_
#include "types.h"
typedef enum
{
RLPA_ENTRY = 0, // Pane Animation .aka. Pane variable animation
// byte 1 not used byte 2 is which variable
// *( &pane.XTrans + type2<<2 ) = result
RLTS_ENTRY = 1, // Texture ScaleRotateTranslate Mapping
// byte 1 is which SRT and byte 2 is which elem.
// *( GetTexSRTArray()[type1] + (type2*4) ) = result
RLVI_ENTRY = 2, // Visibility // stores data2 to bottom of flag1
// bytes 1 and 2 arent' used
// ( pane.flag1 & 0xfe ) |= ( result & 0x01 )
RLVC_ENTRY = 3, // Vertex Color // byte2 is passed to Pane::SetColorElement();
// byte 1 not used byte 2 is which vertex and color
// 16-19 goes to unknown vars
// 20-23 goes to textureCoordinate pointer :D
// Pane::SetColorElement( type2 , result );
RLMC_ENTRY = 4, // Material Color
// byte1 is not used byte 2 is which color
// Material::SetColorElement( type2 , color );
RLTP_ENTRY = 5, // TPL Pallete
// byte 1 is which Texture byte 2 must be 0
// SetTextureNoWrap( type1 , (return_val<<2) + anim_basic.pointer2 );
RLIM_ENTRY // IndTexSRTAry Material
// byte 1 is which SRT and byte 2 is which elem.
// *( GetIndTexSRTArray()[type1] + (type2*4) ) = result
} brlan_entry_type;
typedef struct
{
fourcc magic; // "pai1" in ASCII.
u32 size; // Size of section, which is rest of the file. (header.file_size - header.offset_pai1)
u16 framesize; // Framesize
u8 flags; // Flags // isLoopData
u8 padding; // Padding
u16 num_timgs; // Number of timgs?
u16 num_entries; // Number of tags in the brlan.
u32 padding2; // Only if bit 25 of flags is set.
u32 entry_offset; // Offset to entries. (Relative to start of pai1 header.)
} brlan_pai1_header_type2;
typedef struct
{
fourcc magic; // "RLAN" in ASCII.
u16 endian; // Always 0xFEFF. Tells endian.
u16 version; // Always 0x0008. Version of brlan format
u32 file_size; // Size of whole file, including the header.
u16 pai1_offset; // The offset to the pai1 header from the start of file.
u16 pai1_count; // How many pai1 sections there are (duh, only 1... wtf?)
} brlan_header;
typedef struct
{
fourcc magic; // "pai1" in ASCII.
u32 size; // Size of section, which is rest of the file. (header.file_size - header.offset_pai1)
u16 framesize; // Framesize
u8 flags; // Flags
u8 padding; // Padding
u16 num_timgs; // Number of timgs?
u16 num_entries; // Number of tags in the brlan.
} brlan_pai1_universal;
typedef struct
{
fourcc magic; // "pai1" in ASCII.
u32 size; // Size of section, which is rest of the file. (header.file_size - header.offset_pai1)
u16 framesize; // Framesize
u8 flags; // Flags
u8 padding; // Padding
u16 num_timgs; // Number of timgs?
u16 num_entries; // Number of tags in the brlan.
u32 entry_offset; // Offset to entries. (Relative to start of pai1 header.)
} brlan_pai1_header_type1; // followed by offset list
typedef struct // pointed at by offset list + pai1_header
{
char name[20]; // Name of the BRLAN entry. (Must be defined in the BRLYT)
u8 num_tags;
u8 is_material; // if 0 it's the name of a pane
u8 pad[2];
} brlan_entry; // followed by offset list
typedef struct // pointed at by offset list + brlan_entry
{
fourcc magic;
u8 entry_count; // How many entries in this chunk.
u8 pad1; // All cases I've seen is zero.
u8 pad2; // All cases I've seen is zero.
u8 pad3; // All cases I've seen is zero.
} tag_header;
typedef struct
{
u32 offset; // Offset to the data pointed to by this entry.
// Relative to the start of the RLPA header.
} tag_entry;
typedef struct
{
//u16 type; // Type (look at animtypes)
u8 type1;
u8 type2;
u16 data_type; // Every case has been 0x0200 // 0x0100 for pairs
u16 coord_count; // How many coordinates.
u16 pad1; // All cases I've seen is zero.
u32 offset; // Offset to tag data
} tag_entryinfo;
typedef struct
{ // Bits not listed here are currently unknown.
u32 part1; // If Bit 9 is set in flags, this is an f32, with a coordinate. (Bit 17 seems to act the same)
u32 part2; // If Bit 16 is set in flags, this is an f32, with another coordinate. (Bit 17 seems to act the same)
u32 part3; // With Bit 16 set in flags, this seems to be yet another coordinate. (Bit 17 seems to act the same)
} tag_data;
typedef struct
{
u32 part1;
u16 part2;
u16 padding;
} tag_data2;
void parse_brlan(char* filename, char *filenameout);
void make_brlan(char* infile, char* outfile);
#endif //BRLAN_H_
|