Handmade Hero»Episode Guide
Writing the Asset File Header
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
00:00:38Recap and plan for the day
00:00:38Recap and plan for the day
00:00:38Recap and plan for the day
00:02:27Bug determining when sounds finish playing
00:02:27Bug determining when sounds finish playing
00:02:27Bug determining when sounds finish playing
00:10:28Rearchitecting the mixing loop to avoid this sort of bug. Removing a secondary variable to avoid having to keep it in sync
00:10:28Rearchitecting the mixing loop to avoid this sort of bug. Removing a secondary variable to avoid having to keep it in sync
00:10:28Rearchitecting the mixing loop to avoid this sort of bug. Removing a secondary variable to avoid having to keep it in sync
00:12:16On the importance of assertions
00:12:16On the importance of assertions
00:12:16On the importance of assertions
00:13:41Write assertions to catch the kind of errors that you tend to make
00:13:41Write assertions to catch the kind of errors that you tend to make
00:13:41Write assertions to catch the kind of errors that you tend to make
00:15:36Back to the test asset builder
00:15:36Back to the test asset builder
00:15:36Back to the test asset builder
00:21:01Trick to avoid modifying lots of code to reflect the change of a variable from object to pointer
00:21:01Trick to avoid modifying lots of code to reflect the change of a variable from object to pointer
00:21:01Trick to avoid modifying lots of code to reflect the change of a variable from object to pointer
00:26:03Data that we want to include in the asset file
00:26:03Data that we want to include in the asset file
00:26:03Data that we want to include in the asset file
00:27:52Pragma-packing the file format structures
00:27:52Pragma-packing the file format structures
00:27:52Pragma-packing the file format structures
00:28:45The hha header and its magic value
00:28:45The hha header and its magic value
00:28:45The hha header and its magic value
00:33:44Overview of the structure of the asset file
00:33:44Overview of the structure of the asset file
00:33:44Overview of the structure of the asset file
00:38:40Using offsets and counts to access asset content
00:38:40Using offsets and counts to access asset content
00:38:40Using offsets and counts to access asset content
00:44:40Writing the header from the test asset builder
00:44:40Writing the header from the test asset builder
00:44:40Writing the header from the test asset builder
00:46:06Two ways of computing the offsets of tags, asset types, and assets
00:46:06Two ways of computing the offsets of tags, asset types, and assets
00:46:06Two ways of computing the offsets of tags, asset types, and assets
00:50:56Streaming files mini-rant (extended in the first question of the Q&A)
00:50:56Streaming files mini-rant (extended in the first question of the Q&A)
00:50:56Streaming files mini-rant (extended in the first question of the Q&A)
00:52:51Writing out the arrays
00:52:51Writing out the arrays
00:52:51Writing out the arrays
00:58:42Stepping through the code
00:58:42Stepping through the code
00:58:42Stepping through the code
01:06:05Hex editing the resulting file
01:06:05Hex editing the resulting file
01:06:05Hex editing the resulting file
01:07:35Q&A
🗩
01:07:35Q&A
🗩
01:07:35Q&A
🗩
01:08:02gasto5 Why is a position for a stream a bad idea?
🗪
01:08:02gasto5 Why is a position for a stream a bad idea?
🗪
01:08:02gasto5 Why is a position for a stream a bad idea?
🗪
01:17:00insofaras Are you concerned that "trusting" the file format could have security concerns, e.g. someone could say they've made some modded assets, and give out a specially crafted .hha file that runs arbitrary code?
🗪
01:17:00insofaras Are you concerned that "trusting" the file format could have security concerns, e.g. someone could say they've made some modded assets, and give out a specially crafted .hha file that runs arbitrary code?
🗪
01:17:00insofaras Are you concerned that "trusting" the file format could have security concerns, e.g. someone could say they've made some modded assets, and give out a specially crafted .hha file that runs arbitrary code?
🗪
01:21:09snovind92 What is the main difference between using asserts in your code and writing separate test functions/programs that check your results, and when do you choose one over the other?
🗪
01:21:09snovind92 What is the main difference between using asserts in your code and writing separate test functions/programs that check your results, and when do you choose one over the other?
🗪
01:21:09snovind92 What is the main difference between using asserts in your code and writing separate test functions/programs that check your results, and when do you choose one over the other?
🗪
01:23:42noxy_key Will multiple threads pose any problems to reading the assets file?
🗪
01:23:42noxy_key Will multiple threads pose any problems to reading the assets file?
🗪
01:23:42noxy_key Will multiple threads pose any problems to reading the assets file?
🗪
01:24:11flyingsand If C++ had introspection, would this be a a place where you would use it? e.g. to introspect the types you want to include in the asset pack
🗪
01:24:11flyingsand If C++ had introspection, would this be a a place where you would use it? e.g. to introspect the types you want to include in the asset pack
🗪
01:24:11flyingsand If C++ had introspection, would this be a a place where you would use it? e.g. to introspect the types you want to include in the asset pack
🗪
01:26:16revolvable Are there any specific times your streams start and end?
🗪
01:26:16revolvable Are there any specific times your streams start and end?
🗪
01:26:16revolvable Are there any specific times your streams start and end?
🗪
01:27:17cubercaleb Why not just read the entire file in as a string and parse it as you please, then do the same for writing
🗪
01:27:17cubercaleb Why not just read the entire file in as a string and parse it as you please, then do the same for writing
🗪
01:27:17cubercaleb Why not just read the entire file in as a string and parse it as you please, then do the same for writing
🗪
01:30:43psuedonym73 Another option is to memory-map the file and then do as you will. Although that may not work on older consoles
🗪
01:30:43psuedonym73 Another option is to memory-map the file and then do as you will. Although that may not work on older consoles
🗪
01:30:43psuedonym73 Another option is to memory-map the file and then do as you will. Although that may not work on older consoles
🗪
01:33:19davechat Do the mollyrocket artists ever interact with the asset packer or is it automated somehow. E.g. if they immediately want to preview how their artwork looks in game
🗪
01:33:19davechat Do the mollyrocket artists ever interact with the asset packer or is it automated somehow. E.g. if they immediately want to preview how their artwork looks in game
🗪
01:33:19davechat Do the mollyrocket artists ever interact with the asset packer or is it automated somehow. E.g. if they immediately want to preview how their artwork looks in game
🗪
01:33:56gasto5 I was taught to use exceptions because it does not convolute the code with error checking code
🗪
01:33:56gasto5 I was taught to use exceptions because it does not convolute the code with error checking code
🗪
01:33:56gasto5 I was taught to use exceptions because it does not convolute the code with error checking code
🗪
01:35:25pseudonym73 (clarification to question at 1:30:43) When I said "memory-mapped file", I meant it as an alternative to fread(), not as an alternative to streamed loading. Using fread() actually copies all data twice: buffer cache into FILE* buffer, then buffer into final destination. Copying from a memory-mapped file means only one copy
🗪
01:35:25pseudonym73 (clarification to question at 1:30:43) When I said "memory-mapped file", I meant it as an alternative to fread(), not as an alternative to streamed loading. Using fread() actually copies all data twice: buffer cache into FILE* buffer, then buffer into final destination. Copying from a memory-mapped file means only one copy
🗪
01:35:25pseudonym73 (clarification to question at 1:30:43) When I said "memory-mapped file", I meant it as an alternative to fread(), not as an alternative to streamed loading. Using fread() actually copies all data twice: buffer cache into FILE* buffer, then buffer into final destination. Copying from a memory-mapped file means only one copy
🗪