[video output=day516 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Rewriting HHTs" vod_platform=youtube id=XrrepWs0xoQ annotator=Miblo]
[0:02][Recap and set the stage for the day][:speech]
[1:53][The workings of our .hht and .hha files, and hhaedit][:"asset system" :speech]
[3:23][Look at our exported .bmp files in GIMP][:admin :"asset system"]
[4:16][Check out intro_cutscene.hha in TabView][:admin :"asset system"]
[6:59][Check out the original intro_art_v2.hha in TabView, to find that the BasicCategory differs][:admin :"asset system"]
[8:08][Replace Asset_OpeningCutscene with Asset_Plate][:"asset system"]
[8:59][Find that the intro cutscene now displays correctly][:"asset system" :run]
[11:21][Make UpdateAndRenderTitleScreen() draw our pre-cutscene title screen image][:"asset system"]
[19:47][Check out our title screen, and increase its size][:"asset system" :"hot reloading" :programming :run]
[22:32][Extract base_game.hha to see that the bitmaps look correct][:admin :"asset system"]
[24:26][Check out our base_game.hha dump in TabView][:admin :"asset system"]
[26:15][Change AddPlayer() to apply the Tag_Hero (rather than character-specific tags)][:"asset system"]
[27:39][Find that all the assets except heads seem correct][:"asset system" :run]
[29:03][Temporarily change AddPlayer() to connect the HeadPiece to the world][:"asset system"]
[30:25][Find that the hero's head is present, and align it][:"asset system" :run]
[31:53][Replace Tag_DodgeLeft and Tag_DodgeRight with a bidirectional Tag_Dodge, and make the NameTags matching case-insensitive, introducing StringsAreEqualLowercase()][:"asset system"]
[38:22][Trigger a successful base_game.hha rebuild][:"asset system" :run]
[39:06][Enable UpdateAndRenderEntities() to consider an asset's dodge value when picking][:"asset system" :"entity system"]
[39:40][Find that we have not picked the hero's non-dodge asset][:"asset system" :"entity system" :run]
[40:52][Reacquaint ourselves with GetBestMatchAssetFrom()][:"asset system" :"entity system" :research]
[43:44][Possible problems: 1) Import incorrectly setting tags; 2) Improperly matching; 3) Accidental preference for dodging][:"asset system" :"entity system" :speech]
[46:21][Remove all except the font test .hha files and find that the game runs just the same, with only the dodge asset bug][:"asset system" :run]
[48:00][Enable UpdateAndRenderEntities() to consider an asset's idle value when picking][:"asset system" :"entity system"]
[49:46][Find that we now pick the correct character asset][:"asset system" :"entity system" :run]
[50:15][Rewriting .hht files to contain in-game edited alignment points][:"asset system" :run]
[53:28][Respecify ImportChangedAssets() as SynchronizeAssetFileChanges(), which merges asset edits into an existing .hht file][:"asset system"]
[1:10:33][Atomic file operations][:"file io" :speech]
[1:12:37][Continue to implement .hht synchronization, making ParseHHT() responsible for the file write][:"asset system" :"file io" :parsing]
[1:22:41][Implement CopyAllInputUpToAndIncluding(), noting our intention to diff .hha files the same way as .hht][:"asset system" :memory]
[1:28:42][Fix compile errors in our .hht synchronization code][:"asset system" :"file io"]
[1:31:57][Introduce CopyStreamToBuffer()][:memory]
[1:34:49][Continue to fix compile errors in our .hht synchronization code][:"asset system" :"file io"]
[1:37:50][Introduce a stubbed out Win32AtomicReplaceFileContents()][:"file io" :"platform layer"]
[1:40:46][Find that everything seems fine][:"asset system" :run]
[1:43:11][Break in to CopyStreamToBuffer() to see that it did not produce the expected result][:"asset system" :run]
[1:44:05][Make ParseHHT() initialise the HHTCopyPoint][:"asset system" :parsing]
[1:46:17][Step through ParseHHT() and watch the copy process play out][:"asset system" :parsing :run]
[1:50:42][Make the rebuild routine within ParseTopLevelBlock() responsible for its own :memory][:"asset system"]
[1:51:42][Find that our .hht diffing / copying succeeds][:"asset system" :run]
[1:52:30][Q&A][:speech]
[1:54:02][@juiceweasel][Q: Do you ever write unit tests for testing these low-level functions instead of running through the game?]
[1:56:32][@2hstrike][Q: Now that you've done a C++ game engine series, do you plan to do a C game engine series?][:language]
[1:56:56][@raulrita][Q: Any thoughts or hopes for c2x scheduled for 2022?][:language]
[1:57:06][@edvinholm][Q: When you transform a mesh, do you do that on the GPU? If so, do you load it back if you e.g. want to raycast against it?][:hardware :rendering]
[2:00:11][@y2kiah][Q: How do you toggle between debug and release builds? Modify build.bat each time?]
[2:00:18][@zatrik1][Q: How do you conceptualize and tackle large projects and prevent from getting overwhelmed and lost in the weeds of minute details? I tend to suffer from analysis paralysis]
[2:01:05][@chlobimay][Q: Let's say a AAA studio bought quite a bit into OOP, any steps to show that that's not the answer / easiest way to go forward? If they have a codebase that "works" but changing anything is a pain, it's hard to make them see that this is one of the big problems. Any advice? It's for a friend][:language]
[2:04:05][@ejgremlin][Q: Watched your talk about lines of code problem. Have you ever seen anything from Ian Piumarta?]
[2:04:23][@scorpionilluminati][@handmade_hero Do twitch subs count towards source code access?]
[2:05:45][@stathizzzz][Q: Do you use any graphics libraries like SDL, SFML?][:library]
[2:05:53][@y2kiah][Q: What are your thoughts on the use of C++ lambda functions? Seems like one of the better additions to the C++ spec and doesn't break procedural style][:language]
[2:07:56][Wrap it up with a plug of Meow the Infinite[ref
    site="Meow the Infinite"
    url=https://meowtheinfinite.com/] and a glimpse into the future][:speech]
[/video]
