[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Writing the Asset File Header" vod_platform=youtube id=UNXHK8O-B_g annotator=ZedZull annotator=Miblo annotator=debiatan] [00:00:38][Recap and plan for the day] [00:02:27][Bug determining when sounds finish playing] [00:10:28][Rearchitecting the mixing loop to avoid this sort of bug. Removing a secondary variable to avoid having to keep it in sync] [00:12:16][On the importance of assertions] [00:13:41][Write assertions to catch the kind of errors that you tend to make] [00:15:36][Back to the test asset builder] [00:21:01][Trick to avoid modifying lots of code to reflect the change of a variable from object to pointer] [00:26:03][Data that we want to include in the asset file] [00:27:52][Pragma-packing the file format structures] [00:28:45][The hha header and its magic value] [00:33:44][Overview of the structure of the asset file] [00:38:40][Using offsets and counts to access asset content] [00:44:40][Writing the header from the test asset builder] [00:46:06][Two ways of computing the offsets of tags, asset types, and assets] [00:50:56][Streaming files mini-rant (extended in the first question of the Q&A)] [00:52:51][Writing out the arrays] [00:58:42][Stepping through the code] [01:06:05][Hex editing the resulting file] [01:07:35][Q&A][:speech] [01:08:02][@gasto5][Why is a position for a stream a bad idea?] [01:17:00][@insofaras][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:09][@snovind92][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:42][@noxy_key][Will multiple threads pose any problems to reading the assets file?] [01:24:11][@flyingsand][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:16][@revolvable][Are there any specific times your streams start and end?] [01:27:17][@cubercaleb][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:43][@psuedonym73][Another option is to memory-map the file and then do as you will. Although that may not work on older consoles] [01:33:19][@davechat][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:56][@gasto5][I was taught to use exceptions because it does not convolute the code with error checking code] [01:35:25][@pseudonym73][(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] [/video]