{"id":87,"date":"2025-02-06T20:58:35","date_gmt":"2025-02-06T20:58:35","guid":{"rendered":"https:\/\/blogs.oregonstate.edu\/codedcat\/?p=87"},"modified":"2025-02-06T20:58:35","modified_gmt":"2025-02-06T20:58:35","slug":"finding-my-fire-exploring-the-tech-behind-wildfire-command","status":"publish","type":"post","link":"https:\/\/blogs.oregonstate.edu\/codedcat\/2025\/02\/06\/finding-my-fire-exploring-the-tech-behind-wildfire-command\/","title":{"rendered":"Finding My Fire: Exploring the Tech Behind Wildfire Command"},"content":{"rendered":"\n<p>When I started working on Wildfire Command (known as Sim Firefighter at the time), I had a pretty solid idea of what I wanted to focus on &#8211; procedural map generation. I love the challenge of making systems that feel organic and unpredictable, which is exactly what we needed for our wildfire simulation. What I didn&#8217;t anticipate was how deep I&#8217;d end up diving into algorithms and how much I&#8217;d come to appreciate Perlin noise, BSP partitioning, and cellular automata.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Favorite Technology: Perlin Noise<\/h2>\n\n\n\n<p>If I had to pick one piece of tech that really clicked for me during this project, it&#8217;s Perlin noise. Before this, I had used procedural generation a bit in other project, but never in a way where it directly impacted the project so significantly. The terrain in Wildfire Command isn&#8217;t just a static backdrop &#8211; it affects fire spread, suppression tactics, and overall strategy. Using Perlin noise allowed us to generate natural-looking landscapes with forests, dry grass patches, and water that actually make sense visually and mechanically.<\/p>\n\n\n\n<p>The coolest part? Perlin noise creates smooth gradients instead of harsh transitions, so terrain flows naturally instead of looking like a random mess of tiles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cellular Automata: A Great Fit for the Project<\/h2>\n\n\n\n<p>Another key tool in our map generation system is cellular automata. Unlike Perlin noise, which generates terrain smoothly, cellular automata are all about rule-based evolution &#8211; defining behaviors that change over time based on neighboring tiles. This made it a great fit for refining terrain clusters, ensuring that forests formed in realistic patches and transitions between terrain types looked natural.<\/p>\n\n\n\n<p>I have enjoyed working with cellular automata because it has given us a lot of control while still allowing for emergent patterns. By tweaking a few rules, we could dramatically change how the map evolved, which has been satisfying to experiment with.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I&#8217;d Change<\/h2>\n\n\n\n<p>If I had unlimited time, I&#8217;d love to experiment with multi-layered Perlin noise to add even more depth to the terrain. Right now, we use a single layer to define basic terrain features, but layering different noise functions could allow for more nuanced environmental details &#8211; like differentiating between dense and sparse forest regions or adding subtle elevation changes that impact fire behavior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Looking Ahead<\/h2>\n\n\n\n<p>Overall, the combination of Perlin noise, BSP partitioning, and cellular automata has been a solid foundation for our game&#8217;s map generation. It&#8217;s been awesome seeing everything come together &#8211; especially when the procedural maps start looking like real landscapes with clear wildfire risk zones.<\/p>\n\n\n\n<p>Next up, I&#8217;m excited to see how our fire spread mechanics interact with the terrain. Wildfires are unpredictable, and that&#8217;s something we really want to capture in our simulation. So far, it&#8217;s been a fun challenge, and I can&#8217;t wait to share more about how we&#8217;re balancing realism with engaging gameplay.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udc31 Cat Time \ud83d\udc31<\/h2>\n\n\n\n<p>As always, here&#8217;s a picture of one of my cats! This time, it&#8217;s Maggie, who has been supervising my work from the comfort of the couch near my desk. She&#8217;s clearly unimpressed with my debugging process, but she enjoys watching the maps generate.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"1024\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-771x1024.png\" alt=\"\" class=\"wp-image-88\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-771x1024.png 771w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-226x300.png 226w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-768x1020.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-1157x1536.png 1157w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-1542x2048.png 1542w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/8085\/files\/2025\/02\/image-1200x1594.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>When I started working on Wildfire Command (known as Sim Firefighter at the time), I had a pretty solid idea of what I wanted to focus on &#8211; procedural map generation. I love the challenge of making systems that feel organic and unpredictable, which is exactly what we needed for our wildfire simulation. What I &hellip; <a href=\"https:\/\/blogs.oregonstate.edu\/codedcat\/2025\/02\/06\/finding-my-fire-exploring-the-tech-behind-wildfire-command\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Finding My Fire: Exploring the Tech Behind Wildfire Command&#8221;<\/span><\/a><\/p>\n","protected":false},"author":14468,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-87","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/posts\/87","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/users\/14468"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/comments?post=87"}],"version-history":[{"count":1,"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/posts\/87\/revisions"}],"predecessor-version":[{"id":98,"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/posts\/87\/revisions\/98"}],"wp:attachment":[{"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/media?parent=87"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/categories?post=87"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/codedcat\/wp-json\/wp\/v2\/tags?post=87"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}