Handmade Hero»Episode Guide
Rewriting HHTs
?
?

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:02Recap and set the stage for the day
🗩
0:02Recap and set the stage for the day
🗩
0:02Recap and set the stage for the day
🗩
1:53The workings of our .hht and .hha files, and hhaedit
🗩
1:53The workings of our .hht and .hha files, and hhaedit
🗩
1:53The workings of our .hht and .hha files, and hhaedit
🗩
3:23Look at our exported .bmp files in GIMP
🗹
3:23Look at our exported .bmp files in GIMP
🗹
3:23Look at our exported .bmp files in GIMP
🗹
4:16Check out intro_cutscene.hha in TabView
🗹
4:16Check out intro_cutscene.hha in TabView
🗹
4:16Check out intro_cutscene.hha in TabView
🗹
6:59Check out the original intro_art_v2.hha in TabView, to find that the BasicCategory differs
🗹
6:59Check out the original intro_art_v2.hha in TabView, to find that the BasicCategory differs
🗹
6:59Check out the original intro_art_v2.hha in TabView, to find that the BasicCategory differs
🗹
8:08Replace Asset_OpeningCutscene with Asset_Plate
8:08Replace Asset_OpeningCutscene with Asset_Plate
8:08Replace Asset_OpeningCutscene with Asset_Plate
8:59Find that the intro cutscene now displays correctly
🏃
8:59Find that the intro cutscene now displays correctly
🏃
8:59Find that the intro cutscene now displays correctly
🏃
11:21Make UpdateAndRenderTitleScreen() draw our pre-cutscene title screen image
11:21Make UpdateAndRenderTitleScreen() draw our pre-cutscene title screen image
11:21Make UpdateAndRenderTitleScreen() draw our pre-cutscene title screen image
19:47Check out our title screen, and increase its size
🏃
🖮
19:47Check out our title screen, and increase its size
🏃
🖮
19:47Check out our title screen, and increase its size
🏃
🖮
22:32Extract base_game.hha to see that the bitmaps look correct
🗹
22:32Extract base_game.hha to see that the bitmaps look correct
🗹
22:32Extract base_game.hha to see that the bitmaps look correct
🗹
24:26Check out our base_game.hha dump in TabView
🗹
24:26Check out our base_game.hha dump in TabView
🗹
24:26Check out our base_game.hha dump in TabView
🗹
26:15Change AddPlayer() to apply the Tag_Hero (rather than character-specific tags)
26:15Change AddPlayer() to apply the Tag_Hero (rather than character-specific tags)
26:15Change AddPlayer() to apply the Tag_Hero (rather than character-specific tags)
27:39Find that all the assets except heads seem correct
🏃
27:39Find that all the assets except heads seem correct
🏃
27:39Find that all the assets except heads seem correct
🏃
29:03Temporarily change AddPlayer() to connect the HeadPiece to the world
29:03Temporarily change AddPlayer() to connect the HeadPiece to the world
29:03Temporarily change AddPlayer() to connect the HeadPiece to the world
30:25Find that the hero's head is present, and align it
🏃
30:25Find that the hero's head is present, and align it
🏃
30:25Find that the hero's head is present, and align it
🏃
31:53Replace Tag_DodgeLeft and Tag_DodgeRight with a bidirectional Tag_Dodge, and make the NameTags matching case-insensitive, introducing StringsAreEqualLowercase()
31:53Replace Tag_DodgeLeft and Tag_DodgeRight with a bidirectional Tag_Dodge, and make the NameTags matching case-insensitive, introducing StringsAreEqualLowercase()
31:53Replace Tag_DodgeLeft and Tag_DodgeRight with a bidirectional Tag_Dodge, and make the NameTags matching case-insensitive, introducing StringsAreEqualLowercase()
38:22Trigger a successful base_game.hha rebuild
🏃
38:22Trigger a successful base_game.hha rebuild
🏃
38:22Trigger a successful base_game.hha rebuild
🏃
39:06Enable UpdateAndRenderEntities() to consider an asset's dodge value when picking
39:06Enable UpdateAndRenderEntities() to consider an asset's dodge value when picking
39:06Enable UpdateAndRenderEntities() to consider an asset's dodge value when picking
39:40Find that we have not picked the hero's non-dodge asset
🏃
39:40Find that we have not picked the hero's non-dodge asset
🏃
39:40Find that we have not picked the hero's non-dodge asset
🏃
40:52Reacquaint ourselves with GetBestMatchAssetFrom()
📖
40:52Reacquaint ourselves with GetBestMatchAssetFrom()
📖
40:52Reacquaint ourselves with GetBestMatchAssetFrom()
📖
43:44Possible problems: 1) Import incorrectly setting tags; 2) Improperly matching; 3) Accidental preference for dodging
🗩
43:44Possible problems: 1) Import incorrectly setting tags; 2) Improperly matching; 3) Accidental preference for dodging
🗩
43:44Possible problems: 1) Import incorrectly setting tags; 2) Improperly matching; 3) Accidental preference for dodging
🗩
46:21Remove all except the font test .hha files and find that the game runs just the same, with only the dodge asset bug
🏃
46:21Remove all except the font test .hha files and find that the game runs just the same, with only the dodge asset bug
🏃
46:21Remove all except the font test .hha files and find that the game runs just the same, with only the dodge asset bug
🏃
48:00Enable UpdateAndRenderEntities() to consider an asset's idle value when picking
48:00Enable UpdateAndRenderEntities() to consider an asset's idle value when picking
48:00Enable UpdateAndRenderEntities() to consider an asset's idle value when picking
49:46Find that we now pick the correct character asset
🏃
49:46Find that we now pick the correct character asset
🏃
49:46Find that we now pick the correct character asset
🏃
50:15Rewriting .hht files to contain in-game edited alignment points
🏃
50:15Rewriting .hht files to contain in-game edited alignment points
🏃
50:15Rewriting .hht files to contain in-game edited alignment points
🏃
53:28Respecify ImportChangedAssets() as SynchronizeAssetFileChanges(), which merges asset edits into an existing .hht file
53:28Respecify ImportChangedAssets() as SynchronizeAssetFileChanges(), which merges asset edits into an existing .hht file
53:28Respecify ImportChangedAssets() as SynchronizeAssetFileChanges(), which merges asset edits into an existing .hht file
1:10:33Atomic file operations
🗩
1:10:33Atomic file operations
🗩
1:10:33Atomic file operations
🗩
1:12:37Continue to implement .hht synchronization, making ParseHHT() responsible for the file write
1:12:37Continue to implement .hht synchronization, making ParseHHT() responsible for the file write
1:12:37Continue to implement .hht synchronization, making ParseHHT() responsible for the file write
1:22:41Implement CopyAllInputUpToAndIncluding(), noting our intention to diff .hha files the same way as .hht
1:22:41Implement CopyAllInputUpToAndIncluding(), noting our intention to diff .hha files the same way as .hht
1:22:41Implement CopyAllInputUpToAndIncluding(), noting our intention to diff .hha files the same way as .hht
1:28:42Fix compile errors in our .hht synchronization code
1:28:42Fix compile errors in our .hht synchronization code
1:28:42Fix compile errors in our .hht synchronization code
1:31:57Introduce CopyStreamToBuffer()
1:31:57Introduce CopyStreamToBuffer()
1:31:57Introduce CopyStreamToBuffer()
1:34:49Continue to fix compile errors in our .hht synchronization code
1:34:49Continue to fix compile errors in our .hht synchronization code
1:34:49Continue to fix compile errors in our .hht synchronization code
1:37:50Introduce a stubbed out Win32AtomicReplaceFileContents()
1:37:50Introduce a stubbed out Win32AtomicReplaceFileContents()
1:37:50Introduce a stubbed out Win32AtomicReplaceFileContents()
1:40:46Find that everything seems fine
🏃
1:40:46Find that everything seems fine
🏃
1:40:46Find that everything seems fine
🏃
1:43:11Break in to CopyStreamToBuffer() to see that it did not produce the expected result
🏃
1:43:11Break in to CopyStreamToBuffer() to see that it did not produce the expected result
🏃
1:43:11Break in to CopyStreamToBuffer() to see that it did not produce the expected result
🏃
1:44:05Make ParseHHT() initialise the HHTCopyPoint
1:44:05Make ParseHHT() initialise the HHTCopyPoint
1:44:05Make ParseHHT() initialise the HHTCopyPoint
1:46:17Step through ParseHHT() and watch the copy process play out
🏃
1:46:17Step through ParseHHT() and watch the copy process play out
🏃
1:46:17Step through ParseHHT() and watch the copy process play out
🏃
1:50:42Make the rebuild routine within ParseTopLevelBlock() responsible for its own memory
1:50:42Make the rebuild routine within ParseTopLevelBlock() responsible for its own memory
1:50:42Make the rebuild routine within ParseTopLevelBlock() responsible for its own memory
1:51:42Find that our .hht diffing / copying succeeds
🏃
1:51:42Find that our .hht diffing / copying succeeds
🏃
1:51:42Find that our .hht diffing / copying succeeds
🏃
1:52:30Q&A
🗩
1:52:30Q&A
🗩
1:52:30Q&A
🗩
1:54:02juiceweasel Q: Do you ever write unit tests for testing these low-level functions instead of running through the game?
🗪
1:54:02juiceweasel Q: Do you ever write unit tests for testing these low-level functions instead of running through the game?
🗪
1:54:02juiceweasel Q: Do you ever write unit tests for testing these low-level functions instead of running through the game?
🗪
1:56:322hstrike Q: Now that you've done a C++ game engine series, do you plan to do a C game engine series?
🗪
1:56:322hstrike Q: Now that you've done a C++ game engine series, do you plan to do a C game engine series?
🗪
1:56:322hstrike Q: Now that you've done a C++ game engine series, do you plan to do a C game engine series?
🗪
1:56:56raulrita Q: Any thoughts or hopes for c2x scheduled for 2022?
🗪
1:56:56raulrita Q: Any thoughts or hopes for c2x scheduled for 2022?
🗪
1:56:56raulrita Q: Any thoughts or hopes for c2x scheduled for 2022?
🗪
1:57:06edvinholm 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?
🗪
1:57:06edvinholm 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?
🗪
1:57:06edvinholm 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?
🗪
2:00:11y2kiah Q: How do you toggle between debug and release builds? Modify build.bat each time?
🗪
2:00:11y2kiah Q: How do you toggle between debug and release builds? Modify build.bat each time?
🗪
2:00:11y2kiah Q: How do you toggle between debug and release builds? Modify build.bat each time?
🗪
2:00:18zatrik1 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:00:18zatrik1 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:00:18zatrik1 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:05chlobimay 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
🗪
2:01:05chlobimay 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
🗪
2:01:05chlobimay 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
🗪
2:04:05ejgremlin Q: Watched your talk about lines of code problem. Have you ever seen anything from Ian Piumarta?
🗪
2:04:05ejgremlin Q: Watched your talk about lines of code problem. Have you ever seen anything from Ian Piumarta?
🗪
2:04:05ejgremlin Q: Watched your talk about lines of code problem. Have you ever seen anything from Ian Piumarta?
🗪
2:04:23scorpionilluminati handmade_hero Do twitch subs count towards source code access?
🗪
2:04:23scorpionilluminati handmade_hero Do twitch subs count towards source code access?
🗪
2:04:23scorpionilluminati handmade_hero Do twitch subs count towards source code access?
🗪
2:05:45stathizzzz Q: Do you use any graphics libraries like SDL, SFML?
🗪
2:05:45stathizzzz Q: Do you use any graphics libraries like SDL, SFML?
🗪
2:05:45stathizzzz Q: Do you use any graphics libraries like SDL, SFML?
🗪
2:05:53y2kiah 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
🗪
2:05:53y2kiah 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
🗪
2:05:53y2kiah 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
🗪
2:07:56Wrap it up with a plug of Meow the Infinite1 and a glimpse into the future
🗩
2:07:56Wrap it up with a plug of Meow the Infinite1 and a glimpse into the future
🗩
2:07:56Wrap it up with a plug of Meow the Infinite1 and a glimpse into the future
🗩