Loading and Displaying HHA Files as Text
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
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 and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

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:01Recap and set the stage for the day continuing with our modder-friendly asset file format
🗩
0:01Recap and set the stage for the day continuing with our modder-friendly asset file format
🗩
0:01Recap and set the stage for the day continuing with our modder-friendly asset file format
🗩
2:23Dive into the code with a few words on the asset annotations, and the determination to augment the hha_asset struct with data conducive to moving assets between packs
🗩
2:23Dive into the code with a few words on the asset annotations, and the determination to augment the hha_asset struct with data conducive to moving assets between packs
🗩
2:23Dive into the code with a few words on the asset annotations, and the determination to augment the hha_asset struct with data conducive to moving assets between packs
🗩
7:03Augment hha_asset with DataSize and DataType
7:03Augment hha_asset with DataSize and DataType
7:03Augment hha_asset with DataSize and DataType
11:13Introduce CTAssert() (compile-time assertion)
11:13Introduce CTAssert() (compile-time assertion)
11:13Introduce CTAssert() (compile-time assertion)
16:35Provide the ability to use CTAssert() multiple times, by appending __LINE__ to its test struct
16:35Provide the ability to use CTAssert() multiple times, by appending __LINE__ to its test struct
16:35Provide the ability to use CTAssert() multiple times, by appending __LINE__ to its test struct
24:36Use CTAssert() on our hha_asset, hha_annotation, hha_tag and hha_header structs
24:36Use CTAssert() on our hha_asset, hha_annotation, hha_tag and hha_header structs
24:36Use CTAssert() on our hha_asset, hha_annotation, hha_tag and hha_header structs
26:01Introduce flag32() and enum32() for hha_asset, hha_sound and hha_tag to use, for documentation purposes
26:01Introduce flag32() and enum32() for hha_asset, hha_sound and hha_tag to use, for documentation purposes
26:01Introduce flag32() and enum32() for hha_asset, hha_sound and hha_tag to use, for documentation purposes
29:41Set up to finish the asset importer
🗩
29:41Set up to finish the asset importer
🗩
29:41Set up to finish the asset importer
🗩
32:53Include the necessary data from hha_annotation in loaded_hha_annotation
32:53Include the necessary data from hha_annotation in loaded_hha_annotation
32:53Include the necessary data from hha_annotation in loaded_hha_annotation
35:15Introduce WrapZ() and ConstZ() as a way to turn a null-terminated string into a count-string, for ReadHHA_V0() to use when setting the DefaultAnnotation
35:15Introduce WrapZ() and ConstZ() as a way to turn a null-terminated string into a count-string, for ReadHHA_V0() to use when setting the DefaultAnnotation
35:15Introduce WrapZ() and ConstZ() as a way to turn a null-terminated string into a count-string, for ReadHHA_V0() to use when setting the DefaultAnnotation
40:19Set up to dump our HHA info
🗩
40:19Set up to dump our HHA info
🗩
40:19Set up to dump our HHA info
🗩
41:27Enable hhaedit to print the TagCount, AssetCount and presence of Annotations
41:27Enable hhaedit to print the TagCount, AssetCount and presence of Annotations
41:27Enable hhaedit to print the TagCount, AssetCount and presence of Annotations
42:38Check out our HHA printout
🏃
42:38Check out our HHA printout
🏃
42:38Check out our HHA printout
🏃
42:46Introduce PrintHeaderInfo() and a -dump flag
42:46Introduce PrintHeaderInfo() and a -dump flag
42:46Introduce PrintHeaderInfo() and a -dump flag
44:43Check out our -info and -dump
🏃
44:43Check out our -info and -dump
🏃
44:43Check out our -info and -dump
🏃
45:03Demo TabView from the Handmade Fund's bonus pack1
🏃
45:03Demo TabView from the Handmade Fund's bonus pack1
🏃
45:03Demo TabView from the Handmade Fund's bonus pack1
🏃
46:49Introduce PrintContents() to print our HHA data indented for viewing in TabView
46:49Introduce PrintContents() to print our HHA data indented for viewing in TabView
46:49Introduce PrintContents() to print our HHA data indented for viewing in TabView
51:31Enable ReadHHA_V0() to read in all the asset types
51:31Enable ReadHHA_V0() to read in all the asset types
51:31Enable ReadHHA_V0() to read in all the asset types
1:09:35Dump our HHA info and take a look at it in TabView
🏃
1:09:35Dump our HHA info and take a look at it in TabView
🏃
1:09:35Dump our HHA info and take a look at it in TabView
🏃
1:10:07Enable PrintContents() to print the Tags
1:10:07Enable PrintContents() to print the Tags
1:10:07Enable PrintContents() to print the Tags
1:13:03Check out our dump in TabView
🏃
1:13:03Check out our dump in TabView
🏃
1:13:03Check out our dump in TabView
🏃
1:13:40Enable ReadHHA_V0() to read in the tags
1:13:40Enable ReadHHA_V0() to read in the tags
1:13:40Enable ReadHHA_V0() to read in the tags
1:14:21Check out our dump in TabView to see some UNKNOWN tags
🏃
1:14:21Check out our dump in TabView to see some UNKNOWN tags
🏃
1:14:21Check out our dump in TabView to see some UNKNOWN tags
🏃
1:14:52Fix the TagCount in ReadHHA_V0()
1:14:52Fix the TagCount in ReadHHA_V0()
1:14:52Fix the TagCount in ReadHHA_V0()
1:15:02Check out our dump in TabView to see that our tags are correct
🏃
1:15:02Check out our dump in TabView to see that our tags are correct
🏃
1:15:02Check out our dump in TabView to see that our tags are correct
🏃
1:15:07Try dumping test2.hha to see that it has no tags
🏃
1:15:07Try dumping test2.hha to see that it has no tags
🏃
1:15:07Try dumping test2.hha to see that it has no tags
🏃
1:16:20Try dumping intro_art.hha to see that it looks like we're working properly
🏃
1:16:20Try dumping intro_art.hha to see that it looks like we're working properly
🏃
1:16:20Try dumping intro_art.hha to see that it looks like we're working properly
🏃
1:17:05Enable PrintContents() to print out all the information, introducing PrintTag()
1:17:05Enable PrintContents() to print out all the information, introducing PrintTag()
1:17:05Enable PrintContents() to print out all the information, introducing PrintTag()
1:32:11Check out our more detailed dump in TabView
🏃
1:32:11Check out our more detailed dump in TabView
🏃
1:32:11Check out our more detailed dump in TabView
🏃
1:32:54Make PrintContents() flip the x and y when printing "Tags: x at y"
1:32:54Make PrintContents() flip the x and y when printing "Tags: x at y"
1:32:54Make PrintContents() flip the x and y when printing "Tags: x at y"
1:33:54Check out the dump of testfonts.hha
🏃
1:33:54Check out the dump of testfonts.hha
🏃
1:33:54Check out the dump of testfonts.hha
🏃
1:34:39Prevent PrintContents() from printing the tag field if there are no tags
1:34:39Prevent PrintContents() from printing the tag field if there are no tags
1:34:39Prevent PrintContents() from printing the tag field if there are no tags
1:35:15Check out the dump of testfonts.hha
🏃
1:35:15Check out the dump of testfonts.hha
🏃
1:35:15Check out the dump of testfonts.hha
🏃
1:36:57Q&A (not quite)
🗩
1:36:57Q&A (not quite)
🗩
1:36:57Q&A (not quite)
🗩
1:37:27Enable PrintContents() to print the Annotations
1:37:27Enable PrintContents() to print the Annotations
1:37:27Enable PrintContents() to print the Annotations
1:38:13Check out the dump of testfonts.hha with its annotations
🏃
1:38:13Check out the dump of testfonts.hha with its annotations
🏃
1:38:13Check out the dump of testfonts.hha with its annotations
🏃
1:38:47Enable PrintContents() to print the AssetDescription and Author, wondering whether %llu is the correct identifier, with a meta-comment on metaprogramming
1:38:47Enable PrintContents() to print the AssetDescription and Author, wondering whether %llu is the correct identifier, with a meta-comment on metaprogramming
1:38:47Enable PrintContents() to print the AssetDescription and Author, wondering whether %llu is the correct identifier, with a meta-comment on metaprogramming
1:42:04Check out our further annotated dump of testfonts.hha
🏃
1:42:04Check out our further annotated dump of testfonts.hha
🏃
1:42:04Check out our further annotated dump of testfonts.hha
🏃
1:42:12Q&A
🗩
1:42:12Q&A
🗩
1:42:12Q&A
🗩
1:42:26mmozeiko Q: I would suggest using static_assert(bool_condition, "message"); instead of CTAssert. It is a C++11 feature and it is supported by MSVC2013 (you are using other C++11 features already now anyways)
🗪
1:42:26mmozeiko Q: I would suggest using static_assert(bool_condition, "message"); instead of CTAssert. It is a C++11 feature and it is supported by MSVC2013 (you are using other C++11 features already now anyways)
🗪
1:42:26mmozeiko Q: I would suggest using static_assert(bool_condition, "message"); instead of CTAssert. It is a C++11 feature and it is supported by MSVC2013 (you are using other C++11 features already now anyways)
🗪
1:43:01Change CTAssert() to be a static_assert
1:43:01Change CTAssert() to be a static_assert
1:43:01Change CTAssert() to be a static_assert
1:45:09Jim0_o Q: Regarding CTAssert: Do you have a trick for getting a number for __FILE__ to use in the struct name (assuming you don't have a trick for using that in the struct name)?
🗪
1:45:09Jim0_o Q: Regarding CTAssert: Do you have a trick for getting a number for __FILE__ to use in the struct name (assuming you don't have a trick for using that in the struct name)?
🗪
1:45:09Jim0_o Q: Regarding CTAssert: Do you have a trick for getting a number for __FILE__ to use in the struct name (assuming you don't have a trick for using that in the struct name)?
🗪
1:46:42mallesbixie Q: You have "one past alst" in your output
🗪
1:46:42mallesbixie Q: You have "one past alst" in your output
🗪
1:46:42mallesbixie Q: You have "one past alst" in your output
🗪
1:46:48Fix typo in PrintContents()
1:46:48Fix typo in PrintContents()
1:46:48Fix typo in PrintContents()
1:47:01Brian Q: In an earlier episode of Handmade Hero (around day 160), you answered a question regarding your plan on splitting Handmade Hero into two parts – first, writing the engine; second, writing the game – and there was a clear divide. Do you still see you moving towards that goal, or do you feel it is better, when you move to game code, to still work on the engine to add features?
🗪
1:47:01Brian Q: In an earlier episode of Handmade Hero (around day 160), you answered a question regarding your plan on splitting Handmade Hero into two parts – first, writing the engine; second, writing the game – and there was a clear divide. Do you still see you moving towards that goal, or do you feel it is better, when you move to game code, to still work on the engine to add features?
🗪
1:47:01Brian Q: In an earlier episode of Handmade Hero (around day 160), you answered a question regarding your plan on splitting Handmade Hero into two parts – first, writing the engine; second, writing the game – and there was a clear divide. Do you still see you moving towards that goal, or do you feel it is better, when you move to game code, to still work on the engine to add features?
🗪
1:48:00nordicplayer Q: How to deal with concurrency in C++?
🗪
1:48:00nordicplayer Q: How to deal with concurrency in C++?
🗪
1:48:00nordicplayer Q: How to deal with concurrency in C++?
🗪
1:50:44mallesbixie Q: Why is hha version 1 still important? Is it only to convert the (few) existing assets?
🗪
1:50:44mallesbixie Q: Why is hha version 1 still important? Is it only to convert the (few) existing assets?
🗪
1:50:44mallesbixie Q: Why is hha version 1 still important? Is it only to convert the (few) existing assets?
🗪
1:51:17noxnode Q: How do you feel about the progress of Handmade Hero so far?
🗪
1:51:17noxnode Q: How do you feel about the progress of Handmade Hero so far?
🗪
1:51:17noxnode Q: How do you feel about the progress of Handmade Hero so far?
🗪
1:51:51nordicplayer Q: Should I learn C or C++ first? Is there any good advantage that C++ offers?
🗪
1:51:51nordicplayer Q: Should I learn C or C++ first? Is there any good advantage that C++ offers?
🗪
1:51:51nordicplayer Q: Should I learn C or C++ first? Is there any good advantage that C++ offers?
🗪
1:53:31jwindahouse Q: Given that static_assert is a language feature and you can't really implement it yourself, why not just use it?
🗪
1:53:31jwindahouse Q: Given that static_assert is a language feature and you can't really implement it yourself, why not just use it?
🗪
1:53:31jwindahouse Q: Given that static_assert is a language feature and you can't really implement it yourself, why not just use it?
🗪
1:53:40thebirkisreal Q: Remember to lookup printf() stuff2
🗪
1:53:40thebirkisreal Q: Remember to lookup printf() stuff2
🗪
1:53:40thebirkisreal Q: Remember to lookup printf() stuff2
🗪
1:54:31longboolean Q: I know we haven't done much with in-game text in this series yet, but could the asset system be used as is for storing story text, etc., tagged with language tag for translation and other relevant data tags? Maybe we would want custom tags for storing language codes? Or do you think it better to make a different system specifically for this purpose? Also, TabView is looking cool. All it needs now is the iconic Handmade Hero dark theme
🗪
1:54:31longboolean Q: I know we haven't done much with in-game text in this series yet, but could the asset system be used as is for storing story text, etc., tagged with language tag for translation and other relevant data tags? Maybe we would want custom tags for storing language codes? Or do you think it better to make a different system specifically for this purpose? Also, TabView is looking cool. All it needs now is the iconic Handmade Hero dark theme
🗪
1:54:31longboolean Q: I know we haven't done much with in-game text in this series yet, but could the asset system be used as is for storing story text, etc., tagged with language tag for translation and other relevant data tags? Maybe we would want custom tags for storing language codes? Or do you think it better to make a different system specifically for this purpose? Also, TabView is looking cool. All it needs now is the iconic Handmade Hero dark theme
🗪
1:55:32tmellemseter Q: Out of curiosity, why OnePassedLastAssetsIndex. Would not, e.g. AssetCount or NumberOfAssets be more readable?
🗪
1:55:32tmellemseter Q: Out of curiosity, why OnePassedLastAssetsIndex. Would not, e.g. AssetCount or NumberOfAssets be more readable?
🗪
1:55:32tmellemseter Q: Out of curiosity, why OnePassedLastAssetsIndex. Would not, e.g. AssetCount or NumberOfAssets be more readable?
🗪
1:55:54uplinkcoder Q: Maybe you could add the line to the message? Or did it print line numbers
🗪
1:55:54uplinkcoder Q: Maybe you could add the line to the message? Or did it print line numbers
🗪
1:55:54uplinkcoder Q: Maybe you could add the line to the message? Or did it print line numbers
🗪
1:56:09vaualbus Q: Does the CTAssert fail if we have two asserts in two files at the same line?
🗪
1:56:09vaualbus Q: Does the CTAssert fail if we have two asserts in two files at the same line?
🗪
1:56:09vaualbus Q: Does the CTAssert fail if we have two asserts in two files at the same line?
🗪
1:56:41tmellemseter Q: I'm interested in knowing how downloading a patch or DLC is getting installed and changes how existing code works. Would that be covered at the end?
🗪
1:56:41tmellemseter Q: I'm interested in knowing how downloading a patch or DLC is getting installed and changes how existing code works. Would that be covered at the end?
🗪
1:56:41tmellemseter Q: I'm interested in knowing how downloading a patch or DLC is getting installed and changes how existing code works. Would that be covered at the end?
🗪
1:57:15grimjoey Q: How did you recompile / reload a dll when LoadLibrary seems to keep a lock on the file? Any tricks or just copy the dll?
🗪
1:57:15grimjoey Q: How did you recompile / reload a dll when LoadLibrary seems to keep a lock on the file? Any tricks or just copy the dll?
🗪
1:57:15grimjoey Q: How did you recompile / reload a dll when LoadLibrary seems to keep a lock on the file? Any tricks or just copy the dll?
🗪
1:57:34flyinginthedark Q: Why not use -1 instead of 0 as an array length to get harder error in assert?
🗪
1:57:34flyinginthedark Q: Why not use -1 instead of 0 as an array length to get harder error in assert?
🗪
1:57:34flyinginthedark Q: Why not use -1 instead of 0 as an array length to get harder error in assert?
🗪
1:57:46Make CTAssert3() use array length of -1
1:57:46Make CTAssert3() use array length of -1
1:57:46Make CTAssert3() use array length of -1
1:58:27mmozeiko Q: long long is not the same as int64_t type (it is 64-bit but gcc / clang will still complain that %llu does not match uint64_t). The "proper" way is to include <inttypes.h> which provides compiler specific PRIu64 string literal (as define), so you need to do printf("%" PRIu64, value);
🗪
1:58:27mmozeiko Q: long long is not the same as int64_t type (it is 64-bit but gcc / clang will still complain that %llu does not match uint64_t). The "proper" way is to include <inttypes.h> which provides compiler specific PRIu64 string literal (as define), so you need to do printf("%" PRIu64, value);
🗪
1:58:27mmozeiko Q: long long is not the same as int64_t type (it is 64-bit but gcc / clang will still complain that %llu does not match uint64_t). The "proper" way is to include <inttypes.h> which provides compiler specific PRIu64 string literal (as define), so you need to do printf("%" PRIu64, value);
🗪
1:59:16vaualbus Q: Doeo the preprocessor parse before #include directive and then resolve the __LINE__ after the include is parsed? I still do not get why the preprocessor, that can be powerful, is so bad
🗪
1:59:16vaualbus Q: Doeo the preprocessor parse before #include directive and then resolve the __LINE__ after the include is parsed? I still do not get why the preprocessor, that can be powerful, is so bad
🗪
1:59:16vaualbus Q: Doeo the preprocessor parse before #include directive and then resolve the __LINE__ after the include is parsed? I still do not get why the preprocessor, that can be powerful, is so bad
🗪
1:59:51Demo line number resolution
1:59:51Demo line number resolution
1:59:51Demo line number resolution
2:01:57Compile it to see our error reported to be on line 278
2:01:57Compile it to see our error reported to be on line 278
2:01:57Compile it to see our error reported to be on line 278
2:02:18Demo use of the #line directive3
2:02:18Demo use of the #line directive3
2:02:18Demo use of the #line directive3
2:03:43mmozeiko Q: The good news is that starting with C99 printf() supports u modifier for size_t - so "%zu" or "%zx" would work
🗪
2:03:43mmozeiko Q: The good news is that starting with C99 printf() supports u modifier for size_t - so "%zu" or "%zx" would work
🗪
2:03:43mmozeiko Q: The good news is that starting with C99 printf() supports u modifier for size_t - so "%zu" or "%zx" would work
🗪
2:04:17Replace %llu with %zu in hhaedit.cpp
2:04:17Replace %llu with %zu in hhaedit.cpp
2:04:17Replace %llu with %zu in hhaedit.cpp
2:04:37Check out the dump of testfonts.hha to see that %zu works
🏃
2:04:37Check out the dump of testfonts.hha to see that %zu works
🏃
2:04:37Check out the dump of testfonts.hha to see that %zu works
🏃
2:05:17noxnode Q: Have you ever changed the line number / file name in that way in an actual project?
🗪
2:05:17noxnode Q: Have you ever changed the line number / file name in that way in an actual project?
🗪
2:05:17noxnode Q: Have you ever changed the line number / file name in that way in an actual project?
🗪
2:05:41mmozeiko Oops, "z" modifier. What was changed? I missed it...
🗪
2:05:41mmozeiko Oops, "z" modifier. What was changed? I missed it...
🗪
2:05:41mmozeiko Oops, "z" modifier. What was changed? I missed it...
🗪
2:06:04mmozeiko "%zu" will work only for size_t type, not uint64_t type
🗪
2:06:04mmozeiko "%zu" will work only for size_t type, not uint64_t type
🗪
2:06:04mmozeiko "%zu" will work only for size_t type, not uint64_t type
🗪
2:06:15Change PrintContents() to cast some values to size_t
2:06:15Change PrintContents() to cast some values to size_t
2:06:15Change PrintContents() to cast some values to size_t
2:07:27Close it down in the hopes that that's okay
🗩
2:07:27Close it down in the hopes that that's okay
🗩
2:07:27Close it down in the hopes that that's okay
🗩