Handmade Hero»Episode Guide
Debugging HHT to HHA Packing
?
?

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)
0:01Meow the Infinite1
📖
0:01Meow the Infinite1
📖
0:01Meow the Infinite1
📖
1:52Recap and set the stage for the day debugging HHT to HHA packing
🗩
1:52Recap and set the stage for the day debugging HHT to HHA packing
🗩
1:52Recap and set the stage for the day debugging HHT to HHA packing
🗩
6:14Plan to delete and rebuild our current .hha file
🏃
6:14Plan to delete and rebuild our current .hha file
🏃
6:14Plan to delete and rebuild our current .hha file
🏃
7:48Continue to plan our .hha deletion and rebuild
🗩
7:48Continue to plan our .hha deletion and rebuild
🗩
7:48Continue to plan our .hha deletion and rebuild
🗩
10:48Create handmade_import.cpp and .h to house the non-runtime asset system code
10:48Create handmade_import.cpp and .h to house the non-runtime asset system code
10:48Create handmade_import.cpp and .h to house the non-runtime asset system code
16:17Make AllocateGameAsssets() call ImportChangedAssets() just before returning
16:17Make AllocateGameAsssets() call ImportChangedAssets() just before returning
16:17Make AllocateGameAsssets() call ImportChangedAssets() just before returning
19:22Delete base_game.hha and step in to ImportChangedAssets()
🗹
19:22Delete base_game.hha and step in to ImportChangedAssets()
🗹
19:22Delete base_game.hha and step in to ImportChangedAssets()
🗹
20:03On Visual Studio's incorrect display of #if blocks
🗩
20:03On Visual Studio's incorrect display of #if blocks
🗩
20:03On Visual Studio's incorrect display of #if blocks
🗩
20:56Step through ImportChangedAssets()
🏃
20:56Step through ImportChangedAssets()
🏃
20:56Step through ImportChangedAssets()
🏃
22:05Fix the Author settings in cutscene.hht2
🗹
22:05Fix the Author settings in cutscene.hht2
🗹
22:05Fix the Author settings in cutscene.hht2
🗹
24:02Continue to step through ImportChangedAssets() to ParseHHT() until we detect an error
🏃
24:02Continue to step through ImportChangedAssets() to ParseHHT() until we detect an error
🏃
24:02Continue to step through ImportChangedAssets() to ParseHHT() until we detect an error
🏃
25:33Change cutscene.hht to use our #hha directive
🗹
25:33Change cutscene.hht to use our #hha directive
🗹
25:33Change cutscene.hht to use our #hha directive
🗹
26:02Continue to step through ParseHHT(), until we spot a bug exhibited in InitSourceHHA()
🏃
26:02Continue to step through ParseHHT(), until we spot a bug exhibited in InitSourceHHA()
🏃
26:02Continue to step through ParseHHT(), until we spot a bug exhibited in InitSourceHHA()
🏃
28:54Make GetOrCreateHHAByStem() refresh the file info after creating a new .hha, to get its correct file size
28:54Make GetOrCreateHHAByStem() refresh the file info after creating a new .hha, to get its correct file size
28:54Make GetOrCreateHHAByStem() refresh the file info after creating a new .hha, to get its correct file size
29:57Delete intro_cutscene.hha and successfully step through ImportChangedAssets() to CopyAllInputUpToAndIncluding()
🏃
29:57Delete intro_cutscene.hha and successfully step through ImportChangedAssets() to CopyAllInputUpToAndIncluding()
🏃
29:57Delete intro_cutscene.hha and successfully step through ImportChangedAssets() to CopyAllInputUpToAndIncluding()
🏃
32:37Comment out the unimplemented CopyAllInputUpToAndIncluding()
32:37Comment out the unimplemented CopyAllInputUpToAndIncluding()
32:37Comment out the unimplemented CopyAllInputUpToAndIncluding()
32:49Continue to step through ImportChangedAssets() after the CopyAllInputUpToAndIncluding() call
🏃
32:49Continue to step through ImportChangedAssets() after the CopyAllInputUpToAndIncluding() call
🏃
32:49Continue to step through ImportChangedAssets() after the CopyAllInputUpToAndIncluding() call
🏃
35:10Fix the .hha directory Path in ParseTopLevelBlock()
35:10Fix the .hha directory Path in ParseTopLevelBlock()
35:10Fix the .hha directory Path in ParseTopLevelBlock()
35:44Continue to step through ParseTopLevelBlock()
🏃
35:44Continue to step through ParseTopLevelBlock()
🏃
35:44Continue to step through ParseTopLevelBlock()
🏃
39:41Fix ParseTagList() to check the next token after pulling off the closing parenthesis
39:41Fix ParseTagList() to check the next token after pulling off the closing parenthesis
39:41Fix ParseTagList() to check the next token after pulling off the closing parenthesis
40:35Continue to step through ParseTagList()
🏃
40:35Continue to step through ParseTagList()
🏃
40:35Continue to step through ParseTagList()
🏃
41:55Make StampAssets() pass the Tags.TypeID to EndTags() and prevent the latter from calling AddTag() if passed an Asset_None
41:55Make StampAssets() pass the Tags.TypeID to EndTags() and prevent the latter from calling AddTag() if passed an Asset_None
41:55Make StampAssets() pass the Tags.TypeID to EndTags() and prevent the latter from calling AddTag() if passed an Asset_None
43:51Continue to step through ParseTagList() to find that we parsed the correct number of tags
🏃
43:51Continue to step through ParseTagList() to find that we parsed the correct number of tags
🏃
43:51Continue to step through ParseTagList() to find that we parsed the correct number of tags
🏃
45:03Just insert the missing semicolons in intro_cutscene.hht
🗹
45:03Just insert the missing semicolons in intro_cutscene.hht
🗹
45:03Just insert the missing semicolons in intro_cutscene.hht
🗹
46:46Continue to step carefully through ParseTopLevelBlock()
🏃
46:46Continue to step carefully through ParseTopLevelBlock()
🏃
46:46Continue to step carefully through ParseTopLevelBlock()
🏃
48:28Make PeekToken() pass the duplicated Temp tokenizer to GetToken()
48:28Make PeekToken() pass the duplicated Temp tokenizer to GetToken()
48:28Make PeekToken() pass the duplicated Temp tokenizer to GetToken()
49:02Continue to step through ParseTopLevelBlock()
🏃
49:02Continue to step through ParseTopLevelBlock()
🏃
49:02Continue to step through ParseTopLevelBlock()
🏃
50:08Fix ParseTagList() to use PeekToken() rather than GetToken() wherever we operate conditionally on tokens
50:08Fix ParseTagList() to use PeekToken() rather than GetToken() wherever we operate conditionally on tokens
50:08Fix ParseTagList() to use PeekToken() rather than GetToken() wherever we operate conditionally on tokens
51:44Continue to step through ParseTopLevelBlock()
🏃
51:44Continue to step through ParseTopLevelBlock()
🏃
51:44Continue to step through ParseTopLevelBlock()
🏃
54:03Respecify StampAssets() as UpdateAssetMetadata() which itself determines if the metadata tags differ, changing ParseTopLevelBlock() to call it always
54:03Respecify StampAssets() as UpdateAssetMetadata() which itself determines if the metadata tags differ, changing ParseTopLevelBlock() to call it always
54:03Respecify StampAssets() as UpdateAssetMetadata() which itself determines if the metadata tags differ, changing ParseTopLevelBlock() to call it always
1:06:53Introduce GetTagCount() and TagsAreEqual(), and fix compile errors
1:06:53Introduce GetTagCount() and TagsAreEqual(), and fix compile errors
1:06:53Introduce GetTagCount() and TagsAreEqual(), and fix compile errors
1:14:11Delete intro_cutscene.hha and step through UpdateAssetMetadata()
🏃
1:14:11Delete intro_cutscene.hha and step through UpdateAssetMetadata()
🏃
1:14:11Delete intro_cutscene.hha and step through UpdateAssetMetadata()
🏃
1:16:04Make ParsePieces() tag plates as Asset_Plate
1:16:04Make ParsePieces() tag plates as Asset_Plate
1:16:04Make ParsePieces() tag plates as Asset_Plate
1:17:24Continue to step through UpdateAssetMetadata() until the image extraction phase
🏃
1:17:24Continue to step through UpdateAssetMetadata() until the image extraction phase
🏃
1:17:24Continue to step through UpdateAssetMetadata() until the image extraction phase
🏃
1:21:47Make UpdateAssetMetadata() mark the file as Modified if the tags differ
1:21:47Make UpdateAssetMetadata() mark the file as Modified if the tags differ
1:21:47Make UpdateAssetMetadata() mark the file as Modified if the tags differ
1:24:00Hit an error while importing base_game.hht
🏃
1:24:00Hit an error while importing base_game.hht
🏃
1:24:00Hit an error while importing base_game.hht
🏃
1:25:52Comment out the item and obstacles and cover settings in base_game.hht
🗹
1:25:52Comment out the item and obstacles and cover settings in base_game.hht
🗹
1:25:52Comment out the item and obstacles and cover settings in base_game.hht
🗹
1:26:40Find that our generated intro_cutscene.hha file is empty
🗹
1:26:40Find that our generated intro_cutscene.hha file is empty
🗹
1:26:40Find that our generated intro_cutscene.hha file is empty
🗹
1:27:36Introduce WriteModificationsToAllHHAs() for ImportChangedAssets() to call
1:27:36Introduce WriteModificationsToAllHHAs() for ImportChangedAssets() to call
1:27:36Introduce WriteModificationsToAllHHAs() for ImportChangedAssets() to call
1:30:45Delete and regenerate base_game.hha and intro_cutscene.hha
🏃
1:30:45Delete and regenerate base_game.hha and intro_cutscene.hha
🏃
1:30:45Delete and regenerate base_game.hha and intro_cutscene.hha
🏃
1:32:16Find that the hero's head is missing, but the intro cutscene displays okay
🏃
1:32:16Find that the hero's head is missing, but the intro cutscene displays okay
🏃
1:32:16Find that the hero's head is missing, but the intro cutscene displays okay
🏃
1:34:09Move intro_art_v2.hha to a new directory, and find that the intro cutscene now fails to display
🏃
1:34:09Move intro_art_v2.hha to a new directory, and find that the intro cutscene now fails to display
🏃
1:34:09Move intro_art_v2.hha to a new directory, and find that the intro cutscene now fails to display
🏃
1:35:22Check out our intro_cutscene.hha in TabView
🗹
1:35:22Check out our intro_cutscene.hha in TabView
🗹
1:35:22Check out our intro_cutscene.hha in TabView
🗹
1:38:16Add an -extract command to hhaedit
1:38:16Add an -extract command to hhaedit
1:38:16Add an -extract command to hhaedit
1:45:04Copy WriteImageTopDownRGBA() and bitmap_header into hhaedit.cpp and introduce ExtractBitmapAsset()
1:45:04Copy WriteImageTopDownRGBA() and bitmap_header into hhaedit.cpp and introduce ExtractBitmapAsset()
1:45:04Copy WriteImageTopDownRGBA() and bitmap_header into hhaedit.cpp and introduce ExtractBitmapAsset()
1:53:07Try to extract test1_v2.hha with partial success
🏃
1:53:07Try to extract test1_v2.hha with partial success
🏃
1:53:07Try to extract test1_v2.hha with partial success
🏃
1:54:13Comb through WriteImageTopDownRGBA() for any clear bugs
📖
1:54:13Comb through WriteImageTopDownRGBA() for any clear bugs
📖
1:54:13Comb through WriteImageTopDownRGBA() for any clear bugs
📖
1:56:43Step through an extract of test1_v2.hha
🏃
1:56:43Step through an extract of test1_v2.hha
🏃
1:56:43Step through an extract of test1_v2.hha
🏃
1:59:00Remove the colour Mask values from hhaedit's bitmap_header
1:59:00Remove the colour Mask values from hhaedit's bitmap_header
1:59:00Remove the colour Mask values from hhaedit's bitmap_header
1:59:46Try again to extract test1_v2.hha with full success
🏃
1:59:46Try again to extract test1_v2.hha with full success
🏃
1:59:46Try again to extract test1_v2.hha with full success
🏃
2:00:18Extract intro_cutscene.hha to see that all is correct
🗹
2:00:18Extract intro_cutscene.hha to see that all is correct
🗹
2:00:18Extract intro_cutscene.hha to see that all is correct
🗹
2:01:11Q&A
🗩
2:01:11Q&A
🗩
2:01:11Q&A
🗩
2:02:19wheeel Q: What's your first major gameplay programming topic going to be?
🗪
2:02:19wheeel Q: What's your first major gameplay programming topic going to be?
🗪
2:02:19wheeel Q: What's your first major gameplay programming topic going to be?
🗪
2:02:52centhusiast Q: Do you use string library from CRT? I though we wrote our own version?
🗪
2:02:52centhusiast Q: Do you use string library from CRT? I though we wrote our own version?
🗪
2:02:52centhusiast Q: Do you use string library from CRT? I though we wrote our own version?
🗪
2:03:27letambourinroyal Q: Have you every programmed non-blocking TCP sockets? I wonder what is the cost of directly calling recv() / send() vs select()
🗪
2:03:27letambourinroyal Q: Have you every programmed non-blocking TCP sockets? I wonder what is the cost of directly calling recv() / send() vs select()
🗪
2:03:27letambourinroyal Q: Have you every programmed non-blocking TCP sockets? I wonder what is the cost of directly calling recv() / send() vs select()
🗪
2:05:14uplinkcoder Q: Could you improve the assert macro such that it prints the stringized expression which failed? On Linux the debugger does not always show which assert failed where
🗪
2:05:14uplinkcoder Q: Could you improve the assert macro such that it prints the stringized expression which failed? On Linux the debugger does not always show which assert failed where
🗪
2:05:14uplinkcoder Q: Could you improve the assert macro such that it prints the stringized expression which failed? On Linux the debugger does not always show which assert failed where
🗪
2:06:20centhusiast Q: What is your thought on the structure of config files in Windows (.ini files) that have sections in the close brackets? Do you think it is a good structure for the game config file?
🗪
2:06:20centhusiast Q: What is your thought on the structure of config files in Windows (.ini files) that have sections in the close brackets? Do you think it is a good structure for the game config file?
🗪
2:06:20centhusiast Q: What is your thought on the structure of config files in Windows (.ini files) that have sections in the close brackets? Do you think it is a good structure for the game config file?
🗪
2:06:50s0imn Q: How would you implement immediate mode-esque functionality for rendering anti-aliased polygons? I am currently rendering n-gons with a geometry shader, but I am unable to implement anti-aliasing
🗪
2:06:50s0imn Q: How would you implement immediate mode-esque functionality for rendering anti-aliased polygons? I am currently rendering n-gons with a geometry shader, but I am unable to implement anti-aliasing
🗪
2:06:50s0imn Q: How would you implement immediate mode-esque functionality for rendering anti-aliased polygons? I am currently rendering n-gons with a geometry shader, but I am unable to implement anti-aliasing
🗪
2:10:34wheeel Q: When trying to manage entities in my own game engine / game (just me on my own), do you think the Entity-Component structure is worth considering, or am I just giving myself too much work when it's just my own code?
🗪
2:10:34wheeel Q: When trying to manage entities in my own game engine / game (just me on my own), do you think the Entity-Component structure is worth considering, or am I just giving myself too much work when it's just my own code?
🗪
2:10:34wheeel Q: When trying to manage entities in my own game engine / game (just me on my own), do you think the Entity-Component structure is worth considering, or am I just giving myself too much work when it's just my own code?
🗪
2:14:09naysayer88 I am here as the ambassador of DON'T BOTHER WITH COMPONENT SYSTEMS
🗪
2:14:09naysayer88 I am here as the ambassador of DON'T BOTHER WITH COMPONENT SYSTEMS
🗪
2:14:09naysayer88 I am here as the ambassador of DON'T BOTHER WITH COMPONENT SYSTEMS
🗪
2:14:45toideng Q: What should I choose: Xlib or XCB?
🗪
2:14:45toideng Q: What should I choose: Xlib or XCB?
🗪
2:14:45toideng Q: What should I choose: Xlib or XCB?
🗪
2:15:08naysayer88 handmade_hero Yeah, I haven't thought in a while to explain the "walling yourself in" thing, but that is 100% true. It's like playing Go... when you build a strategic structure, you are also filling the board and ruling out possibilities for yourself
🗪
2:15:08naysayer88 handmade_hero Yeah, I haven't thought in a while to explain the "walling yourself in" thing, but that is 100% true. It's like playing Go... when you build a strategic structure, you are also filling the board and ruling out possibilities for yourself
🗪
2:15:08naysayer88 handmade_hero Yeah, I haven't thought in a while to explain the "walling yourself in" thing, but that is 100% true. It's like playing Go... when you build a strategic structure, you are also filling the board and ruling out possibilities for yourself
🗪
2:17:07devsigner Q: I've been writing my own game / render loop but I've been having trouble getting the loop timing to be constant. I seem to get a stutter or skip in motion, but it's not because the render procedure takes too long. Any ideas on what could be the issue? Sorry, I know it's not much to go on, but any ideas would be helpful3
🗪
2:17:07devsigner Q: I've been writing my own game / render loop but I've been having trouble getting the loop timing to be constant. I seem to get a stutter or skip in motion, but it's not because the render procedure takes too long. Any ideas on what could be the issue? Sorry, I know it's not much to go on, but any ideas would be helpful3
🗪
2:17:07devsigner Q: I've been writing my own game / render loop but I've been having trouble getting the loop timing to be constant. I seem to get a stutter or skip in motion, but it's not because the render procedure takes too long. Any ideas on what could be the issue? Sorry, I know it's not much to go on, but any ideas would be helpful3
🗪
2:22:07ideas_guy lada-vatz
🗪
2:22:07ideas_guy lada-vatz
🗪
2:22:07ideas_guy lada-vatz
🗪
2:22:35Call it a day with a plug of Meow the Infinite4
🗩
2:22:35Call it a day with a plug of Meow the Infinite4
🗩
2:22:35Call it a day with a plug of Meow the Infinite4
🗩