Handmade Hero»Episode Guide
Updating HHAs from V0 to V1
?
?

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:01Recap and set the stage for the day
🗩
0:01Recap and set the stage for the day
🗩
0:01Recap and set the stage for the day
🗩
1:47Take a look at the .hha files in our data directory
🗩
1:47Take a look at the .hha files in our data directory
🗩
1:47Take a look at the .hha files in our data directory
🗩
3:06Demo hhaedit creating a new local.hha file
🏃
3:06Demo hhaedit creating a new local.hha file
🏃
3:06Demo hhaedit creating a new local.hha file
🏃
4:00Run the game, hit our AssetCount mismatch assertion in AllocateGameAssets(), and plan out the day
🏃
4:00Run the game, hit our AssetCount mismatch assertion in AllocateGameAssets(), and plan out the day
🏃
4:00Run the game, hit our AssetCount mismatch assertion in AllocateGameAssets(), and plan out the day
🏃
5:28Dive into debugging the asset updating bug
📖
5:28Dive into debugging the asset updating bug
📖
5:28Dive into debugging the asset updating bug
📖
7:23Make WriteModificationsToHHA() account for the initial null asset
7:23Make WriteModificationsToHHA() account for the initial null asset
7:23Make WriteModificationsToHHA() account for the initial null asset
9:13Create a new .hha file, run the game twice and again hit our AssetCount mismatch assertion in AllocateGameAssets()
🏃
9:13Create a new .hha file, run the game twice and again hit our AssetCount mismatch assertion in AllocateGameAssets()
🏃
9:13Create a new .hha file, run the game twice and again hit our AssetCount mismatch assertion in AllocateGameAssets()
🏃
9:41Separate the AssetTypeCount from AssetCount in WriteModificationsToHHA()
9:41Separate the AssetTypeCount from AssetCount in WriteModificationsToHHA()
9:41Separate the AssetTypeCount from AssetCount in WriteModificationsToHHA()
12:19Perform our .hha creation / game running cycle, and again hit the AssetCount mismatch assertion in AllocateGameAssets()
🏃
12:19Perform our .hha creation / game running cycle, and again hit the AssetCount mismatch assertion in AllocateGameAssets()
🏃
12:19Perform our .hha creation / game running cycle, and again hit the AssetCount mismatch assertion in AllocateGameAssets()
🏃
13:31Create a debug directory containing only the data and our created local.hha
🗹
13:31Create a debug directory containing only the data and our created local.hha
🗹
13:31Create a debug directory containing only the data and our created local.hha
🗹
14:55Step through AllocateGameAssets() and inspect our local.hha to see that the OnePastLastAssetIndex is wrong
🏃
14:55Step through AllocateGameAssets() and inspect our local.hha to see that the OnePastLastAssetIndex is wrong
🏃
14:55Step through AllocateGameAssets() and inspect our local.hha to see that the OnePastLastAssetIndex is wrong
🏃
17:17Make WriteModificationsToHHA() correctly set OnePastLastAssetIndex
17:17Make WriteModificationsToHHA() correctly set OnePastLastAssetIndex
17:17Make WriteModificationsToHHA() correctly set OnePastLastAssetIndex
17:59Note the F8 command-completion shortcut in Command Prompt
🗩
17:59Note the F8 command-completion shortcut in Command Prompt
🗩
17:59Note the F8 command-completion shortcut in Command Prompt
🗩
18:32Create a new local.hha and ensure that we're all good
🏃
18:32Create a new local.hha and ensure that we're all good
🏃
18:32Create a new local.hha and ensure that we're all good
🏃
21:48Determine to write out our metadata and nail down the tag situation, and consider the possibility of enabling hhaedit to upgrade our .hha file format
🗩
21:48Determine to write out our metadata and nail down the tag situation, and consider the possibility of enabling hhaedit to upgrade our .hha file format
🗩
21:48Determine to write out our metadata and nail down the tag situation, and consider the possibility of enabling hhaedit to upgrade our .hha file format
🗩
24:11Dive into tagging, possibly storing tags for entire sprite sheets rather than individual sprites
🗩
24:11Dive into tagging, possibly storing tags for entire sprite sheets rather than individual sprites
🗩
24:11Dive into tagging, possibly storing tags for entire sprite sheets rather than individual sprites
🗩
28:32A few words on trying different solutions to problems
🗩
28:32A few words on trying different solutions to problems
🗩
28:32A few words on trying different solutions to problems
🗩
31:28Consider importing assets as named by the artist
🗩
31:28Consider importing assets as named by the artist
🗩
31:28Consider importing assets as named by the artist
🗩
33:01Art Space
🖌
33:01Art Space
🖌
33:01Art Space
🖌
38:49Integer-based IDs, that may later be associated with picking
🖌
38:49Integer-based IDs, that may later be associated with picking
🖌
38:49Integer-based IDs, that may later be associated with picking
🖌
39:17Merging of asset packs, and hierarchical tags
🖌
39:17Merging of asset packs, and hierarchical tags
🖌
39:17Merging of asset packs, and hierarchical tags
🖌
42:33Asset annotations
🗩
42:33Asset annotations
🗩
42:33Asset annotations
🗩
45:01Introduce hha_asset_markup struct for asset annotations, and add a Tag_Primacy asset_tag_id
45:01Introduce hha_asset_markup struct for asset annotations, and add a Tag_Primacy asset_tag_id
45:01Introduce hha_asset_markup struct for asset annotations, and add a Tag_Primacy asset_tag_id
50:40Augment our hha_header with Annotations (renaming hha_asset_markup to hha_annotation) setting us up for HHA file format upgrading
50:40Augment our hha_header with Annotations (renaming hha_asset_markup to hha_annotation) setting us up for HHA file format upgrading
50:40Augment our hha_header with Annotations (renaming hha_asset_markup to hha_annotation) setting us up for HHA file format upgrading
53:40Consider whether we need TypeIDs on our assets at all
🗩
53:40Consider whether we need TypeIDs on our assets at all
🗩
53:40Consider whether we need TypeIDs on our assets at all
🗩
56:49Consider using TypeIDs to partition the assets
🗩
56:49Consider using TypeIDs to partition the assets
🗩
56:49Consider using TypeIDs to partition the assets
🗩
57:50Add Tag_DataType asset_tag_id and an asset_data_type_id enum
57:50Add Tag_DataType asset_tag_id and an asset_data_type_id enum
57:50Add Tag_DataType asset_tag_id and an asset_data_type_id enum
1:00:14Set up to perform .hha file format upgrading, creating handmade_file_formats.h and separating the .hha struct version into their own files
1:00:14Set up to perform .hha file format upgrading, creating handmade_file_formats.h and separating the .hha struct version into their own files
1:00:14Set up to perform .hha file format upgrading, creating handmade_file_formats.h and separating the .hha struct version into their own files
1:02:31Introduce ReadHHA(), WriteHHA() and FileExists()
1:02:31Introduce ReadHHA(), WriteHHA() and FileExists()
1:02:31Introduce ReadHHA(), WriteHHA() and FileExists()
1:06:12Research file existence checking in the CRT
📖
1:06:12Research file existence checking in the CRT
📖
1:06:12Research file existence checking in the CRT
📖
1:09:10Implement FileExists() and set up to dump the .hha file contents to stdout
1:09:10Implement FileExists() and set up to dump the .hha file contents to stdout
1:09:10Implement FileExists() and set up to dump the .hha file contents to stdout
1:17:00Augment loaded_hha with TagCount and AssetCount, and hha_annotation with SourceFileBaseName, AssetName, AssetDescription and Author, and their counts
1:17:00Augment loaded_hha with TagCount and AssetCount, and hha_annotation with SourceFileBaseName, AssetName, AssetDescription and Author, and their counts
1:17:00Augment loaded_hha with TagCount and AssetCount, and hha_annotation with SourceFileBaseName, AssetName, AssetDescription and Author, and their counts
1:19:38Implement ReadHHA() and dump the MagicValue and Version to stdout
1:19:38Implement ReadHHA() and dump the MagicValue and Version to stdout
1:19:38Implement ReadHHA() and dump the MagicValue and Version to stdout
1:26:38Run hhaedit -info to see our info dump
🏃
1:26:38Run hhaedit -info to see our info dump
🏃
1:26:38Run hhaedit -info to see our info dump
🏃
1:27:01Create a fresh dummy.hha and check out its mini info dump
🏃
1:27:01Create a fresh dummy.hha and check out its mini info dump
🏃
1:27:01Create a fresh dummy.hha and check out its mini info dump
🏃
1:27:51Make ReadHHA() read in the file using ReadEntireFile() before extracting the MagicValue and SourceVersion and conditionally calling ReadHHA_V0() or ReadHHA_V1()1
1:27:51Make ReadHHA() read in the file using ReadEntireFile() before extracting the MagicValue and SourceVersion and conditionally calling ReadHHA_V0() or ReadHHA_V1()1
1:27:51Make ReadHHA() read in the file using ReadEntireFile() before extracting the MagicValue and SourceVersion and conditionally calling ReadHHA_V0() or ReadHHA_V1()1
1:33:06Enable ReadHHA_V0() to read in and upgrade the .hha file to version 1, and augment loaded_hha with a Valid boolean
1:33:06Enable ReadHHA_V0() to read in and upgrade the .hha file to version 1, and augment loaded_hha with a Valid boolean
1:33:06Enable ReadHHA_V0() to read in and upgrade the .hha file to version 1, and augment loaded_hha with a Valid boolean
1:51:04Implement WriteHHA()
1:51:04Implement WriteHHA()
1:51:04Implement WriteHHA()
1:55:46Consider our need to copy data from the data store forward
🗩
1:55:46Consider our need to copy data from the data store forward
🗩
1:55:46Consider our need to copy data from the data store forward
🗩
1:58:28Introduce loaded_hha_annotation for ReadHHA_V0() to use
1:58:28Introduce loaded_hha_annotation for ReadHHA_V0() to use
1:58:28Introduce loaded_hha_annotation for ReadHHA_V0() to use
2:00:46Define our hha structs as the old ones
2:00:46Define our hha structs as the old ones
2:00:46Define our hha structs as the old ones
2:03:02Run it and hit our InvalidCodePath in AllocateGameAssets()
🏃
2:03:02Run it and hit our InvalidCodePath in AllocateGameAssets()
🏃
2:03:02Run it and hit our InvalidCodePath in AllocateGameAssets()
🏃
2:05:09Step through AllocateGameAssets() and inspect the File to see that it's using the wrong sizes
2:05:09Step through AllocateGameAssets() and inspect the File to see that it's using the wrong sizes
2:05:09Step through AllocateGameAssets() and inspect the File to see that it's using the wrong sizes
2:06:07Correctly pragma pack the hha structs everywhere and redefine HHA_VERSION 0
2:06:07Correctly pragma pack the hha structs everywhere and redefine HHA_VERSION 0
2:06:07Correctly pragma pack the hha structs everywhere and redefine HHA_VERSION 0
2:07:06Run it to see that we're loading correctly
🏃
2:07:06Run it to see that we're loading correctly
🏃
2:07:06Run it to see that we're loading correctly
🏃
2:08:03Augment hha_annotation with FileDate, SpriteSheetX and SpriteSheetY
2:08:03Augment hha_annotation with FileDate, SpriteSheetX and SpriteSheetY
2:08:03Augment hha_annotation with FileDate, SpriteSheetX and SpriteSheetY
2:09:37Q&A
🗩
2:09:37Q&A
🗩
2:09:37Q&A
🗩
2:09:56frostyninja Q: So, instead of tags, why not relegate the logic of picking a range, or random bunch, of specific assets to the part that pulls assets in - e.g. when making a new entity or what have you, have a way to specify hey pick one from these specific assets here (by path / name or some other identifier). Obviously comes with its own issues, might not be what you want, and all but is it an idea you've entertained?
🗪
2:09:56frostyninja Q: So, instead of tags, why not relegate the logic of picking a range, or random bunch, of specific assets to the part that pulls assets in - e.g. when making a new entity or what have you, have a way to specify hey pick one from these specific assets here (by path / name or some other identifier). Obviously comes with its own issues, might not be what you want, and all but is it an idea you've entertained?
🗪
2:09:56frostyninja Q: So, instead of tags, why not relegate the logic of picking a range, or random bunch, of specific assets to the part that pulls assets in - e.g. when making a new entity or what have you, have a way to specify hey pick one from these specific assets here (by path / name or some other identifier). Obviously comes with its own issues, might not be what you want, and all but is it an idea you've entertained?
🗪
2:12:24steplery handmade_hero Do you have any plans about adding scripting? Which language you going to use for scripting in case if you have such plans (or will everything be C / C++ only)?
🗪
2:12:24steplery handmade_hero Do you have any plans about adding scripting? Which language you going to use for scripting in case if you have such plans (or will everything be C / C++ only)?
🗪
2:12:24steplery handmade_hero Do you have any plans about adding scripting? Which language you going to use for scripting in case if you have such plans (or will everything be C / C++ only)?
🗪
2:12:35centhusiast Q: Are we going to use typedef for the enums? Also, is an unnamed union inside a struct legal in terms of ANSI C?
🗪
2:12:35centhusiast Q: Are we going to use typedef for the enums? Also, is an unnamed union inside a struct legal in terms of ANSI C?
🗪
2:12:35centhusiast Q: Are we going to use typedef for the enums? Also, is an unnamed union inside a struct legal in terms of ANSI C?
🗪
2:13:48desuused Q: Will HHA contain hashes / checksums for original input files? This might allow a nice way to only update the changed assets, even if file timestamps are off
🗪
2:13:48desuused Q: Will HHA contain hashes / checksums for original input files? This might allow a nice way to only update the changed assets, even if file timestamps are off
🗪
2:13:48desuused Q: Will HHA contain hashes / checksums for original input files? This might allow a nice way to only update the changed assets, even if file timestamps are off
🗪
2:14:02Augement hha_annotation with SourceFileChecksum
2:14:02Augement hha_annotation with SourceFileChecksum
2:14:02Augement hha_annotation with SourceFileChecksum
2:15:14frostyninja Q: If the entity holds a reference into a table that looks up the asset then that would work with hotloading, no?
🗪
2:15:14frostyninja Q: If the entity holds a reference into a table that looks up the asset then that would work with hotloading, no?
🗪
2:15:14frostyninja Q: If the entity holds a reference into a table that looks up the asset then that would work with hotloading, no?
🗪
2:15:26Art Space
🖌
2:15:26Art Space
🖌
2:15:26Art Space
🖌
2:15:48frostyninja Also, what I meant was go away with the specific code-side defined tags and leave picking down to reference specifically by path or asset name that's based on the source asset file
🗪
2:15:48frostyninja Also, what I meant was go away with the specific code-side defined tags and leave picking down to reference specifically by path or asset name that's based on the source asset file
🗪
2:15:48frostyninja Also, what I meant was go away with the specific code-side defined tags and leave picking down to reference specifically by path or asset name that's based on the source asset file
🗪
2:16:09jessef Q: I implemented an animation system based on your tag system where every animation frame is tagged with a number between 0-tau and as the t value loop goes up it says "hey go get the next sprite" but not sure if this is a good idea? Do you see any problems with this, and / or how do 2D animation system normally know which sprite to grab?
🗪
2:16:09jessef Q: I implemented an animation system based on your tag system where every animation frame is tagged with a number between 0-tau and as the t value loop goes up it says "hey go get the next sprite" but not sure if this is a good idea? Do you see any problems with this, and / or how do 2D animation system normally know which sprite to grab?
🗪
2:16:09jessef Q: I implemented an animation system based on your tag system where every animation frame is tagged with a number between 0-tau and as the t value loop goes up it says "hey go get the next sprite" but not sure if this is a good idea? Do you see any problems with this, and / or how do 2D animation system normally know which sprite to grab?
🗪
2:18:26Close it down
🗩
2:18:26Close it down
🗩
2:18:26Close it down
🗩