{"id":1076,"date":"2025-08-26T21:42:42","date_gmt":"2025-08-27T01:42:42","guid":{"rendered":"https:\/\/willkolb.com\/?p=1076"},"modified":"2025-08-26T21:42:42","modified_gmt":"2025-08-27T01:42:42","slug":"now-they-talk-to-each-other","status":"publish","type":"post","link":"https:\/\/willkolb.com\/?p=1076","title":{"rendered":"Now they talk to each other!"},"content":{"rendered":"\n<figure class=\"wp-block-video\"><video height=\"500\" style=\"aspect-ratio: 800 \/ 500;\" width=\"800\" controls src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/2025-08-26_21-04-25.mp4\"><\/video><\/figure>\n\n\n\n<p>It takes a bit to see but essentially what happened there was:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A bunch of bots spawned and started guarding their assigned assemblers<\/li>\n\n\n\n<li>I shot at one of the bots which alerted the other bots to where I was located<\/li>\n\n\n\n<li>As bots were assembled they went to my last known location and looked around<\/li>\n\n\n\n<li>When I shot at them again my last known position was updated and other bots started searching where I fired.<\/li>\n<\/ul>\n\n\n\n<p>This works by a hierarchy of multicast delegates (<a href=\"https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/multicast-delegates-in-unreal-engine\">https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/multicast-delegates-in-unreal-engine<\/a>) that passes the players known location from bot -> assembler -> game mode  then then game mode alerts all of the assemblers and then alerts each bot.<\/p>\n\n\n\n<p>In other news I did a bunch of backend work that isn&#8217;t pretty to look at: essentially I swapped out all of the old classes and re parented them to a generic &#8220;BlackLaceGameMode&#8221;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"657\" src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-9-1024x657.png\" alt=\"\" class=\"wp-image-1078\" srcset=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-9-1024x657.png 1024w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-9-300x192.png 300w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-9-768x493.png 768w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-9-468x300.png 468w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-9.png 1297w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>This lets me make generic functions and I can pass some of the capability from the survival game mode into this new game mode (which I&#8217;m calling control). <\/p>\n\n\n\n<p>Also performance seems to take a hit after around 20-30 bots in the world at once:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"500\" style=\"aspect-ratio: 800 \/ 500;\" width=\"800\" controls src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/2025-08-26_21-17-26.mp4\"><\/video><\/figure>\n\n\n\n<p>This isn&#8217;t the end of the world here (I can move a bunch of stuff into c++ and memory optimize it if I need to) but I think I shouldn&#8217;t be this bad with just a bunch of skeletal meshes. I bet if I started doing some occlusion culling (<a href=\"https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/visibility-and-occlusion-culling-in-unreal-engine\">https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/visibility-and-occlusion-culling-in-unreal-engine<\/a>) I would be able to get everything up to a very high fps. But I&#8217;ll punt performance optimization till after I get a game working.  Next up is messing around with the terminal so it actually does something. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"605\" src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-10-1024x605.png\" alt=\"\" class=\"wp-image-1080\" srcset=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-10-1024x605.png 1024w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-10-300x177.png 300w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-10-768x454.png 768w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-10-500x295.png 500w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-10.png 1078w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>I think the sequence I&#8217;m thinking the player accomplishes to &#8220;hack&#8221; the system.<\/p>\n\n\n\n<p>1.) The player clicks &#8220;transfer group id&#8221;<\/p>\n\n\n\n<p>2.) There is then a password prompt that the player can guess or they can click &#8220;forgot password&#8221;<\/p>\n\n\n\n<p>3.) Then a bunch of trivia pops up that the player needs to answer<\/p>\n\n\n\n<p>4.) Then a new password is flashed across the screen<\/p>\n\n\n\n<p>5.) The player enters the new password<\/p>\n\n\n\n<p>6.) The player takes over the connected assemblers by pressing a button on the screen.<\/p>\n\n\n\n<p>After #1 I think I want the turrets I made before to pop up out of the assembler and start shooting at the player, along with a bunch of red light spinners:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"373\" src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/danger-alert.gif\" alt=\"\" class=\"wp-image-1081\"\/><\/figure>\n\n\n\n<p>Another thing I&#8217;ve been diligent about is trying to make sure I don&#8217;t do anything dumb to preclude multiplayer in this game. I think getting multiplayer shipped is another animal but getting lan or local games working shouldn&#8217;t be too bad.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"500\" style=\"aspect-ratio: 800 \/ 500;\" width=\"800\" controls src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/2025-08-26_21-33-49.mp4\"><\/video><\/figure>\n\n\n\n<p>So like nothing is straight up crashing (which is good, also might not be too possible because I&#8217;m straight up wearing water wings by using blueprints), but you can see the bots aren&#8217;t persisted, the weapon selection isn&#8217;t persisted etc. I can poke around on getting that all working but again I think it will take away from the base &#8220;game&#8221; part of it. Definitely if I get it on steam then I think the first thing I&#8217;d try to attack is multiplayer. I&#8217;ve done that before in another game, you essentially gotta mark stuff as &#8220;replicated&#8221; or &#8220;non replicated&#8221; and if you mess it up you&#8217;re sending or recieving way to much data, oorr you&#8217;re giving control to someone who shouldn&#8217;t have it (such as giving a client the authority over where a player is located). You can also pull in achievements\/scoreboards and server stuff but it required converting the game to full c++ then building in libraries that unreal cannot include normally (such as steamworks libs). So yeah, fun experiment but not doing that now.<\/p>\n\n\n\n<p>I also added an &#8220;ai\/ml&#8221; category for the site (it&#8217;s the lil brainy):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"278\" src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-11.png\" alt=\"\" class=\"wp-image-1084\"\/><\/figure>\n\n\n\n<p>And this still seems like scrapers or bots:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"418\" height=\"416\" src=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-12.png\" alt=\"\" class=\"wp-image-1085\" srcset=\"https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-12.png 418w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-12-300x300.png 300w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-12-150x150.png 150w, https:\/\/willkolb.com\/wp-content\/uploads\/2025\/08\/image-12-301x300.png 301w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><\/figure>\n\n\n\n<p>I&#8217;ll get around to checking at some point.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It takes a bit to see but essentially what happened there was: This works by a hierarchy of multicast delegates (https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/multicast-delegates-in-unreal-engine) that passes the players known location from bot -> assembler -> game mode then then game mode alerts all of the assemblers and then alerts each bot. In other news I did a bunch [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1078,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,9],"tags":[],"class_list":["post-1076","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gamedev","category-unreal"],"_links":{"self":[{"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/posts\/1076","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/willkolb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1076"}],"version-history":[{"count":1,"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/posts\/1076\/revisions"}],"predecessor-version":[{"id":1086,"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/posts\/1076\/revisions\/1086"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/willkolb.com\/index.php?rest_route=\/wp\/v2\/media\/1078"}],"wp:attachment":[{"href":"https:\/\/willkolb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/willkolb.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/willkolb.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}