[video output=day467 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Updating the Game to HHA Version 1" vod_platform=youtube id=xIh1WOFzIcQ annotator=Miblo]
[0:01][Recap and set the stage for the day][:speech]
[0:33][Check out our testfonts.hha in TabView][:"asset loading" :run]
[2:13][Introduce WriteHHA_V1()][:"asset loading"]
[6:19][Make WriteHHA_V1() clear the Header, with a few words on maintaining an updatable binary file format][:"asset loading"]
[8:21][Continue to implement WriteHHA_V1()][:"asset loading"]
[25:42][Introduce WriteBlock() and WriteString()][:"asset loading" :"file io"]
[28:47][Implement ReadHHA_V1(), introducing RefString()][:"asset loading" :"file io" :"string manipulation"]
[37:20][Try to check out test1.hha in TabView][:"asset loading" :run]
[39:34][Document -dump and handle unsupported program invocations][:"asset loading"]
[40:20][Check out test1.hha in TabView][:"asset loading" :run]
[40:41][Test rewriting test1.hha into test1_v1.hha][:"asset loading" :run]
[41:27][Check out our dump of test1_v1.hha in TabView to see that it looks right, but for the absence of the asset name][:"asset loading" :run]
[44:48][Fix WriteHHA_V1() to correctly write the asset name][:"asset loading"]
[45:06][Rewrite test1.hha as test1_v1.hha and check out its dump in TabView, to see that it all looks right][:"asset loading" :run]
[45:46][Enable querying assets by their type for full backwards compatibility][:"asset loading"]
[49:41][Introduce TruncateBeforeExtension() for ReadHHA_V0() to omit ".hha" from the asset name][:"string manipulation"]
[52:11][Rewrite test1.hha as test1_v1.hha and check out its dump in TabView, to see that it all looks right][:"asset loading" :run]
[52:41][Remove TruncateBeforeExtension() to RemoveExtension() and introduce RemovePath()][:"string manipulation"]
[54:25][Rewrite ..\\data\\test1.hha as test1_v1.hha and check out its dump to see our asset names without the full path][:"asset loading" :run]
[55:16][Enable ReadHHA_V0() to load in all the old tags][:"asset loading"]
[59:04][Rewrite test1.hha as test1_v1.hha and check out its dump to see some UNKNOWN tag names][:"asset loading" :run]
[59:35][Add "BasicCategory" to TagNameFromID][:"asset loading"]
[59:56][Rewrite test1.hha as test1_v1.hha and check out its dump to see fewer UNKNOWN tag names][:"asset loading" :run]
[1:00:04][Prevent ReadHHA_V0() from processing the tag of the zero asset][:"asset loading"]
[1:00:38][Rewrite test1.hha as test1_v1.hha and check out its dump to see all of our information][:"asset loading" :run]
[1:00:51][Organise our dump files, wondering why ~4coder is not a drop target][:admin]
[1:02:21][Rewrite all of our .hha assets to v1 versions, and check out their dumps to see that everything seems kosher][:"asset loading" :run]
[1:04:13][:Run the game to see that it breaks failing to load our v1 .hha assets][:"asset loading" :run]
[1:04:57][Enable WriteModificationsToHHA() and everyone else in the game to handle v1 .hha files][:"asset loading"]
[1:12:47][Make AllocateGameAssets() straight up set FontBitmapIDOffset][:"asset loading"]
[1:15:45][Investigate why AllocateGameAssets() checked each asset to see if it is a font glyph before setting FontBitmapIDOffset][:"asset loading" :run]
[1:18:26][Replace FontBitmapIDOffset with AssetBase in asset_file, and propagate this change][:"asset loading"]
[1:22:24][Continue to enable AllocateGameAssets() to handle v1 .hha files][:"asset loading"]
[1:28:10][Step in to AllocateGameAssets() and inspect our Assets to see that everything seems pretty good][:"asset loading" :run]
[1:31:38][:Run through to the game to see that everything imported correctly, except that the fonts are messed up][:"asset loading" :run]
[1:34:05][Make AllocateGameAssets() offset the AssetBase by -1 to account for the initial null asset][:"asset loading"]
[1:34:52][:Run the game to see that the fonts are now good][:"asset loading" :run]
[1:36:24][Consider the next step: populating our asset source file information directly out of the .hha file][:"asset loading" :speech]
[1:40:43][Q&A][:speech]
[1:41:03][@macielda][Q: Have you tried lldb? I use that at work and it seems to be stable]
[1:42:20][@Rounin][Q: How come the shaded debug window with the graphs makes transparent pixels around the main character white?][:"debug system"]
[1:42:45][@mallesbixie][Q: Why is the "there is no file" there if it's in the way all the time?]
[1:43:00][@jimerinorustlerino][@handmade_hero If you need to run a bunch of regexp substitutions on huge chunks of your codebase, how you go about it?]
[1:45:55][@ivereadthesequel][@JimerinoRustlerino you need Q:]
[1:46:33][@somebody_took_my_name][Q: There was this issue with the glyph count printed the wrong way around][:"asset loading"]
[1:46:56][Fix the font printout in PrintContents()][:"asset loading"]
[1:47:18][@vtlmks][Q: Not really a question, but why EFI? What problem did they make up to have EFI solve?][:firmware]
[1:47:56][@vtlmks][Q: Yes, the BIOS standard][:firmware]
[1:48:19][BIOS, EFI (Extensible :Firmware Interface) and UEFI (Unified EFI)][:speech]
[1:53:23][@darksprites][Q: Bit of an off-topic question: I found your talk about GJK (which was really great!) and implemented it for my project but now I don't know what to do to "resolve" collisions when I detect them. What should I do?][:collision]
[1:54:54][@pythno][Q: Can you give advice for someone who wants to drop out of college (CS undergrad) and just finally get a programming job? Or is it a big no-no nowadays to do so?]
[2:03:17][@longboolean][Q: I am a bit confused by your answer, because I have booted from USB on pre UEFI systems. Am I missing something?][:firmware]
[2:05:12][@ivereadthesequel][Q: Can you give an overview of how you have structured your web programming in C? I've heard you mention it in some stream on how you made certain components behind the [~hero Handmade Hero] website in C or at least more-sanely programmed than most web frameworks. It really interests me, could you give some more info?][:"web development"]
[2:10:39][@jimerinorustlerino][@handmade_hero How about learning some online courses at python or something, and contributing to open source at GitHub (documentation fixes)?]
[2:10:46][@jim0_o][Q: You talked about people needing to know C++ to be hired for programming jobs these days. Did you mean OOP C++ with compile times linked to lunch-breaks? Do you think you would need to bone-up on newer C++ to do such a job?][:language]
[2:14:02][@cylvtwitch2][@handmade_hero How can you create a interesting portfolio for backend developers? I can't make fancy sites because I know nothing about design]
[2:14:13][Gauge the :performance of Mailjet's newsletter sign-up form[ref
    site=Mailjet
    url=https://www.mailjet.com/]][:research :"web development"]
[2:21:05][Compare the :performance of Molly Rocket's mailing list sign-up form[ref
    site="Handmade Hero"
    url=https://handmadehero.org/]][:research :"web development"]
[2:22:42][Portfolio creation tips][:speech]
[2:25:02][@jimerinorustlerino][@handmade_hero Have you read "Out of the Tar Pit"?[ref
    author="Ben Mosely and Peter Marks"
    title="Out of the Tar Pit"
    url=https://github.com/papers-we-love/papers-we-love/blob/master/design/out-of-the-tar-pit.pdf] It seems to resurface lately for some reason]
[2:25:09][@grimjoey][Q: Have you checked out kore.io (web server written in C)?]
[2:25:42][@uplinkcoder][@handmade_hero: libmicrohttpd is pretty good, as far as I can tell]
[2:25:49][@vikingcoder][Q: Do you have any advice for a programmer having trouble to adjust to a OOP way of thinking on the job and how to cope with or handle patterns. Thank you]
[2:26:28][@pythno][Q: Follow-up question: What kind of projects would be interesting for recruiters to look at? For example, at the moment I am working on a 3D rasterizer in x86 assembly using mode 13h with a DOS emulator. I don't know if that is interesting, because it is so legacy-like but I like doing it and reading the Michael Abrash stuff about it][:rendering]
[2:28:19][@uplinkcoder][@handmade_hero They can't tell you because then you could just try mails and see if they are subscribed, leading to data breach]
[2:29:36][@mattiamanzati][Q: Your subscribe form is not GDPR compliant. You need to add an unchecked-by-default checkbox with "I want to subscribe" text and add double verification emails]
[2:33:00][@thecodedragon][GDPR has a section dedicated to it[ref
    site="intersoft consulting"
    page="GDPR Email Marketing"
    url=https://gdpr-info.eu/issues/email-marketing/]]
[2:36:57][@jecosm]["If you have not previously unsubscribed, a confirmation email will be sent"]
[2:37:45][@maccod][Q: If he unsubscribes, he has to accept the terms again (a checkbox) when he enters the email address and wants to subscribe again]
[2:39:03][@vateferfout][Q: Why not just have an FAQ with the fact that if you don't receive the subscription mail and have unsubscribed before, you have to send a mail?]
[2:39:26][Propose responding identically to email addresses which have already been put on the mailing list or unsubscribed][:speech]
[2:41:11][Close it up][:speech]
[/video]
