aboutsummaryrefslogtreecommitdiff
path: root/brlan.h
blob: 3cde79fd463f36c4f2a1a9ece2a949b84ee38a84 (plain) (blame)
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
/******************************************************************************\
*  brlan.h                                                                     *
*  Part of Benzin                                                              *
*  Handles BRLAN banner datas.                                                 *
*  Copyright (c)2009 HACKERCHANNEL Team                                        *
\******************************************************************************/

#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_