[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]