Bone Tree Editor- development thread : Version 1.1 released

Started by TheShyGuy, September 13, 2010, 11:57:53 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

December 06, 2010, 08:40:18 PM #45 Last Edit: December 06, 2010, 08:41:12 PM by Tcll
Quote from: Tcll on December 05, 2010, 04:35:14 PM
I fixed the prob...
I was using a forth float when there was only three :P

so here's the template (so far):
...
copy that and paste it in:
C:/Documents and Settings\*user*\Application Data\ECSoftware\HexEdit\_mdl0.xml
and open an mdl0 file in HexEdit...

now, the template doesn't initiate automatically :/
when you open the mdl0,
go to 'view'-'template'-'split window'
and be sure to turn the auto sync on as well (looklike 3 red arrows "back, forth, back")

that should teach you the relocation table ;)

I forget how to get the 'auto sync' button...
I think you have to turn on the navigation toolbar :/
and cool  :af2:
just try to keep it as single file...
I hate multifiles DX

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

December 06, 2010, 10:19:57 PM #46 Last Edit: December 06, 2010, 10:27:36 PM by theshyguy
edit: looool found it..=p

heh :P

Quote from: Tcll on December 06, 2010, 03:25:46 AM
hey, you wanna turn this into a dev thread :)
(may help boost me in Tk as well as learning more about the MDL0 format)

^yes, I'll try this in Py
if I get this, then maybe I can get my converter ;)

btw, when I posted this,
it was just a few minutes before my bro turned his cpu off and I lost net...

so yea,
I couldn't have replied to your post after that because I was either in bed,
or at school... DX

I only get little time to actually use my cpu before losing net (6 hrs)
^I need at least 10-12 for what I do (another reson development is slow)

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

December 07, 2010, 02:49:52 AM #48 Last Edit: December 07, 2010, 03:17:34 AM by theshyguy
just got back from stuff and am going to look at mario mdl0 using your template....it looks like you know alot....all i know are bones(mainly) 0.o.....what should the title of the dev thread be about? bones or fully editing mdl0s?

edit: lol....its confusing...ill wait till tomoro i guess to talk about it..

yea...
I know it's confusing...
sry bout that :P

I can give you what I have of my notes (which are still growing)

note: polygons are not fully understood yet (you'll see why in the notes)

and I was just saying to use this page as a dev thread :/
can't hurt much there...

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

yeh notes would be nice...atm im making that undo button but i gotta fix this one thing....keeps screwing up lol

December 07, 2010, 09:43:41 PM #51 Last Edit: October 06, 2022, 02:38:03 AM by DarkPikachu
alright ^_^

they're a bit messy though...

mdl0 header:

0x00(4): MDL0 Identifier
0x04(4): MDL0 Size
0x08(4): Sections
0x0C(4): Model Nodes Offset

0x10(4): Definitions List
0x14(4): Bones List
0x18(4): Vertices List
0x1C(4): Normals List
0x20(4): Colors List
0x24(4): UV Points List
0x28(4): Materials 1 List
0x2C(4): Materials 2 List
0x30(4): Polygons List
0x34(4): Textures 1 List
0x38(4): Textures 2 List

0x3C(4): Model Name Offset
0x40(4): Header Length
0x44(4): Header Offset

0x48(4): ??
0x4C(4): ??
0x50(4): num Vertices
0x54(4): num Faces
0x58(4): ??
0x5C(4): num Nodes
0x60(4): Version
0x62(2): ??
0x64(2): ??
0x68(4): Box Min. X
0x6C(4): Box Min. Y
0x70(4): Box Min. Z
0x74(4): Box Max. X
0x78(4): Box Max. Y
0x7C(4): Box Max. Z
0x80(4): num Nodes (Copy??)

nodes... (num nodes * 4)

relocation table header: (group list)

0x00(4): block length
0x04(4): number of offsets
0x08(4): 'FFFF0000'
0x0C(2): ?? (maybe flags)
0x0E(2): ??
0x10(4): pad1
0x14(4): pad2

relocation table offset:

0x00(2): model ID
0x02(2): '0000'
0x04(2): ??
0x06(2): ??
0x08(4): string offset (- group list)
0x0C(4): data offset (- group list)

Definition data header: id(1)
--

Bone data header: id(2)

0x00(4): Header Length (Usually 000000D0)
0x04(4): MDL0 Offset
0x08(4): String Offset (- mdl0 offset)
0x0C(4): Bone Index
0x10(4): Node ID
0x14(4): Flags
0x18(4): Pad 1
0x1C(4): Pad 2
0x20(4): Scale X
0x24(4): Scale Y
0x28(4): Scale Z
0x2C(4): Rotation X
0x30(4): Rotation Y
0x34(4): Rotation Z
0x38(4): Translation X
0x3C(4): Translation Y
0x40(4): Translation Z
0x44(4): Box Min. X
0x48(4): Box Min. Y
0x4C(4): Box Min. Z
0x50(4): Box Max. X
0x54(4): Box Max. Y
0x58(4): Box Max. Z
0x5C(4): Parent Offset
0x60(4): First Child Offset
0x64(4): Next Offset
0x68(4): Previous Offset
0x6C(4): Bone Strings/Properties Offset (part2)

Uint32:
0x70(4): FrameMatrix Set 1 Float 1
0x74(4): FrameMatrix Set 2 Float 1
0x78(4): FrameMatrix Set 3 Float 1
0x7C(4): FrameMatrix Set 4 Float 1
0x80(4): FrameMatrix Set 1 Float 2
0x84(4): FrameMatrix Set 2 Float 2
0x88(4): FrameMatrix Set 3 Float 2
0x8C(4): FrameMatrix Set 4 Float 2
0x90(4): FrameMatrix Set 1 Float 3
0x94(4): FrameMatrix Set 2 Float 3
0x98(4): FrameMatrix Set 3 Float 3
0x9C(4): FrameMatrix Set 4 Float 3
0xA0(4): InverseBindMatrix Set 1 Float 1
0xA4(4): InverseBindMatrix Set 2 Float 1
0xA8(4): InverseBindMatrix Set 3 Float 1
0xAC(4): InverseBindMatrix Set 4 Float 1
0xB0(4): InverseBindMatrix Set 1 Float 2
0xB4(4): InverseBindMatrix Set 2 Float 2
0xB8(4): InverseBindMatrix Set 3 Float 2
0xBC(4): InverseBindMatrix Set 4 Float 2
0xC0(4): InverseBindMatrix Set 1 Float 3
0xC4(4): InverseBindMatrix Set 2 Float 3
0xC8(4): InverseBindMatrix Set 3 Float 3
0xCC(4): InverseBindMatrix Set 4 Float 3

flags:
0x0001 - NoTransform
0x0002 - FixedTranslation
0x0004 - FixedRotation
0x0008 - FixedScale
0x0010 - ??
0x0100 - ??
0x0200 - HasGeometry

vertex data header: id(3)

0x00(4): Block size
0x04(4): MDL0 Offset
0x08(4): Data Offset
0x0C(4): String Offset (- mdl0 offset)
0x10(4): Index ID
0x14(4): Bounding Box (1 == true)
0x18(4): Data type (4 == float)
0x1C(1): Modifier (always 0 for floats)
0x1D(1): Entry size
0x1E(2): Number of entries
0x20(4): Box Min. X
0x24(4): Box Min. Y
0x28(4): Box Min. Z
0x2C(4): Box Max. X
0x30(4): Box Max. Y
0x34(4): Box Max. Z
0x38(4): pad1
0x3C(4): pad2
0x40(?): Vertex data (usu 32bit)

Colors: id(5)

in image... (will edit)

polygon data header: id(9)

0x00(4): Size
0x04(4): MDL0 offset
0x08(4): Mesh weight/transform [NodeID] (-1)
0x0C(4): Vertex descriptor 1 (See Bits0)
0x10(4): Vertex descriptor 2 (See Bits1)
0x14(4): Number of uvs, colors, and normals per vertex (See Bits2)
0x18(4): Vertex descriptor position, normal, color source layout
0x1C(4): Vertex descriptor uv source layout
0x20(4): Offset to shader intructions
0x24(4): Size of data block
0x28(4): Size of data block (copy??)
0x2C(4): Offset to data block
0x30(4): Vetrex descriptor source layput
0x34(4): Unknown (Always 0x00000000)
0x38(4): String offset
0x3C(4): Index
0x40(4): Number of vertices
0x44(4): Number of faces

0x48(2): Position input
0x4A(2): Normal input
0x4C(2): Color0 input
0x4E(2): Color1 input
0x50(2): Coord0 input
0x52(2): Coord1 input
0x54(2): Coord2 input
0x56(2): Coord3 input
0x58(2): Coord4 input
0x5A(2): Coord5 input
0x5C(2): Coord6 input
0x5E(2): Coord7 input
0x60(4): Weights offset


Weight List
0x00(4): Number of weights
0x##(2): Weight index


Primitive Types
0x20 - Position matrix
0x28 - Normal matrix
0x30 - Texture matrix
0x38 - Light matrix

0x80 - Quads
0x90 - Triangles
0x98 - Tristrip
0xA0 - Trian
0xA8 - Lines
0xB0 - Linestrip
0xB8 - Points


_______
|       \
| Bits0  \
|_________\___________________________________
|                                             |
| 0000 0000  0000 000A   ABBC CDDE  FGHI JKLM |
|_____________________________________________|
|                                             |
| A = Color1                                  |
| B = Color0                                  |
| C = Normals                                 |
| D = Posiions                                |
| E = Texture transform0                      |
| F = Texture transform1                      |
| G = Texture transform2                      |
| H = Texture transform3                      |
| I = Texture transform4                      |
| J = Texture transform5                      |
| K = Texture transform6                      |
| L = Texture transform7                      |
| M = Position transform                      |
|_____________________________________________|

_______
|       \
| Bits1  \
|_________\___________________________________
|                                             |
| 0000 0000  0000 0000   AABB CCDD  EEFF GGHH |
|_____________________________________________|
|                                             |
| A = Coord7                                  |
| B = Coord6                                  |
| C = Coord5                                  |
| D = Coord4                                  |
| E = Coord3                                  |
| F = Coord2                                  |
| G = Coord1                                  |
| H = Coord0                                  |
|_____________________________________________|

_______
|       \
| Bits2  \
|_________\___________________________________
|                                             |
| 0000 0000  0000 0000   0000 0000  AAAA BBCC |
|_____________________________________________|
|                                             |
| A = UV                                      |
| B = Normals                                 |
| C = Colors                                  |
|_____________________________________________|



* 0 = none, 1 = normal, 2 = nbt

------------------------------------------------------

other useful data: these notes are kind of out of date.

All data is big endian.

BRES header:
u32 magic = 'bres'
u32 unknown
u32 filesize
u32 unknown
u32 other_magic = 'root'
u32 root directory length

BRES root directory @0x18:
u32 unknown
u32 ndirents
16 bytes unknown = ff ff 00 00 00 01 00 00
ndirents * struct {
u16 unknown[2]
u16 unknown[2]
u32 offset to dirname from start of directory
dirname is a null terminated string
u32 offset to data for entry from start of dir


}


MDL0 header:
u32 magic = 'MDL0'
u32 filesize
u32 (one less than offset index count?)
u32 unknown
u32 offsets to data block index blocks[]

data block index block { (0x260)
u32 index block length
u32 entry count (10 @ 0x264)
u32 unknown[2]
u32 zero[2]

0x278 - 0x378: array {
u16 model_id -- maps position blocks to normal blocks?
u16 zero
u16 unknown
u16 unknown
uint32 unknown (like 0x001a2f34):
model id? when added to start offset of this data block -- consistent between positions and normals...
uint32 offset to vertex position data block from start of this data block
} [10]
}

another data block index at 0x118, unknown0 = 0x0148, count=13

NodeMix block {
stream:
u8 nexttype {
00: done
02: mapping data, u16 -> u16
03: weighting data
}
nexttype == 02: {
u16 unknown1
u16 unknown2
}
nexttype == 03: {
u16 (some id?)
u8 number of weights
struct {
u16 transform_id
float weight
}[] weight_set
}
}

vertex position data block {
0x40 byte header {
uint32_t length of this block
int32_t offset to beginning of file (always negative)
...
uint32_t at 0x10:
index # of block (starts at 0, should be no gaps)

uint32_t at 0x14: {
0x01 = positions, has bounding box + zero pad
0x00 = normals, no bounding box data + zero pad
}
...
uint16_t at 0x1c: bytes per vertex (0x04 * #components) {
0x08 = UVs
0x0c = vertex and normal data
}
uint16_t at 0x1e = number of vertices to follow

0x20 {
float[6] (bounding box?)
uint32_t[2] zero
} (not present for normals)
}
component data follows: #vertices * #components float32
}


vertex array header: {
0x140 bytes long, almost completely unknown
u8 @ 0x0e {
0x14 or 0x54 for u8 datas
0x5e for u16 datas
}
u16 @ 0x1e (vertex count for a position data block) is:
0x80 for a 4 or 7 byte vertex struct layout
0xc0 for an 8 byte vertex struct layout
u16 @ 0x94 = byte length of 3rd component in the struct
only if @0x1e != 0xc0 and @0x0e != 0x14
}
vertex array data: {
u8 list type to follow {
0x00 == stop processing
0xB8 == points
0xA8 == lines
0xB0 == line strip
0x90 == triangles
0x98 == triangle strip
0xA0 == triangle fan
0x80 == quads
}
u16 = #verts to follow
if (@0x1e in header == 0xc0) {
u8 position idx
u8 unknown1
u16 unknown2
u8[4] more unknowns
} else {
component lengths defined in header (@0x0e, @0x94):
position idx
(uv or normal idx)
(uv or normal idx)
}
}

texture block: {
u32 entry count
entry (8 bytes) {
u32 unknown
u32 rel_offset to rel_offset to texture name (useless...)
}
}



and here's the image for the colors:

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

almost done making the undo button(technically i am) but i just need to make it so it records if you use the move up/down buttons...but im taking a break atm sooo ima look at this for a while^

the redo button is basically the same as undo so yeh it won't take as long for the redo

template UD:

everything from bones to uv's works now
mat1 still needs to be finished :/

oh and everything displays names now :P


<?xml version="1.0"?>
<!DOCTYPE binary_file_format SYSTEM "BinaryFileFormat.dtd">
<binary_file_format name="MDL0" type_name="" comment="" expr="" default_byte_order="big" default_read_only="false" default_char_set="ansi">
<define_struct type_name="offset_name" comment="" expr="">
<data type="int" name="str_len" format="unsigned" len="1" display=""/>
<data type="string" name="name" format="ascii" len="str_len" display=""/>
</define_struct>
<define_struct type_name="bounds" comment="" expr="">
<data type="int" name="min_X" format="unsigned" len="4" display=""/>
<data type="int" name="min_Y" format="unsigned" len="4" display=""/>
<data type="int" name="min_Z" format="unsigned" len="4" display=""/>
<data type="int" name="max_X" format="unsigned" len="4" display=""/>
<data type="int" name="max_Y" format="unsigned" len="4" display=""/>
<data type="int" name="max_Z" format="unsigned" len="4" display=""/>
<data type="none" name="pad" len="8"/>
</define_struct>
<define_struct type_name="relocation_group" comment="" expr="">
<data type="int" name="block_len" format="unsigned" len="4" display=""/>
<data type="int" name="num_offsets" format="unsigned" len="4" display=""/>
<data type="int" name="tag" format="unsigned" len="4" display="hex"/>
<data type="int" name="unk1" format="unsigned" len="2" display="hex"/>
<data type="int" name="unk2" format="unsigned" len="2" display="hex"/>
<data type="int" name="pad" format="unsigned" len="8" display="hex"/>
</define_struct>
<define_struct type_name="relocation_offset" comment="" expr="">
<data type="int" name="ID" format="unsigned" len="2" display=""/>
<data type="int" name="unk1" format="unsigned" len="2" display="hex"/>
<data type="int" name="unk2" format="unsigned" len="2" display="hex"/>
<data type="int" name="unk3" format="unsigned" len="2" display="hex"/>
<data type="int" name="string_offset" format="unsigned" len="4" display=""/>
<data type="int" name="data_offset" format="unsigned" len="4" display=""/>
</define_struct>
<define_struct type_name="Definitions" comment="" expr="">
<struct name="definition_header" type_name="" comment="" expr="">
<data type="none" name="tmp" len="4"/>
</struct>
</define_struct>
<define_struct type_name="Bones" comment="" expr="">
<struct name="bone_header" type_name="" comment="" expr="">
<data type="int" name="header_len" len="4" format="unsigned" display=""/>
<data type="int" name="MDL0_offset" len="4" format="signed" display=""/>
<data type="int" name="string_offset" len="4" format="unsigned" display=""/>
<data type="int" name="bone_index" len="4" format="unsigned" display=""/>
<data type="int" name="node_ID" len="4" format="unsigned" display=""/>
<data type="int" name="flags" len="4" format="unsigned" display=""/>
<data type="int" name="pad" len="8" format="unsigned" display=""/>
<struct name="loc_rot_sca" type_name="" comment="" expr="">
<data type="int" name="sca_X" format="unsigned" len="4" display=""/>
<data type="int" name="sca_Y" len="4" format="unsigned" display=""/>
<data type="int" name="sca_Z" len="4" format="unsigned" display=""/>
<data type="int" name="rot_X" len="4" format="unsigned" display=""/>
<data type="int" name="rot_Y" len="4" format="unsigned" display=""/>
<data type="int" name="rot_Z" len="4" format="unsigned" display=""/>
<data type="int" name="loc_X" len="4" format="unsigned" display=""/>
<data type="int" name="loc_Y" len="4" format="unsigned" display=""/>
<data type="int" name="loc_Z" len="4" format="unsigned" display=""/>
</struct>
<struct name="bound" type_name="" comment="" expr="">
<data type="int" name="min_X" len="4" format="unsigned" display=""/>
<data type="int" name="min_Y" len="4" format="unsigned" display=""/>
<data type="int" name="min_Z" len="4" format="unsigned" display=""/>
<data type="int" name="max_X" len="4" format="unsigned" display=""/>
<data type="int" name="max_Y" len="4" format="unsigned" display=""/>
<data type="int" name="max_Z" len="4" format="unsigned" display=""/>
</struct>
<data type="int" name="parent" len="4" format="signed" display=""/>
<data type="int" name="child" len="4" format="unsigned" display=""/>
<data type="int" name="next" len="4" format="unsigned" display=""/>
<data type="int" name="prev" len="4" format="unsigned" display=""/>
<data type="int" name="part2" len="4" format="unsigned" display=""/>
</struct>
<struct name="frame_matrix" type_name="" comment="" expr="">
<data type="int" name="s_1_1" format="signed" len="4" display=""/>
<data type="int" name="s_2_1" format="signed" len="4" display=""/>
<data type="int" name="s_3_1" format="signed" len="4" display=""/>
<data type="int" name="s_4_1" format="signed" len="4" display=""/>
<data type="int" name="s_1_2" format="signed" len="4" display=""/>
<data type="int" name="s_2_2" format="signed" len="4" display=""/>
<data type="int" name="s_3_2" format="signed" len="4" display=""/>
<data type="int" name="s_4_2" format="signed" len="4" display=""/>
<data type="int" name="s_1_3" format="signed" len="4" display=""/>
<data type="int" name="s_2_3" format="signed" len="4" display=""/>
<data type="int" name="s_3_3" format="signed" len="4" display=""/>
<data type="int" name="s_4_3" format="signed" len="4" display=""/>
</struct>
<struct name="inverse_matrix" type_name="" comment="" expr="">
<data type="int" name="s_1_1" format="signed" len="4" display=""/>
<data type="int" name="s_2_1" format="signed" len="4" display=""/>
<data type="int" name="s_3_1" format="signed" len="4" display=""/>
<data type="int" name="s_4_1" format="signed" len="4" display=""/>
<data type="int" name="s_1_2" format="signed" len="4" display=""/>
<data type="int" name="s_2_2" format="signed" len="4" display=""/>
<data type="int" name="s_3_2" format="signed" len="4" display=""/>
<data type="int" name="s_4_2" format="signed" len="4" display=""/>
<data type="int" name="s_1_3" format="signed" len="4" display=""/>
<data type="int" name="s_2_3" format="signed" len="4" display=""/>
<data type="int" name="s_3_3" format="signed" len="4" display=""/>
<data type="int" name="s_4_3" format="signed" len="4" display=""/>
</struct>
</define_struct>
<define_struct type_name="Vertices" comment="" expr="">
<struct name="vertice_header" type_name="" comment="" expr="">
<data type="int" name="block_size" len="4" format="unsigned" display=""/>
<data type="int" name="MDL0_offset" len="4" format="signed" display=""/>
<data type="int" name="data_offset" len="4" format="unsigned" display=""/>
<data type="int" name="string_offset" len="4" format="unsigned" display=""/>
<data type="int" name="ID" len="4" format="unsigned" display=""/>
<data type="int" name="isXYZ" len="4" format="unsigned" display=""/>
<data type="int" name="type" len="4" format="unsigned" display=""/>
<data type="int" name="modifier" len="1" format="unsigned" display=""/>
<data type="int" name="entry_stride" len="1" format="unsigned" display=""/>
<data type="int" name="num_vertices" len="2" format="unsigned" display=""/>
<if test="isXYZ == 1" comment="">
<use_struct name="bounds" expr="" type_name="bounds" comment=""/>
</if>
</struct>
<data type="string" name="vertices" len="vertice_header.entry_stride * vertice_header.num_vertices" format="default" display="vert structures" comment="I could've put a 'FOR' here,
but it'd take too long when loading the file"/>
<data type="none" name="pad" len="vertice_header.block_size - (vertice_header.entry_stride*vertice_header.num_vertices) - 64"/>
</define_struct>
<define_struct type_name="Normals" comment="" expr="">
<struct name="normal_header" type_name="" comment="" expr="">
<data type="int" name="block_size" len="4" format="unsigned" display=""/>
<data type="int" name="MDL0_offset" len="4" format="signed" display=""/>
<data type="int" name="data_offset" len="4" format="unsigned" display=""/>
<data type="int" name="string_offset" len="4" format="unsigned" display=""/>
<data type="int" name="ID" len="4" format="unsigned" display=""/>
<data type="int" name="isXYZ" len="4" format="unsigned" display=""/>
<data type="int" name="type" len="4" format="unsigned" display=""/>
<data type="int" name="modifier" len="1" format="unsigned" display=""/>
<data type="int" name="entry_stride" len="1" format="unsigned" display=""/>
<data type="int" name="num_normals" len="2" format="unsigned" display=""/>
<if test="isXYZ == 1" comment="">
<use_struct name="bounds" expr="" type_name="bounds" comment=""/>
</if>
</struct>
<data type="string" name="normals" format="default" display="normal structures" len="normal_header.entry_stride*normal_header.num_normals" comment="I could've put a 'FOR' here,
but it'd take too long when loading the file"/>
<data type="none" name="pad" len="normal_header.block_size - (normal_header.entry_stride*normal_header.num_normals) - 32"/>
</define_struct>
<define_struct type_name="Colors" comment="" expr="">
<struct name="color_header" type_name="" comment="" expr="">
<data type="int" name="block_size" len="4" format="signed" display=""/>
<data type="int" name="MDL0_offset" len="4" format="signed" display=""/>
<data type="int" name="data_offset" len="4" format="signed" display=""/>
<data type="int" name="string_offset" len="4" format="signed" display=""/>
<data type="int" name="ID" len="4" format="signed" display=""/>
<data type="int" name="isRGBA" len="4" format="signed" display=""/>
<data type="int" name="type" len="4" format="signed" display=""/>
<data type="int" name="entry_stride" len="1" format="signed" display=""/>
<data type="int" name="modifier" len="1" format="signed" display=""/>
<data type="int" name="num_colors" len="2" format="signed" display=""/>
</struct>
<for name="color" count="color_header.num_colors || color_header.num_colors - 1" stop_test="color_header.num_colors == 0" type_name="" comment="">
<data type="none" name="color" len="color_header.entry_stride"/>
</for>
<data type="none" name="pad" len="color_header.block_size - (color_header.num_colors*color_header.entry_stride) - 32"/>
</define_struct>
<define_struct type_name="UV_Points" comment="" expr="">
<struct name="UV_header" type_name="" comment="" expr="">
<data type="int" name="block_size" len="4" format="unsigned" display=""/>
<data type="int" name="MDL0_offset" len="4" format="signed" display=""/>
<data type="int" name="data_offset" len="4" format="unsigned" display=""/>
<data type="int" name="string_offset" len="4" format="unsigned" display=""/>
<data type="int" name="ID" len="4" format="unsigned" display=""/>
<data type="int" name="isXY" len="4" format="unsigned" display=""/>
<data type="int" name="type" len="4" format="unsigned" display=""/>
<data type="int" name="modifier" len="1" format="unsigned" display=""/>
<data type="int" name="entry_stride" len="1" format="unsigned" display=""/>
<data type="int" name="num_UVs" len="2" format="unsigned" display=""/>
<if test="isXY == 1" comment="">
<struct name="bounds" expr="" type_name="" comment="">
<data type="int" name="min_X" format="unsigned" len="4" display=""/>
<data type="int" name="min_Y" format="unsigned" len="4" display=""/>
<data type="int" name="max_X" format="unsigned" len="4" display=""/>
<data type="int" name="max_Y" format="unsigned" len="4" display=""/>
<data type="none" name="pad" len="16"/></struct>
</if>
</struct>
<data type="string" name="UVs" len="UV_header.entry_stride * UV_header.num_UVs" format="default" display="uv structures" comment="I could've put a 'FOR' here,
but it'd take too long when loading the file"/>
<data type="none" name="pad" len="UV_header.block_size - (UV_header.entry_stride*UV_header.num_UVs) - 64"/>
</define_struct>
<define_struct type_name="Materials1" comment="" expr="">
<struct name="header" type_name="" comment="" expr="">
<data type="int" name="block_size" len="4" format="unsigned" display=""/>
<data type="int" name="MDL0_offset" len="4" format="signed" display=""/>
<data type="int" name="string_offset" len="4" format="unsigned" display=""/>
<data type="int" name="ID" len="4" format="unsigned" display=""/>
<data type="int" name="unk1" len="4" format="unsigned" display=""/>
<data type="int" name="textures" len="1" format="unsigned" display=""/>
<data type="int" name="num_layers" len="1" format="unsigned" display=""/>
<data type="int" name="Flag3" len="1" format="unsigned" display=""/>
<data type="int" name="Flag4" len="1" format="unsigned" display=""/>
<data type="int" name="type" len="4" format="unsigned" display=""/>
<data type="int" name="Flag5" len="1" format="unsigned" display=""/>
<data type="int" name="Flag6" len="1" format="unsigned" display=""/>
<data type="int" name="Flag7" len="1" format="unsigned" display=""/>
<data type="int" name="Flag8" len="1" format="unsigned" display=""/>
<data type="int" name="unk3" format="unsigned" len="4" display=""/>
<data type="int" name="unk4" format="signed" len="4" display=""/>
<data type="int" name="data_offset" format="signed" len="4" display=""/>
<data type="int" name="num_textures" format="signed" len="4" display=""/>
<data type="int" name="P3_offset" format="signed" len="4" display=""/>
<data type="int" name="P4_offset" format="signed" len="4" display=""/>
<data type="int" name="P5_offset" format="signed" len="4" display=""/>
<data type="int" name="unk6" format="signed" len="4" display=""/>
</struct>
<jump offset="header.P3_offset+(header.MDL0_offset*-1)" comment="" origin="start">
<struct name="texture_ref" type_name="" comment="" expr="">
<data type="int" name="unk" format="unsigned" len="4" display=""/>
</struct>
</jump>
</define_struct>
<define_struct type_name="Materials2" comment="" expr="">
<struct name="header" type_name="" comment="" expr="">
<data type="none" name="tmp" len="4"/>
</struct>
</define_struct>
<define_struct type_name="Polygons" comment="" expr="">
<struct name="header" type_name="" comment="" expr="">
<data type="none" name="tmp" len="4"/>
</struct>
</define_struct>
<define_struct type_name="Textures1" comment="" expr="">
<struct name="header" type_name="" comment="" expr="">
<data type="none" name="tmp" len="4"/>
</struct>
</define_struct>
<define_struct type_name="Textures2" comment="" expr="">
<struct name="header" type_name="" comment="" expr="">
<data type="none" name="tmp" len="4"/>
</struct>
</define_struct>
<struct name="header" type_name="" comment="" expr="">
<data type="string" name="magic" len="4" format="ascii" display=""/>
<data type="int" name="filesize" format="unsigned" len="4" display=""/>
<data type="int" name="sections" format="unsigned" len="4" display=""/>
<data type="int" name="nodes" format="signed" len="4" display=""/>
<struct name="lists" type_name="" comment="" expr="">
<data type="int" name="Definitions" format="unsigned" len="4" display=""/>
<data type="int" name="Bones" format="unsigned" len="4" display=""/>
<data type="int" name="Vertices" format="unsigned" len="4" display=""/>
<data type="int" name="Normals" format="unsigned" len="4" display=""/>
<data type="int" name="Colors" format="unsigned" len="4" display=""/>
<data type="int" name="UV_Points" format="unsigned" len="4" display=""/>
<data type="int" name="Materials1" format="unsigned" len="4" display=""/>
<data type="int" name="Materials2" format="unsigned" len="4" display=""/>
<data type="int" name="Polygons" format="unsigned" len="4" display=""/>
<data type="int" name="Textures1" format="unsigned" len="4" display=""/>
<data type="int" name="Textures2" format="unsigned" len="4" display=""/>
</struct>
<data type="int" name="name_offset" format="unsigned" len="4" display=""/>
<data type="int" name="header_len" format="unsigned" len="4" display=""/>
<data type="int" name="header_offset" format="signed" len="4" display=""/>
<data type="int" name="unk1" format="unsigned" len="4" display=""/>
<data type="int" name="unk2" format="unsigned" len="4" display=""/>
<data type="int" name="num_verticies" format="unsigned" len="4" display=""/>
<data type="int" name="num_faces" format="unsigned" len="4" display=""/>
<data type="int" name="unk3" format="unsigned" len="4" display=""/>
<data type="int" name="num_nodes" format="unsigned" len="4" display=""/>
<data type="int" name="version" format="unsigned" len="4" display=""/>
<data type="int" name="unk4" format="unsigned" len="2" display=""/>
<data type="int" name="unk5" format="unsigned" len="2" display=""/>
<struct name="bounds" type_name="" comment="" expr="">
<data type="int" name="min_X" format="unsigned" len="4" display=""/>
<data type="int" name="min_Y" format="unsigned" len="4" display=""/>
<data type="int" name="min_Z" format="unsigned" len="4" display=""/>
<data type="int" name="max_X" format="unsigned" len="4" display=""/>
<data type="int" name="max_Y" format="unsigned" len="4" display=""/>
<data type="int" name="max_Z" format="unsigned" len="4" display=""/>
</struct>
</struct>
<jump offset="header.nodes * -1" comment="" origin="start">
<struct name="nodes" type_name="" comment="" expr="">
<data type="int" name="num_nodes" format="signed" len="4" display=""/>
<for name="node" count="num_nodes || num_nodes - 1" stop_test="num_nodes == 0" type_name="" comment="">
<data type="int" name="node" format="signed" len="4" display=""/>
</for>
</struct>
</jump>
<if test="header.sections &gt;= 0 &amp;&amp; header.lists.Definitions != 0" comment="">
<jump offset="header.lists.Definitions" comment="" origin="start">
<struct name="Definitions" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Definitions" comment="" origin="start">
<use_struct name="Definitions" expr="" type_name="Definitions" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Definitions - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 1 &amp;&amp; header.lists.Bones != 0" comment="">
<jump offset="header.lists.Bones" comment="" origin="start">
<struct name="Bones" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Bones" comment="" origin="start">
<use_struct name="Bone_data" expr="" type_name="Bones" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Bones - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 2 &amp;&amp; header.lists.Vertices != 0" comment="">
<jump offset="header.lists.Vertices" comment="" origin="start">
<struct name="Vertices" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Vertices" comment="" origin="start">
<use_struct name="Vertices" expr="" type_name="Vertices" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Vertices - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 3 &amp;&amp; header.lists.Normals != 0" comment="">
<jump offset="header.lists.Normals" comment="" origin="start">
<struct name="Normals" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Normals" comment="" origin="start">
<use_struct name="Normals" expr="" type_name="Normals" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Normals - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 4 &amp;&amp; header.lists.Colors != 0" comment="">
<jump offset="header.lists.Colors" comment="" origin="start">
<struct name="Colors" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Colors" comment="" origin="start">
<use_struct name="Colors" expr="" type_name="Colors" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Colors - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 5 &amp;&amp; header.lists.UV_Points != 0" comment="">
<jump offset="header.lists.UV_Points" comment="" origin="start">
<struct name="UV_Points" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.UV_Points" comment="" origin="start">
<use_struct name="UV_Points" expr="" type_name="UV_Points" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.UV_Points - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 6 &amp;&amp; header.lists.Materials1 != 0" comment="">
<jump offset="header.lists.Materials1" comment="" origin="start">
<struct name="Materials1" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Materials1" comment="" origin="start">
<use_struct name="Materials1" expr="" type_name="Materials1" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Materials1 - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 7 &amp;&amp; header.lists.Materials2 != 0" comment="">
<jump offset="header.lists.Materials2" comment="" origin="start">
<struct name="Materials2" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Materials2" comment="" origin="start">
<use_struct name="Materials2" expr="" type_name="Materials2" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Materials2 - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 8 &amp;&amp; header.lists.Polygons != 0" comment="">
<jump offset="header.lists.Polygons" comment="" origin="start">
<struct name="Polygons" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Polygons" comment="" origin="start">
<use_struct name="Polygons" expr="" type_name="Polygons" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Polygons - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 9 &amp;&amp; header.lists.Textures1 != 0" comment="">
<jump offset="header.lists.Textures1" comment="" origin="start">
<struct name="Textures1" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Textures1" comment="" origin="start">
<use_struct name="Textures1" expr="" type_name="Textures1" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Textures1 - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<if test="header.sections &gt;= 10 &amp;&amp; header.lists.Textures2 != 0" comment="">
<jump offset="header.lists.Textures2" comment="" origin="start">
<struct name="Textures2" type_name="" comment="" expr="">
<use_struct name="relocation_group" expr="" type_name="relocation_group" comment=""/>
<for name="data" count="relocation_group.num_offsets || relocation_group.num_offsets - 1" stop_test="relocation_group.num_offsets == 0" type_name="" comment="">
<struct name="data" type_name="" comment="" expr="{this.offset_name.name}">
<use_struct name="relocation_offset" expr="" type_name="relocation_offset" comment=""/>
<jump offset="relocation_offset.data_offset + header.lists.Textures2" comment="" origin="start">
<use_struct name="Textures2" expr="" type_name="Textures2" comment=""/>
</jump>
<jump offset="relocation_offset.string_offset + header.lists.Textures2 - 1" comment="" origin="start">
<use_struct name="offset_name" expr="" type_name="offset_name" comment=""/>
</jump>
</struct>
</for>
</struct>
</jump>
</if>
<data type="none" name="none"/>
</binary_file_format>


replace your existing _mdl0.xml with this^
enjoy

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

December 08, 2010, 12:46:13 AM #54 Last Edit: December 08, 2010, 12:49:56 AM by theshyguy
lol..you definitely know more than me about mdl0s....

edit: ill look  at the mdl0 stuff in prob an hour...gonna take a break lol

December 08, 2010, 01:54:51 AM #55 Last Edit: December 08, 2010, 01:56:55 AM by Tcll
Quote from: theshyguy on December 08, 2010, 12:46:13 AM
lol..you definitely know more than me about mdl0s....

edit: ill look  at the mdl0 stuff in prob an hour...gonna take a break lol

heh...
try being a game developer :P

I know how models work...
the thing I'm trying to figure out is the MDL0 shaders...

heh...
if I can figure those out, I could actually give Pikachu fur and make him look real :D

just look at this image:
Sorry but you are not allowed to view spoiler contents.

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

niiicce...soo if you do add fur like that to pikachu wouldn't that mean rewriting the mdl0?...which means if I want to help I gotta figure out how they're set up...

game developer huh? Have you used anything yet to create one? Ex I tried xna(indie games) and it was pretty fun...i wanted to make a shyguy fighting game...but that'd be copyright =p.

Quote from: theshyguy on December 08, 2010, 02:28:03 AM
niiicce...soo if you do add fur like that to pikachu wouldn't that mean rewriting the mdl0?...which means if I want to help I gotta figure out how they're set up...
well, there really wouldn't be too much to re-wire once the format is figured out :/

my main goal right now is getting Pichu in brawl :D (from melee)

Quote from: theshyguy on December 08, 2010, 02:28:03 AM
game developer huh? Have you used anything yet to create one? Ex I tried xna(indie games) and it was pretty fun...
I use blender... although I havn't really came out with any games...
but at least I know what to do, so that's a start... :P
(I'm only 19, I'll get better, well... faster as I get older)

Quote from: theshyguy on December 08, 2010, 02:28:03 AM
i wanted to make a shyguy fighting game...but that'd be copyright =p.
who cares...
if that's true then my video would be copywrite
title: "Pikachu vs Dark Pikachu"

or my main vid (WIP) "Super Smash Bros. Revenge of the Forgotton"
info: the vid includes the brawl chars, the 5 missing melee chars, and bomberman
(BM was in brawl)

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.

December 08, 2010, 02:51:58 AM #58 Last Edit: December 08, 2010, 03:00:50 AM by theshyguy
lol i don't think they care much about vids no offense....but with xna you can sell your games on xbox 360 live market place ->indie games lol that why i wouldnt be able...id probably get sued =p

edit: you got some errors in your newest code

Quote from: theshyguy on December 08, 2010, 02:51:58 AM
lol i don't think they care much about vids no offense....but with xna you can sell your games on xbox 360 live market place ->indie games lol that why i wouldnt be able...id probably get sued =p

I see...

I'm not sure how yet, but you can compile your blender games into a single exe file :/
(instead of having the blender player with a bunch of dll files and at least a single .blend file)

heh, I know how to edit the exe to change the directory of the loaded .blend file :D
I learned how when I was trying to build my 3D-MUGEN game engine...

it was supposed to be the exact same thing as MUGEN, but with a few extra features (excluding 3D)

[spoiler]Quote: Friedslick6
you have been through a lot of hassle. I've watched every topic you posted on this, and most of them seemed to disintegrate gradually.
But the coolest part was that you didn't stop working on it despite that.

Quote: Internet Explorer
you're doing more with your life right now than probably most other people around you. You're a valuable asset to the Smash community. So yeah, you should be proud.

quote: Greg
You do have a gift which I've seen many developers use to their advantage. You can become a great coder, and with all of those ideas I think you can really build something great.