[video output=day512 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Updating Assets via HHT Files" vod_platform=youtube id=WSziFN_wG4w annotator=Miblo]
[0:01][Recap and set the stage for the day][:speech]
[1:32][Set up to use the traditional announcer voice in honour of Day 512, as per @ivereadthesequel's request][:speech]
[3:04][And we're off, summarising our .hht :parsing in the announcer voice][:"asset system" :speech]
[6:54][Flowing import_source_info / hht_fields through the parser][:"asset system" :parsing]
[8:07][Enable ParseTopLevelBlock() to handle a "Name" field][:"asset system" :parsing]
[10:35][Set up to merge the import_source_info with the assets' tile-based tags][:"asset system" :parsing :speech]
[13:05][Make ParseTopLevelBlock() responsible for :parsing the asset tile info, and merging in default tags][:"asset system"]
[21:46][Note the need to make ParseTopLevelBlock() associate errors with the asset files][:"asset system" :"error handling" :speech]
[24:12][Determining the freshness of .hht files using timestamps and checksumming][:"asset system" :caching :speech]
[28:08][Augment hha_annotation and loaded_hha_annotation with HHTBlockChecksum][:"asset system" :caching]
[30:53][The perils of using a file's timestamp to determine its freshness[ref
    site="Handmade Hero"
    url=https://handmadehero.org/]][:caching :speech]
[38:00][Change ImportChangedAssets() to process .hht rather than .png files directly, calling ParseHHT()][:"asset system"]
[48:28][Make ParseTopLevelBlock() construct the full (enough) path of our .hha files, and get their info][:"asset system" :"string manipulation"]
[55:45][Make ParseTagList() build and return an import_tag_array][:"asset system" :parsing]
[1:00:49][Clean up compile errors][:"asset system" :parsing]
[1:05:14][Make ImportChangedAssets() read in the file to pass to Tokenize()][:"asset system" :"file io" :memory]
[1:09:38][Make WriteImageToHHA() write out to the locations parsed in from .hht files][:"asset system" :"file io"]
[1:16:19][Drink concoction: 25% Newman's Own Lemonade, 75% Water, filled with 1/8th cup chia seeds per gallon][:speech :trivia]
[1:17:25][Creating a .hha from whole cloth][:"asset system" :"file io" :speech]
[1:20:02][Someone is rage horning][:speech]
[1:21:11][Add Stem to asset_file for AllocateGameAssets() to set, making RemoveExtension() and RemovePath() composable, and introducing GetOrCreatHHAByStem()][:"asset system" :"file io" :"string manipulation"]
[1:37:37][Find that the game runs just fine, but without editor mode][:"asset system" :run]
[1:38:29][Q&A][:speech]
[1:39:13][@ivereadthesequel][Q: I actually thought you were gonna just vary your pitch a lot more, in terms of inflection, not go fast! Everyone on stream was in awe of how fast you were going. Did we get more done today as a result? That's a killer way to celebrate episode 2^9!]
[1:39:37][@brian_nevec][Q: What sort of pre-release checks / actions do you do? How do you make your programs "industrial strength"? For example, do you turn all of your asserts into fatal errors? Do you add verbose logging, crash reporters, etc?][:"error handling"]
[1:43:31][@Miblo][Q: I think I spotted a typo in that final print string: %S, not %s]
[1:44:10][@ryanfleury][Q: Third from the bottom]
[1:44:20][Fix up other typos]
[1:45:22][@Miblo][Q: Oh, you handle %S?]
[1:45:28][@letambourinroyal][Q: How do you keep your mind fresh at your age? You talk really fast][:health]
[1:46:13][@epic_ninja_elephant][@LeTambourinRoyal Exercise. It helps your brain a lot][:health]
[1:46:32][Close this out][:speech]
[/video]
