{"id":354,"date":"2021-05-19T00:30:11","date_gmt":"2021-05-19T05:30:11","guid":{"rendered":"http:\/\/www.yarnot.com\/Zach\/?p=354"},"modified":"2022-07-30T15:36:37","modified_gmt":"2022-07-30T20:36:37","slug":"the-wind-waker-randomizer-dv_im","status":"publish","type":"post","link":"https:\/\/zach.yarnot.com\/index.php\/2021\/05\/19\/the-wind-waker-randomizer-dv_im\/","title":{"rendered":"The Wind Waker Randomizer dv_im"},"content":{"rendered":"\n<p style=\"text-align:center\"><a href=\"https:\/\/github.com\/DualVission\/archive-twwrando-dv_im\">Link to Github archive<br>https:\/\/github.com\/DualVission\/archive-twwrando-dv_im<br>Repository archived 2022\/7\/30<\/a><\/p>\n\n\n\n<h2>Intro<\/h2>\n\n\n\n<p>One\nevening, I found myself in a stream with many community members I knew apart\nfrom the lead moderator and the streamer himself who was playing a custom\nbranch of <em>the Wind Waker <\/em>Randomizer. With the assistance of j_im, I was\nable to translate my understanding of Python for Maya (PyMEL) to general\nscripting, as well as a better grasp of GitHub. Through this, I have learned\nmuch about cooperation, communication, and conceptualization through reading\nthe preexisting scripts, the raw base game PPC assembly, and aid from others,\nlike CrainWWR and tanjo3. This is how the project originally named v_im was\nborn.<\/p>\n\n\n\n<h2 id=\"rando\">A Brief Overview of Game Randomizers<\/h2>\n\n\n\n<p>A randomizer is a class of game modification that changes some aspect of gameplay in an unexpected manner, often checked by a system known as logic. Action and adventure titles often get something known as an item location or check randomizer, in which collectables and their locations are shuffled among each other, creating a new and often unique gameplay experience through many of the same forms of engagement as metroidvanias or roguelikes. Logic, for this kind of randomizer, is a set of rules that define what collectibles are then required to reach a specific item location. For example, in <em>The Legend of Zelda: Ocarina of Time<\/em>, players must have a Deku shield and a Kokiri blade before they can access any location within the Great Deku Tree. Using logic, the randomizer would then decide nowhere within the Great Deku Tree is a valid location for either the Deku Shield or Kokiri blade but would be for the Fairy ocarina or any other number of items.<\/p>\n\n\n\n<h2 id=\"background\">Kindling<\/h2>\n\n\n\n<p>DGod63\nis a Twitch streamer known for playing randomizers of <em>The Legend of Zelda <\/em>franchise,\nwho I found one night on which sometime in late May 2020 because of lost hours\nduring the early SARS-2 pandemic. However, he was running the randomizer from\nsource, allowing him to make additional modifications which in the past were\ndenied by the sole developer of the randomizer. The modifications to the code\nenabled him to change the required number of dungeons for race mode, a setting\nwhich made all non-required dungeons illogical, effectively empty in the eyes\nof the player, locations and made required dungeons end in a hard-required\nitem, an item needed to beat the game. At the then-current official 1.8.0,\nplayers either played without race mode or could only have 4 dungeons, not\nupwards of the 6 possible dungeons in the game or fewer.<\/p>\n\n\n\n<p>Also\naround this time, another popular randomizer was transitioning its community\nseason from 3 to 4, changing its hint policies making them less helpful. In the\nnext official update of <em>Ocarina of Time<\/em> Randomizer, hints could only be\nset to this more conservative option, forcing players to either use an older\nbuild or use this new policy. A forked build, known as the Roman Build or Roman\nBranch, rapidly gained popularity as it allowed for either hint policy without\ndisabling other newer features. The Roman Build acted, up to this point, as a\ntesting ground for features that were highly requested, but that the main\ndevelopers didn\u2019t want to provide. Often the course of action was a feature\nbeing added to the Roman Build, it would be brought to the main branch, then\nthe Roman Build would switch to the more concise version created by the main\ndevelopers.<\/p>\n\n\n\n<h2 id=\"past\">A\nSpark of Energy<\/h2>\n\n\n\n<p>I\nsought answers as to how I could also do variable race mode in <em>the Wind\nWaker<\/em> Randomizer, I had some knowledge of Python so it wouldn\u2019t be too\nterrible, right? When I messaged DGod, his answer was simple, having only\nedited one number in the code as instructed by j_im, the community moderator. I\nfollowed the trail and j_im told me much the same, edit this number on this\nfile to the desired amount. I, while now having my answer, was dissatisfied\nwith this solution, as it would not provide easy access to anyone who wouldn\u2019t\nor couldn\u2019t run from source. I began testing and playing with a piece of\nsoftware attempting to edit <em>the Wind Waker<\/em> Randomizer\u2019s UI. But I began\nto realize why LagoLunatic, its dev, omitted this option, at least up to 6\ndungeons; the higher number of required dungeons increased the number of hard\nrequired items that would be called up. In cases where players start with the\nfull Triforce of Courage and were playing swordless, that would only leave the\nthree progressive bows and the hookshot to be pulled instead. 4 items for 4\ndungeons. This list would need to be extended to encapsulate the 2 additional\nrequirements. However, in side effect of increasing the number of required\ndungeons, the number of hard required items also increased. As such, the power\nbracelets and iron boots were also added to the list, as they each only locked\nEarth and Wind Temple respectively.<\/p>\n\n\n\n<p>I was coming to finalize this rough idea of a small update to 1.8.0, but I felt lacking a name, would be forced to be associated with my name. Another concern I had was competing with Lago\u2019s main branch. It would effectively create a self-cannibalizing market between the two branches, which is not what I would want. I simply wanted to push Lago to add this feature to the randomizer. Without much thought, the name v_im was selected, a basic portmanteau of j_im\u2019s and my screennames. Between d_im and v_im, the answer was fairly obvious, and I felt it best represented the amount of work that each party had made towards this idea. Before I released this on the world, I checked to make sure I wasn\u2019t saying something terribly offensive, only to find that \u201cvim and vigor\u201d was a turn of phrase. Vim means with, of, or pertaining to energy. However, I was not prepared for what would happen.<\/p>\n\n\n\n<h2 id=\"before\">An\nOpen Flame<\/h2>\n\n\n\n<p>DGod\nwas not much larger than other streams I was watching at the time, but as the\npandemic continued, his audience grew. A small project intended to make a few\npeoples\u2019 lives easier was now on display for a large audience. A direct link at\nthe command input of \u201c!v_im\u201d. As the idea that there was more to <em>the Wind\nWaker <\/em>Randomizer, more people began airing ideas they felt was missing or\nlacking. I had not completed a small task but checked a small box on a much\nlarger list. It was known I was effectively unemployed and capable of basic\nlevel programming\/scripting. Despite what I had thought originally, it was a\ngood feeling, helping bring joy to people. A new version but not many changes\nin retrospect, it was becoming more clear v_im was becoming more the community\nand me and less j_im. It was a great name but it was lacking, at least in terms\nof representing my brand. The answer was a simple rebranding.<\/p>\n\n\n\n<p>An additional \u201cd\u201d was prefixed to the existing name, it would prevent confusion as v_im is just dv_im prior to 1.8.0d. This naming schema matched my other scripting projects, at least on an internal naming level. All my script files up to this point were named \u201cdv_\u201d followed by its function (eg DV Artistic Material Generator is dv_artistic_material_creator). With a subtle name change, also came an imagery change. The use of <em>Hyrule Warriors: Definitive Edition<\/em>\u2019s Sail of Red Lions might have been a bit vain, effectively treating dv_im as a level up to its source branch which uses the Swift Sail, which acts as the level of weapon proceeding the Sail of Red Lions. However, the sail itself I found hard to read at lower resolutions like in-game, so a question mark was used in place of its imagery.<\/p>\n\n\n\n<h2 id=\"now\">Playing\nwith Fire<\/h2>\n\n\n\n<p>Luckily, I was kept grounded by my shortcomings. I am not a programmer by trade or study, errors and oversights were not an uncommon sight. That still didn\u2019t stop the steam of desired features, one I had been longing for some time. The unedited <em>the Wind Waker<\/em> Randomizer logic is what can be called a glitchless or trickless logic set. Every expectation it had of the player was that in base game. Players would never be expected to store the item-get cutscene hitbox to sneak around an area. However, all prior attempts of glitched logic came with one tradeoff, they only would exist in place of standard logic. I needed to find a solution that would leave regular logic usable. The UI would be easy, but the backend would be difficult. I found two points where logic could best be edited before it was loaded and towards the end of loading. I decided to go for the latter, referring to it as \u201clogic injection\u201d as it would interrupt and replace some bits of data, requiring the least editing and redundant information for anyone creating a custom logic type.<\/p>\n\n\n\n<p>This\ncaught the attention of community member CrainWWR, who was a <em>the Wind Waker\nHD<\/em> speedrunner. The logic sets I had implemented all were fairly basic,\nrepresenting a scale from standard to what most randomizer players do already.\nHowever, Crain had a different idea, what is the fewest required items to get\nto any particular check. Sure, no logic existed, where there were no checks,\nbut what if there was a checking system, but it only ensured the seed was\nbeatable, but just barely. It was a bad idea due to high risks of\nbottlenecking, but my primary drive was player options. I was going to play\nthis, but someone might. Though this may have been what brought Crain onboard,\nhe is still a large part of the team and a heavy hitter for dv_im coding.<\/p>\n\n\n\n<h2 id=\"future\">Throwing\nShadows Forward<\/h2>\n\n\n\n<p>This\nproject naturally spun to be much bigger than the sum of its parts, dv_im still\nrepresents somewhat of a success story. In my eyes, it is still not finished.\nGoing forward, there are a few things Crain, Tanjo, and I have in mind:\nalternative game modes, alternative objectives, more checks, retooling, and\nplayer choice. The next project I am looking at is rebuilding entrance\nrandomization, increasing a player\u2019s ability to choose which locations are\nincluded or omitted. As is now, players can only choose to do all cave\nentrances, dungeons, both, all together, or none. While this is fine and dandy,\nthis means a player would be expected to visit Star Island even if they have\ncombat caves disabled, which is odd in comparison to most other things in the\nrandomizer.<\/p>\n\n\n\n<p>As\na long-term goal, Crain was hoping to implement \u201cpot rando\u201d, a sort of\nalternative to the current boat navigation system. This system is far from even\nusable; however, we have created a system to create stable branching graphs\nthat will be the core of this. Crain designed it first in Java, I recreated it in\nPython, and Tanjo optimized and improved it.<\/p>\n\n\n\n<h3>dv_im\nexclusive features:<\/h3>\n\n\n\n<ul><li>Starting Conditions:<ul><li>Dungeon Mode<\/li><\/ul><ul><li>Editable base health<\/li><\/ul><ul><li>Hints<\/li><\/ul><ul><li>Randomizable dungeon number<\/li><\/ul><ul><li>Randomizable starting Triforce\nnumber<\/li><\/ul><ul><li>Randomizable starting items<\/li><\/ul><ul><li>Text kerning<\/li><\/ul><\/li><li>Randomization:<ul><li>Additional boss rewards<\/li><\/ul><ul><li>Editable item pools<\/li><\/ul><ul><li>Logic Types (including custom)<\/li><\/ul><ul><li>Not Logic<\/li><\/ul><ul><li>Randomizable Wind Waker, Ballad\nof the Gales, Wind\u2019s Requiem, Song of Passing, and Swift Sail<\/li><\/ul><ul><li>Remove dungeon nonprogressive\nitems<\/li><\/ul><ul><li>Removable health increase items<\/li><\/ul><ul><li>28 Additional Checks<\/li><\/ul><\/li><li>Customization:<ul><li>Animation editing<\/li><\/ul><ul><li>Disable parts of model items<\/li><\/ul><ul><li>Editable spoiler log output<\/li><\/ul><ul><li>Sail choice<\/li><\/ul><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The Wind Waker Randomizer dv_im is a branch of the game randomizer for The Legend of Zelda: The Wind Waker. Click more to read the history of dv_im.<\/p>\n","protected":false},"author":3,"featured_media":355,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"link","meta":[],"categories":[34,27,35,24,28],"tags":[],"_links":{"self":[{"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/posts\/354"}],"collection":[{"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/comments?post=354"}],"version-history":[{"count":3,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/posts\/354\/revisions"}],"predecessor-version":[{"id":369,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/posts\/354\/revisions\/369"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/media\/355"}],"wp:attachment":[{"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/media?parent=354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/categories?post=354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zach.yarnot.com\/index.php\/wp-json\/wp\/v2\/tags?post=354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}