[video output=day500 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Saving HHAs Modified by the In-Game Editor" vod_platform=youtube id=EgLT-43RnC4 annotator=Miblo]
[0:01][Recap and set the stage for the day saving our in-game asset edits][:"asset system" :run]
[5:07][Dive into saving asset modifications, introducing SaveAllChanges() and WriteAllHHAModifications()][:"asset system"]
[10:35][Fixing "redo"][:speech :"undo / redo"]
[13:14][Respecify CleanUndoSentinelNext from in_game_editor as a CleanEdit, introducing FindCleanEditList() and EditExistsIn()][:"undo / redo"]
[20:57][Fix our "Revert" implementation in UpdateAndRenderEditor()][:"undo / redo"]
[23:59][Enable SaveAllChanges() to mark asset files as modified, introducing GetAssetForEdit()][:"asset system" :"file io"]
[32:30][Try out our asset editing and saving][:"asset system" :run :ui]
[36:03][Relaunch the game to find that our asset information was saved][:"asset system" :run :ui]
[36:41][Prevent AddCat() from offsetting the pieces' positions][:"entity system"]
[38:06][Find that our cat is stuck underground][:"entity system" :run]
[39:17][Make UpdateAndRenderEntities() offset asset piece positions after they've been snapped to their parent][:"entity system"]
[43:04][Find that our cat is not standing on the ground][:"entity system" :run]
[45:00][Check how entities get placed][:"entity system" :research]
[48:39][Enable drawing of traversable points in UpdateAndRenderEntities()][:"debug visualisation" :"entity system"]
[50:21][Find that the traversable points are in the right place][:"debug visualisation" :"entity system" :run]
[50:56][Make AddCat() call GetSimSpaceTraversable() as per AddPlayer()][:"entity system"]
[53:56][Find that our cat has moved, but not onto a traversable point][:"entity system" :run]
[54:19][Delete GetEntityGroundPoint(), and make UpdateAndRenderEntities() draw entity locations][:"debug visualisation" :"entity system"]
[57:13][Find that our entity's actual position is wrong][:"debug visualisation" :"entity system" :run]
[57:53][Make GenerateRoom() place the floor tiles before placing the entities][:"entity system" :"procedural generation"]
[59:22][Find that the cat is now correctly placed on the floor, with only its Z-bias remaining incorrect][:"debug visualisation" :"entity system" :run]
[1:01:14][Offsetting entity pieces in Z][:"entity system" :speech]
[1:02:42][Make AddCat() offset the head position 0.1f in Z][:"entity system"]
[1:02:57][See the head's displacement, and position our other cats][:"asset system" :"entity system" :run :ui]
[1:09:40][Consider filling out the area around the edges of scenes, and fixing :camera interpolation and :lighting][:run]
[1:11:34][Check out our :art][:admin]
[1:16:52][Consider getting our characters in there and making an outdoors area][:run]
[1:17:34][Create an outdoors area in GenerateRoom()][:"procedural generation"]
[1:20:05][Explore the world outside the orphanage, and consider fixing the :camera and :lighting][:"procedural generation" :rendering :run]
[1:24:50][:Camera placement and interpolation][:speech]
[1:26:16][Toggle on the hero's light in UpdateAndRenderWorld()][:"entity system"]
[1:27:15][Traverse the world, to find that we can leap over single-tile thick walls][:movement :run]
[1:29:38][Reduce the hop search radius in ExecuteBrainHero() to 1.25f][:"entity system" :movement]
[1:30:02][Find that we can no longer leap over walls, and consider :camera improvements][:movement :run]
[1:33:27][Remove all the lights from the world][:lighting :"procedural generation"]
[1:33:43][Traverse our darkened orphanage][:lighting :"procedural generation" :run]
[1:34:12][:Camera fixes][:research]
[1:42:10][Make UpdateCameraForEntityMovement() set the :camera position relative to the Region->Origin][:camera]
[1:45:58][Find that the :camera height changes discontinuously][:run]
[1:46:42][Make UpdateCameraForEntityMovement() offset the TargetP.z straight off the bat, and remove OffsetZ from game_camera][:camera]
[1:50:10][Find that our :camera interpolation remains discontinuous][:run]
[1:51:18][Continue to investigate our :camera discontinuity][:research]
[1:54:57][Remove CameraOffset and CameraDolly from UpdateAndRenderWorld()][:camera]
[1:57:06][:Animation interpolation between absolute positions][:speech]
[1:57:47][Make UpdateAndRenderWorld() interpolate the :camera between its unmodified positions]
[1:58:16][Find that the :camera interpolates correctly][:run]
[1:59:10][Make UpdateCameraForEntityMovement() take a CameraZ from UpdateAndRenderWorld() to offset the :camera's actual position]
[2:00:10][Find that the :camera interpolation is now buttery smooth][:run]
[2:01:25][Q&A][:speech]
[2:01:40][@jmc516][Q: Have you ever found yourself angry with something in the game? Maybe the progress or a certain part? If so, how did you get past it?]
[2:02:26][@tili_us][Q: Are you planning to switch up the interpolation with a smoothdamp function?][:camera]
[2:03:21][@nickito97][Q: Do you ever feel like everything needs work to the point it's demotivating / you're not even sure where to start?]
[2:05:28][@garryjohanson][Q: So we've been debating the merits of using a garbage-collected :language like go in a network situation where you have absolutely no prediction of what data loads will be coming in. Do you think a language like go would be a good choice? (I feel like you've answered a question like this, but I honestly don't remember your response)][:memory]
[2:10:26][@tili_us][Q: Is it better to work on a fun task or a task that is more important if you have limited time?]
[2:11:27][Understanding the decision to use a technically suboptimal solution, e.g. garbage collection, as a trade-off][:speech]
[2:14:52][Wrap it up][:speech]
[/video]
