diff --git a/cinera_includes_hero_media.conf b/cinera_includes_hero_media.conf index 0b1b143..b123d88 100644 --- a/cinera_includes_hero_media.conf +++ b/cinera_includes_hero_media.conf @@ -13,3 +13,4 @@ medium = "research" { icon = "📖"; name = "Research"; } medium = "run" { icon = "🏃"; name = "In-Game"; } medium = "speech" { icon = "🗩"; name = "Speech"; } medium = "trivia" { icon = "🎲"; name = "Trivia"; } +medium = "pet" { icon = "🐱"; name = "Pet Sounds"; } diff --git a/cinera_includes_hero_people.conf b/cinera_includes_hero_people.conf index 207555f..7982f09 100644 --- a/cinera_includes_hero_people.conf +++ b/cinera_includes_hero_people.conf @@ -21,6 +21,12 @@ person = "Molly" name = "Molly"; } + +person = "Rocket" +{ + name = "Rocket"; +} + person = "miblo" { name = "Matt Mascarenhas"; diff --git a/cmuratori/hero/code/code659.hmml b/cmuratori/hero/code/code659.hmml new file mode 100644 index 0000000..77262d8 --- /dev/null +++ b/cmuratori/hero/code/code659.hmml @@ -0,0 +1,138 @@ +[video output=day659 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Immediate-mode Level Generation" vod_platform=youtube id=mCTZHC7u5FE annotator=Miblo] +[0:00][Recap and set the stage for the day working on level generation][:"procedural generation" :speech] +[1:33][@wassimulator][Overlay didn't appear, by the way, [@cmuratori Casey]] +[1:48][Turn on ctray][:admin] +[2:31][Reacquaint ourselves with our declarative Verilog-style level generator][:"procedural generation" :research] +[4:44][Consider switching to a more direct, hand-coded level generation scheme, with lessened :"procedural generation"][:research] +[9:21][Prepare to work on CreateWorld()][:"procedural generation" :research] +[10:20][Thoughts on getting better by productively reorganising systems][:speech] +[11:56][Prepare to work on CreateWorld() (cont.)][:"procedural generation" :research] +[13:08][Comment out the GenerateWorld() part of CreateWorld()][:"procedural generation"] +[13:57][Contextualise our world design thought process with the Legend of Zelda map[ref + site="Thonky.com" + page="First Quest Map" + url=https://www.thonky.com/legend-of-zelda/zelda-map.png]][:"procedural generation" :research] +[21:58][Consider gated world exploration[ref + site="Thonky.com" + page="First Quest Map" + url=https://www.thonky.com/legend-of-zelda/zelda-map.png]][:"procedural generation" :research] +[26:55][@hukutoss][Stairs] +[27:00][Consider gated world exploration (cont.)[ref + site="Thonky.com" + page="First Quest Map" + url=https://www.thonky.com/legend-of-zelda/zelda-map.png]][:"procedural generation" :research] +[28:57][@tk_dev][Yeah, it drains the water] +[29:09][Aim for a world structure similar to The Legend of Zelda[ref + site="Thonky.com" + page="First Quest Map" + url=https://www.thonky.com/legend-of-zelda/zelda-map.png]] +[29:35][What does the whistle do in The Legend of Zelda?][:research] +[32:19][The whistle in The Legend of Zelda drains the lake[ref + author=TYSunny + title="The Legend of Zelda (NES) - 100% Full Game Walkthrough" + publisher=YouTube + url=https://youtu.be/6g2vk8Gudqs?t=4593]][:research] +[33:03][@skeletonstickbug][The flute dries up the lake to open 7, and warps you to completed dungeons from other screens. There's an invisible wall to get to the upper-right corner of the map] +[33:09][@kaffebaronen][Oh, Link to the Past has the wind thing in front of the bird statue] +[33:14][Initial thoughts for us on gated access based on item possession][:"procedural generation" :research] +[34:39][Consider placing tougher dungeons more distant from the start][:"procedural generation" :research] +[36:01][Determine to place dungeons using a tunable blue noise distribution][:"procedural generation" :research] +[38:19][Set up CreateWorld() to generate six dungeons][:"procedural generation"] +[42:10][Thoughts on floating difficulty of rogue-like games][:"game design" :"procedural generation" :research] +[44:29][@Rocket][Hi][:pet] +[45:37][@mr427][You could have hints at the dungeon entrance that lets the player know how difficult it is, so they could show up anywhere] +[46:57][Consider making dungeon exploration less about difficulty between dungeons, but more about how deep you want to go][:"game design" :research] +[48:13][@corpusc][Angband] +[48:21][Depth-choice dungeon exploration in Angband][:"game design" :research] +[49:54][Consider increasing the difficulty per floor, not per dungeon][:"game design" :research] +[50:20][@ablindorphan][Could you make it so that completing dungeons makes future dungeons harder?][:"game design" :research] +[50:49][@phildo3][Won't intro floors become grating by the end of the game, then?][:"game design" :research] +[51:25][Let CreateWorld() possibly generate up to nine dungeons][:"procedural generation"] +[51:39][@j_blow][If intro floors are too long they would be boring, but you want people to have a chance to feel like they actually got more powerful, rather than just ramping difficulty to meet them all the time][:"game design"] +[52:22][@gijlf][If there is any different gameplay based on items / weapons the difficulties can be linked to them. Like you have the sword of fire so the ice dungeon is easier, but the fire one would be harder but never impossible][:"game design"] +[52:29][Set up CreateWorld() to generate its dungeons, the forest and orphanage][:"procedural generation"] +[55:14][@doesntmeananything][I just want the Awesome Button. You press the Button, something Awesome happens. Button -> Awesome] +[55:24][Story time: The Million Dollar Button in Gabriel Knight 3][:speech] +[58:34][Augment world_generator with DungeonLocations for CreateWorld() to set][:"data structure" :"procedural generation"] +[59:56][Consider how to space out dungeons[ref + site="Thonky.com" + page="First Quest Map" + url=https://www.thonky.com/legend-of-zelda/zelda-map.png]][:"procedural generation" :research] +[1:01:17][Make CreateWorld() space out dungeons[ref + site="Thonky.com" + page="First Quest Map" + url=https://www.thonky.com/legend-of-zelda/zelda-map.png]][:"procedural generation"] +[1:09:27][@sagian2005][I got tired of saying "distance squared" all the time and discovered that it's called a quadrance[ref + site=Wikipedia + page="Divine Proportions: Rational Trigonometry to Universal Geometry" + url=https://en.wikipedia.org/wiki/Divine_Proportions:_Rational_Trigonometry_to_Universal_Geometry]][:mathematics] +[1:12:41][@dustingadal][Google ngram search hasn't heard of it[ref + site="Google Ngram Viewer" + page=quadrance + url=https://books.google.com/ngrams/graph?content=quadrance]] +[1:12:52][Make CreateWorld() space out dungeons (cont.)][:"procedural generation"] +[1:15:00][Reflect on our annulus-shaped dungeon placement[ref + site=Wikipedia + page=Annulus + url=https://en.wikipedia.org/wiki/Annulus_(mathematics)]][:mathematics :"procedural generation"] +[1:15:55][Note our need to visualise the dungeon generation][:"debug visualisation" :"procedural generation" :research] +[1:19:25][Toggle on the :"procedural generation" drawing in UpdateAndRenderWorld()][:"debug visualisation"] +[1:20:08][Stub out CreateDungeon(), CreateDungeons(), CreateForest() and CreateOrphanage(), augmenting world_generator with OrphanageLocation and DungeonCount][:"data structure" :"procedural generation"] +[1:24:14][Determine to get a debug map going][:"procedural generation" :research] +[1:24:47][Stretch to infinity, just like Sausage Dog Tends To Infinity[ref + site=Steam + page="Sausage Dog Tends To Infinity" + url=https://store.steampowered.com/app/1299340/Sausage_Dog_Tends_To_Infinity/]][:research] +[1:27:34][Implement CreateDungeon(), introducing PlaceDebugMarker()][:"procedural generation"] +[1:34:58][@dedknd][[@cmuratori Casey] has Bobby McFerrin car vibes today] +[1:37:03][@snoxs49][What is that internal keyword for?][:language] +[1:37:47][@nilsonragee][#define internal static][:language] +[1:38:02][Anticipate the next Bobby McFerrin craze][:speech] +[1:38:42][Toggle off the :camera placement in CreateWorld()][:"procedural generation"] +[1:39:16][:Run straight into the cutscene, because there's no world][:"procedural generation"] +[1:40:01][Determine to vaporise GenRoom()][:"procedural generation" :research] +[1:40:25][@j_blow][I did just show up again] +[1:40:28][What is happening with Sausage Dog Tends To Infinity?] +[1:41:16][@j_blow][I played an early version of it like 3–4 years ago] +[1:42:24][@j_blow][Release Date Tends to Infinity] +[1:42:44][@snoxs49][Maybe we get Half-Life 3 first] +[1:43:00][Simplify GenerateRoom() for our new generator to call procedurally, delete GenerateWorld() and let CreateWorld() set the :camera position][:"procedural generation"] +[1:46:53][@colax][It's so interesting to see both @j_blow and [@cmuratori Casey] use no autocomplete. For some reason it looks like it's faster than actually having autocomplete. Maybe just typing what we want is faster than the process of our eyes seeing what we want then responding] +[1:48:40][@slava_radko][Visual Studio changes text what I typed instead of suggesting. That's even worse] +[1:49:10][Augment world_generator with StartingRoom for CreateWorld() to set][:"data structure" :"procedural generation"] +[1:50:05][Set up CreateOrphanage() to call GenerateRoom()][:"procedural generation"] +[1:51:17][@j_blow][Almost nobody designs autocomplete any more so that you can just type and not look] +[1:53:03][Make CreateOrphanage() initialise a RoomSpec, removing the gen_apron_spec * from gen_room_spec, and GenRoom()][:"data structure" :"procedural generation"] +[1:55:30][Thoughts on forward-declarations in C / C++][:language :rant :speech] +[1:56:30][@jesobuild][They "fixed it" with C++ 20 and modules][:language] +[1:56:49][@slava_radko][But what would you ship with the :library then?][:language] +[1:59:16][Fix compile errors in GenerateRoom()][:"procedural generation"] +[2:00:05][@valxntinebxtt][That rant on forward-declarations was enough for a sub][:language] +[2:01:38][Make CreateOrphanage() set the RoomVol][:"procedural generation"] +[2:03:00][@kaibutsi][Regarding autocomplete / IntelliSense I think there's a place for it, most likely not in the environment you're currently working in, but it's definitely useful for discoverability when using 3rd-party libraries in languages with stronger type systems] +[2:04:20][Make CreateOrphanage() set the RoomVol (cont.)][:"procedural generation"] +[2:04:37][Launch into our newly-generated room][:"procedural generation" :run] +[2:04:58][Toggle off CollisionVolume drawing in UpdateAndRenderEntities()][:"debug visualisation"] +[2:05:34][Check out our generated world][:"debug visualisation" :"procedural generation" :run] +[2:06:04][Disable GRID_RAY_CAST_DEBUGGING][:lighting] +[2:06:13][Our dungeons are too close together][:"debug visualisation" :"procedural generation" :run] +[2:06:45][Make CreateDungeons() further separate out the dungeons][:"procedural generation"] +[2:07:09][Fall into an infinite loop with our random dungeon placement][:"procedural generation" :run] +[2:07:27][Decrease MinDungeonSeparationDistance from 100 to 10 in CreateDungeons()][:"procedural generation"] +[2:07:47][Dungeons are not distributed evenly][:"procedural generation" :run] +[2:08:08][Tweak the distance values in CreateDungeons()][:"procedural generation"] +[2:09:36][Our dungeons may now be too far away][:"procedural generation" :run] +[2:10:02][Decrease the distance values in CreateDungeons()][:"procedural generation"] +[2:10:32][Our dungeon placement seems not terrible][:"procedural generation" :run] +[2:12:05][Determine to let CreateWorld() use a random seed][:prng :research] +[2:13:44][@graemephi][That was Banjo-Kazooie, I'm sure of it] +[2:14:22][Make CreateWorld() take an InitialSeed, augmenting game_input with Entropy and EntropyRequested][:"data structure" :prng] +[2:18:37][Judicially requesting entropy][:hardware :isa :prng :speech] +[2:21:14][Make WinMainCRTStartup() request Entropy, introducing Win32GetEntropy() using BCryptGenRandom()[ref + site="Microsoft Docs" + page="BCryptGenRandom function (bcrypt.h)" + url=https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom]][:"platform layer" :prng] +[2:27:18][Step in to Win32GetEntropy()][:"platform layer" :prng :run] +[2:27:42][Our :"procedural generation" passes now differ][:run] +[2:29:00][That's good enough for now, with a glimpse into the future][:speech] +[/video]