It’s amazing that I have absolutely no intention of playing Melee at the level of involvement discussed in these videos, and yet I still find them so goddamn interesting
I tried playing melee for the first time a month ago and it is so fucking hard. Gave me a new respect for all the tech and little nuances asumsaus says in his videos
Yeah, this is why it's recommended that variables get initialized in some way, otherwise they'll end up as garbage (which is the technical name for the bunch of junk that gets slapped into the variable when no initialization is done). Most likely they just forgot to initialize it at some stage and it never got noticed after that.
@@keeganapsey9238 by extension, isn't it actually RNG whether Luigi gets his charge? He makes it sound like the initial value is some sort of function of the stage+skins+characters like doing some sort of sum mod 2 but goes on to say it's junk data. so which is it? is the junk data seeded based on the stages/skins/chars?
@@sybilcuthd When the variable is created, it is assigned an address in memory. In this case, it's likely initialized around the same time as the character, stage, port, and skin data. The order these are initialized is not set, so it might go later or earlier. Basically, it reads the address of where the variable is supposed to be. This address can contain any of that data. So you end up with pseudo-random but "predictable" junk when the variable is read, which the game may interpret in different ways
@@sybilcuthd the initial value of an uninitialized variable is basically "whatever value that region of the system memory was set to by whatever used it last". Which is often essentially random from the perspective of the observer, but also kinda technically not. The following is guesswork based on my assumption that the Gamecube has heavy re-use of memory addresses. I imagine the byte of memory used for the luigi cyclone variable is the same address every time, just depending on the player port - for talking sake say it's byte number 8,000 for P1, number 8,200 for P2. The previous program state was the character and stage selection screens, and let's say the character selection for player 1 writes to bytes 7,996 to 8004 - the value set by this choice would thus impact the initial value of the variable when the match starts. It would technically be deterministic and not random, because the same sequence of port/character/stage selections would always result in the same 'uninitialized' value for the variable. The exact reason likely a lot more complex and boring than this.
Feels like port priority has become more of a psychological advantage than an actual one. Under the pressure of knowing your opponent has a slight unfair advantage it make sense to crack a little more than usual, especially when there’s something to blame it on. It’s like a handful of bad stories have lead to it being seen as a bigger advantage than it actually is.
Yeah no kidding I definitely agree especially looking at all the different circumstances of DI’ing out of a grab a frame earlier as that was really interesting
@@s3b874 I hate to say it but yeah his upload schedule is all over the place even but he’s probably pretty busy and these videos do take a long time to edit and perfect so I do understand why he goes many months without uploading although I’m sure you could look up all the jank he mentions as it is pretty well documented
There some Port Priority oddities you missed: When a Sudden Death is initiated, if both players are KOd at the same time, the lowest port wins there. (that doesn't work on any of the 1P modes because it still results a Game Over in Regular Match or Failure in Event Match or Multi-man Melee). And when two characters attempt to pick the same item at the same time, the lowest port will grab it first. If two (or more) airborne characters attempt to land in the exact same place on the ground, the lowest port always get pushed to the left.
No wonder Luigi isn't used by high-level players. To use him to his maximum potential, you need to memorize every combination of skin, character, and stage.
These are the kind of things that make me honestly believe we should create a community patch for melee. Just the one, fixing the most glaring issues in the game (luigi cyclone always charged, g&w shield, roy’s dash attack, bowser’s jumpsquat, the kirby suicide throws) and maybe even fixes that were introduced in later smash games (like falcon side-b snap to ledge, or luigi’s dash attack having that final hitbox). I honestly see no downside to standardizing these changes, maybe even throw in a few more viable stages!
@@constantinethe2hpencil409 Junebug is more involved in the competitive scene than Asumsaus and has experienced the subject of the video countless times. His opinion of the video is clearly something substantial.
I'm surprised, I never actually knew that about the Luigi cyclone. That's crazy. It's honestly impressive to me that reading the cyclone charge doesn't cause more issues somehow since it's not reading an intended variable but random garbage data.
Some programming languages have weak typing, like C for example, so you can set boolean flag variable to basically anything and any value that isn't 0 will just be interpreted as "true" by the code.
@@seronymus I can't be certain, but it looks like that's the case. Older games usually were written in assembly or, later, some languages like C, because optimization was crucial, both for space and performance. Today the requirements are not as strict and other languages are more used than before, but in the end, data is still data and this could still happen. Trying to keep this non-programmer-friendly, my guess is that it uses one bit (the most basic "1 or 0" unit) as a flag to determine the charge. As they forgot to set the variable, it used the garbage data of whatever was there before, but whatever that is, the only part it will look at is either a 1 or a 0, so that shouldn’t cause unexpected behaviors beyond the initial charge state. What _could_ cause issues is changing its value during the match. Because, if external factors can change its value, we should also assume that the same memory address of the flag is being used elsewhere in the code. However, I think that part may be intentional behavior, maybe that data is only important before the match starts and can be freely changed during it. As I said before, older games relied a lot on optimization, so using the same address for different things at different times may be a minor optimization to not go over the RAM limit.
@@木原篤郎-b4m That's extremely interesting, thank you. How funny is that paradigm shift from creative optimization to now, where AAA games take up WAY WAY too much space than they need for several reasons. Every byte certainly not being put to use haha. I also want to learn C
@@goofygoober7183 Way out of pocket for that one. Imagine walking up to someone (in private) and _actually_ saying this to their face. Yeah, gtfo, nobody thinks you're funny. And stop liking your own comments before you grow so lonely you start feeling the need to reply to your own comments, too.
As a programmer, I get the sense that port priority is more of an artifact of how machines work. For example, the CPU probably updates the state of each character one at a time and might not finish before rendering the next frame.
I was thinking this too. I doubt they sat around and said "hmm we will make grab ties win based on port", it was just how it worked by default. They would have had to spend extra time to resolve it in a fair way, and that was time that they didn't have.
@@Izandaia They do AND they fixed them in PAL version. The US just collectively ignore that cause PAL fixes the broken shit they called "meta" like Marth waveshine not possible due to nerf on his weight
@@asianjackass237 pal has plenty of it's own issues which is the reason it's not used competitively. if it was truly less broken enough to warrant using it, then we would
Port priority is almost certainly never designed with intent, as the start of the video suggests. It's a consequence in the order of operations of game states, so it usually manifests as a side-effect
day 1 of development: "we have to make them do *something* when they attack at the same time. lets just make half the situations have player 1 win, half the situations make player 2 win, and then we'll figure out actual solutions when we have time later." *they did not have time later.
@@Anon.G well, yes, exactly. instructions have to be read in a certain order one at a time. thats why they chose higher ports to win some times, and lower ports to win other times. they *have* to pick one player at minimum, so they chose to make port priority go half and half both ways in hopes that it would balance itself out. the vast majority of multiplayer games have port priority in some form of another, for all the same reasons. but in fighting games its a lot more pronounced, as you can often hit on the same frame. they can create a way to detect inputs at the same time, and come up with a proper outcome later down the line. port priority is simple a placeholder solution until then; because it is impossible for them to normally hit each other at the same time. and of course every developer hopes to squash every bug, polish every feature, and replace any placeholders; but when the deadline closes in you have to drop those ambitions.
There's another thing you didn't menction: higher ports spawns in the air while port 1 spawns grounded. That means you can't waveland or double jump at the begining of a match with port 1, but you can do it with certain characters in the other ports. Nice video!
@@k-leb4671 most likely not a decision but an oversight. Possibly not even that. Might be something that naturally occurred due to the design process and computers back then and they didn't have the time (or they just didn't notice) to come up with a workaround. Saw a guy further up the comments talking about CPUs who's probably more educated on the matter then me lol
@@k-leb4671 is what happens when a game is rushed and there isn’t enough time to properly debug it Also keep in mind this code was written over 20 years ago lmao
Yeah that's kinda the point that Plup is making. Sheik can literally like nair out of marth's upthrow significantly more "easily" at low percent. That doesn't make Zain not amazing. IIRC vanilla dashback for instance is 1 frame to hit and UCF buffs it to 2, literally 1 frame different with way more consistency.
Luigi's cyclone variable is straight up unassigned? That's crazy. Earliest mistake new coders are warned about, can't imagine what kind of mess the development crunch was and the suffering involved for the developers.
It's pretty believable, it's not something testers would catch unless they were really paying attention. And we've got tools to check for memory errors nowdays, while early Gamecube games were coded during the horror that was 90s era C and C++.
I think someone developing a machine learning bot for Melee gave a talk about making the Dolphin interface and they mentioned (among other things) that some boolean values in Melee are stored as floats. I don't wanna know what kind of crunch leads to that
@@shukterhousejive Best guess is rapid changes to the intended use of the variable. With a crunch, those variables are less likely to be refactored or cleaned up.
@@DigiEggz As someone in the early stages of learning to code, I've definitely experienced exactly that. Sometimes you think it's best handled by a number assignment only to realize later you just need a true/false, and it's definitely quicker to just leave it as it is than try to make it "proper"
i want to believe that there is a luigi player who has memorised *every* match-up possible to always land himself a charged cyclone no matter the scenario
@@velvetbutterfly I now wish to believe there is a player who has memorized every matchup possible to *deny* a Luigi player his charge. Probably a younger brother.
Luigi doing the "Luigi ladder" into grabbing the back of the T in the word "Weirdest" shown on screen is fucking insane, I love how above and beyond the editing goes for these videos
The "cyclonecharged" thing specifically is uninitialized and would be referred to as undefined behavior in the context of C (and I believe C++ as well, but that has a different standard). It's uninitialized meaning the value was not set to zero. This is literally a single character difference: malloc (allocate only), and calloc (allocate, set zero). These are heap state management functions, so if the data is uninitialized, it is set to whatever the current value is after the memory was freed. Using uninitialized variables is not a good source of randomness assuming that was the intended design decision; however, a more reasonable explanation is that the programmer forgot to initialize the variable which is easy to do if the GameCube standard library doesn't have calloc, in which case you have to write "variable = 0;" at some point before it's use, and if it's an array of memory, you have to now iterate over all of that memory and set that to zero manually as well. It could also be due to a compiler bug.
@@seronymus When assets are unloaded from memory, the system only "unallocates" that data. It still exists, but it's considered free memory because no one is actively using it now. When Luigi is allocated memory, he's given a portion of this free memory filled with junk data. Because his variables are defined but are not initialized (not given an initial state) the junk data is left alone. Therefore, Luigi's charged state is actually determined by whatever variable/data existed in that block of memory before it was allocated to him. Stages, characters, costumes, and controller order all affect when and how data is loaded into memory, as well as which blocks are allocated to Luigi's charged state.
It should also be noted that memory allocation is a very low-level function, and while some early consoes (e.g. the GameBoy Colour and the SNES, as well as all older consoles) required programmers to manually allocate memory for variables, most consoles handle it automatically using code included in the operating system. Also note that because memory allocation is an OS-level function, the junk data can originate from outside the game on consoles that are allowed to run code unrelated to the game you are playing (for example, to display the Home menu or to download updates automatically). As a final note, the previous point doesn't apply to anything from a console that doesn't have such features being run via emulation (including VC and NSO retro games), because the emulator makes a single bulk memory reservation for enough memory to run itself, and then simulates the console it is emulating within that allocation, including having that console's simulated OS allocate memory to the game being emulated.
@@alexstewart9592 Dude... all consoles did not adopt Java as the primary programming language... I guarantee you... garbage collection is extremely undesirable...
Luigi cyclone also looks at what stage you were hovering over when you started. If you picked battlefield, it may be charged, but if you *randomed* to battlefield, it may not be, with every other circumstance being exactly the same.
That Luigi one hurt my soul. Declaring a variable without even a temporary ANYTHING assigned to it is just asking for trouble. They're lucky it didn't crash the game, though if it did, then they might have noticed it.
I was think about that too, as a programmer. They're lucky as hell that it not only didn't crash, but also worked without issue. It should have crashed or returned an error as soon as Luigi loaded in or tried to use the move. I don't know how this got passed them in testing or at all.
@@seronymus It depends. If Melee was written in C#, the unassigned variable would be assigned as false, 0, basically uncharged. Only to be assigned as true if explicit so. If was written in C++, the variable would be assigned with the value as the last assign, so if Luigi's last move from the game before set it as charged, the variable would be assigned as true for the next game and vice-versa. Not sure if this is applicable when the console turns off tho. Not only this, the code might be doing something else with this variable that we dont know. It's impossible to debug it without checking the code. edit: This is if Melee was wrriten in these language. Each code language has its fail-safe and each one behaves differently in this unassigned case.
@@seronymus most boolean types either read the first digit to see if it is true or false, or more likely they return true if any of the digits are 1. if that is the case though, then a very small fraction of the time would luigi start uncharged
I think that theres also a mental factor to this, since plup knows that the combo is true because of port priority, he's probably trying slightly less to avoid it because he knows he'll get hit by it either way
As with most obscure jank, it's so rare for it to matter that mental ends up being the only real contributor. Sure, theoretically port priority matters, but it actually doesn't because mental accounts for 99.9% of everything else.
@@mofire5674 untrue, it's an issue of opportunity cost. There is no downside to attempt it because you get a very real tangible benefit roughly one in 20 times. The mental aspect is part of it, but even ignoring that, it means in some matchups you have the equivalent of your throws having a Luigi misfire tacked onto it, with no additional cost to do what you already want to do in the matchup. In the cases where the opponent gets a frame perfect escape is actually irrelevant because there is no negative outcome for the attempt when you have priority thanks to the port. That's why it's free, you already are attempting the same thing otherwise, but 1 in 20 times the game gives you a huge benefit for it, and that's just using his own numbers.
Port priority is a huge personal gripe of mine on melee, so thanks for the extensive coverage! Little less significant but ledge grabs, and team combos are also affected by port priority, it can also come up for landing on Randall at the same time. Crazy stuff, great job on the video!
Having them do rock paper scissors right before the game gives a pretty big psychological advantage in that regard, would almost be better not to know.
y'know, it's subtle, but the players spawning in at different times isn't stupid in and of itself; that's exactly how it works in other smash games, after all, albeit far more noticeable thanks to those games calling attention to it with the greater delay between players, camera zooms, and unique intro animations what really makes it stupid is that players become actionable at _different times and apparently before the timer counts down why_
16 minutes of actually dense video, contentwise, based on a really specific aspect of the game and discussing all the possible implications of said aspect. I love this channel
For the example on Plup to be more accurate, I don’t think you can argue that port priority only mattered 4 times and that Plup probably could not have acted in time anyway. If both are true, you should also consider cases where he had 1 actionable frame but got combo’d anyway. In those cases he might have escaped if he had 2 frames instead
This is a good point, and the same occurred to me. A lot of "fake" combos are effectively "true" if the defender exits hitstun but has no defensive options that would be effective in time, so what matters isn't whether that extra frame of hitstun keeps you in hitstun until the combo connects; it's whether that frame of hitstun prevents your defensive options from coming out in time. Plus, what if the combo isn't frame perfect? What if the attacker fails to act out of the throw frame-perfectly, but gets a combo anyway because of that extra 1 frame of leniency? In a game without any sort of input buffer, this can make a huge difference!
This channel is partly why I know so much about melee and why I was excited to try it on slippi, and i finally installed it and started playing it yesterday. Has been extremely hard to put down since. Thanks Asum!
"frame-perfect" is very hard to improvise despite being possible to practice. Melee is so complicated because of the decision making in short amounts of time, and 1/60th of a second is rarely enough to decide between a ton of moves, only a few of which will even do anything
With your explanation of port priority it seems to me it's even more important than I previously thought. With zain being frame perfect actionable out of grab about half the time, then very likely hitting the opponent frame perfectly reduced by another half so say 25% or let's be liberal, 12.5%. Adding a whole new frame takes another half away, and should (on average) matter for at least 12.5% of the cases (on the low end) - and that's actually a lot. A 1-frame window becoming a 2-frame window is so strong, it's more or less made into a feature on the UCF (Universal Controller Fix) - fixing backdashing from being a 1-frame window to a 2-frame window to activate a backdash. All of a sudden, mostly everyone could do it consistently, instead of previously where it was hard to do. (That was also because of frame polling, which is another really weird issue). It's essentially twice as easy, and because of the frame polling issue, a lot of time it increases the time you have available by several hundred percent.
For the Zain-Plup analysis I think it's worth analyzing every time Zain throws, regardless of if he's frame perfect with his follow-up. Sure, that's not answering a question of "is the combo true," but it does more accurately answer the question of "did port priority influence the match," which is the more interesting question.
Same frame grab can be fixed by causing a recoil and same frame ledge grab can be fixed with ECB position comparison and denying both players the ledge if both players have identical ECB x positions. These mods exist on SmashBoards and I haven't heard a good reason why they shouldn't be implemented into the game since they are 100% neutral.
Cyclone charge being an intentional game mechanic with a dedicated variable and not some weird physics glitch is the most surprising revelation in this video
Besides the extensive research, great writing, and excellent game capture- your animations are just super lively, creative, and entertaining! They fit so perfectly alongside melee's art style that I could picture these videos as some bonus trivia mode within the game itself! It's what keeps me coming back to this channel with every new upload.
I honestly answered "cyclone charge is off because this is Melee and it loves to make characters suffer for no reason" and I simply did not know exactly *how* Melee this was.
Finally someone mentioned the spawn timing difference! Again the reward varies extremely based on the positions and matchup, but a character like Falco could start a laser and any rush down character could start running (also note that the "Go!" is on the screen at this time which can be used to hide your character)
Your editing and thumbnail game has got to be the best in the whole community, I'm always just blown away. Also, super glad to see more people learning about port oddities. I find the reaction hilarious every time I tell non-Melee players that I play rock paper scissors before every single set so that I can use port 4.
I think the fact that so many of them were that close to the line for being true combos, the one frame difference impacted it in terms of how it feels when playing & other mental factors and can't be quantified in the way shown here.
One thing to correct, luigi's cyclone charge does not get used if you do not get air and end the cyclone on the floor. So you can use cyclone as many times as you want and still keep it charged as long as you didnt try to gain height with it and end up on the stage/floor by the last frame. However not doing that will use the charge. So im pretty sure the only way to charge his cyclone is to end the cyclone somewhere on the stage whether that be the main stage or the platforms, doesn't matter. Correctly me if im wrong. There could be some other jank to it but that is generally how it functions.
when he metioned luigi's cyclone and all the factors determining charged or not, I went " WHAT " outloud. followed directly by WHAT on screen. it was perfect
The skipped frame on throws and the ledge grab priority are almost certainly caused by the exact same thing. (And ledge grab priority is certainly not intentional.) Which is that the game doesn't process all of the character's actions at the same time. Instead running all of the code for port 1 first, then port 2, then 3, and finally 4. And things that are done on an earlier port, can effect what later ports can do. Lets take two characters grabbing ledge at the same time as an example. The character on an earlier port will check if it can grab the ledge, it can, so it grabs the ledge and marks the ledge as "already being grabbed." Then when the next character also checks if it can grab the same ledge on the same frame. It cannot because the ledge has "already" been grabbed by the character on the earlier port. Even though the two characters should have grabbed the ledge on the same frame. Same thing with characters grabbing each other on the same frame. The character on a port that is processed earlier will grab the other character, before that other character gets to process that it grabbed the first character. This "port order" as one could call it, is also responsible for the skipped frame on throws. If a character on a later port throws a character on an earlier port. Then on that frame, the earlier port will *not* update its stun timer as they haven't been thrown *yet*. And it is only once the later port gets to process the throw, that the earlier port's character actually is considered "thrown" But if the roles are reversed, with the earlier port character throwing the character on the later port. Then the throw will be processed BEFORE the thrown character gets processed. And so once the thrown character does get processed, they will read that they are being thrown and will update their stun timer *on the same frame that they got thrown on.*
One thing I'd like to mention about the +1 frame port priority throws; even if that extra frame doesn't make a combo true, it requires whatever option the victim can use to be one frame faster than otherwise, which limits options Of course that doesn't matter for Fox and Falco because of funny shine move
Port Priority is an interesting one. Because its core concept is still used in games today. One of the more notable examples being Team Fortress 2 where, in gamemodes like CTF and KOTH, the time when the player joins determines who gets to capture first if both players manages to succeed in capturing the point/flag at the same time.
Cheers to another amazingly edited and visually educational video! I can only imagine how easily understood the world would be if more people had your editing style and explanation!
Your level of writing and editing has reached absotulety insane heights! It has been a pleasure to watch you improve. Congrats and thank you for the insightful entertainment 😁
Sounds like the real effect that port priority had on Plup was the mind game. If he’s still complaining about it after the match, you know he was wasting brain space on it during the match.
I heard a Paper Mario sound effect in there, a true sign taste if I've ever heard one. Seriously though, your editing is top tier and all of TH-cam should take fucking notes.
I really enjoyed this video! In particular the analysis of the effect of port priority on throws I thought was interesting. I do not understand the game at a high level well enough to make a "counter-argument", but I do have some thoughts I wanted to put out there and see what you think. This analysis argues that in order for the extra frame of hitstun to "matter" the combo needed to be made "not true" (hitstun ends before the next hit of the combo) by the extra frame. But then you also make the good point that combos don't really need to be "true" for them to work. Surely then some cases where the combo isn't made "true" by the extra frame were still affected by the extra frame of leeway? Maybe it still isn't "free" as plup said, but it seems to me that if you are going to bring up the fact that combos that aren't "true" are still prevalent at top level, you can't then toss out all the grab followups Zain got where he didn't act frame-perfectly - he still gets the extra frame even if he doesn't execute perfectly and, in fact, it almost certainly matters more when he _doesn't_ execute frame-perfectly, no? Given that I'm not the one doing the analysis/making the video, It's easy for me to say that I think, to be truly convincing, this analysis needs to go into the rest of the throws as well, not just the ones where Zain acts frame perfectly, and not just the ones where Plup would be actionable for exactly 1 frame before getting hit if he had priority... but here I am saying what it is easy for me to say lmao. Anyway, just some thoughts. Loved the things you decided to dig into in this one. And the editing was fantastic! So smooth and easy to follow.
At least a year late to the party here, but this comment slaps. The whole hour-and-a-half he spent trying to make Plup's complaints seem unfounded absolutely reeked of "I started at the conclusion I wanted, and went backwards from there". I wanted to like the video more than I did, but all that time that was spent trying to argue "one frame doesn't really matter" just felt... off, in a way that was very hard to put into words at first. I'm for sure not a top Melee player (as is the case for the overwhelming majority of folks, even the ones that purport to know what they're talking about), but even I know that a single frame can often make all of the difference in a set. Even if we were to go off of only the numbers presented here (which, as you stated, seem to be lacking in certain ways), just saying "lol Plup is really complaining about getting hit with 4 combos throughout the entire set" like ???????? My guy do you not realize how absolutely huge even a single combo can be as far as determining the outcome of a tense set? A person would easily lose count if they attempted to list all of the sets that were ultimately decided by a single combo's worth of %, or by the stage control granted resulting from a single combo, or by any number of situations in which a particular breakpoint was the difference between a Win and a Loss. It just feels like a really weird hill to die on, especially when presented with the smug, "I have the numbers on my side 🤓 " vibes that this *admittedly very well-produced* video brings to the table. Like, if you're gonna claim that the data supports an argument, I can't help but feel like you need to include ALL of the data, and not just the bits of it that, when framed in a certain way, tell the story you want them to.
8:25 I think it's worth noting the power of the mind in this whole section. If you *believe* port priority is unjustly impacting play, then you may start "seeing" it on all instances even when it isn't. As an example, imagine if I'm a ref and tell you before a snooker match that "someone spilled beer on this corner last week and it's slowing the ball down and messing shots up", and then you have *just one* bad shot in that corner, you may believe the fabric in that corner is bad. Even though it wasn't true. How do you respond? You try to avoid letting balls go to that corner. Now you're diverting attention from the game and your opponent into a meta problem. Confirmation bias is a bitch. If you believe port priority is a real big problem and it does occasionally bite you, you'll play differently. At that point you're already compromising your own abilities, making the match up harder for yourself and likely reinforcing the importance you're giving port priority.
With that case analysis on how much of a difference port priority actually made for throws, it feels like it's actually suited as a counterbalance for simultaneous grab priority.
I'd guess the skipped frame *was* an intentional counter-balance. Though the proper fix would have been to have simultaneous throws cancel each other, you'd still have to figure out how to deal with simultaneous ledge grabs. Though even today fighting game devs can have issues with how to deal with simultaneous actions. While Street Fighter V normally has simultaneous throw attempts cancel each other, apparently for some simultaneous command grabs it instead grants priority based on whether the current frame count is even or odd.
The year was 2006. I pitted my buddy 1v1 against a lvl 9 Marth. Down to the wire, he throws a mine, sets down his controllers and says "NPCs always walk into the mines" Right on cue, Marth walks right over the mine and GAME (For 2008 Brawl, this NPC/mine exploit was sealed off)
In my CS120 university class, my professor always stressed that we have to initialize our variables, whether it be a number, a word, etc. I wasn't sure why we even needed to go through the trouble, even after doing many coding problems that directly involved me having to initialize my variables in order to solve it. I finally found my answer at 15:22. Never forget to initialize your variables, kids.
I actually like that there is a benefit to having lower port priority to make up for losing grab ties, even if both effects are largely negligible. I'm a 64 player, and it actually makes a difference in at least one important combo in the game. Also pro tip: vigorously trying to smash DI up can make you inadvertently jump out of non-true combos. This might not be a good thing in certain situations though.
I think the methodology for analyzing Plup vs Zain was wrong. You can't throw out all of the examples where Zain wasn't frame perfect on his execution. Frame perfect or not, if the minus frame resulted in him hitting his opponent where otherwise he would not have then that constitutes an advantage.
Fair point. I'd argue however that in the sense Logan was speaking of at 6:43 ("port 4 makes x combo true"), to make a true follow-up possible that isn't on a higher port you'd have to act frame perfectly to take full advantage of a lower port's extra frame of hitstun. Acting even a frame later with the lower port and you're essentially working with hitstun available to higher ports, and thus any true combo past that is true regardless of port, just with one less frame of leniency. That one frame of leniency being its own issue that I, admittedly, failed to bring up in the video, but still find mostly inconsequential considering the likelihood of any single frame being the difference in escaping a follow-up.
@@AsumSaus The problem with this is that you're using this to say that port priority wasn't as big of deal as Plup was saying. Your words and actions are not aligning. If the whole video was just framed as an analysis on when it creates a true combo when there wasn't one then just taking the examples where Zain was frame perfect makes sense, but your exact words after analyzing ONLY the combos where Zain was frame perfect are "One Frame just doesn't make a lot of difference when it comes to avoiding a follow-up." When you say that, there is no reason to disregard the combos where Zain was not frame perfect but it still got him a follow-up, because those matter just as much as the other ones in terms of a competitive match.
@@johai7241 Your analysis is wrong. He did take these into account. Just look at the comparison between ports and their animations and how you would escape from them. One frame does not make a lot of difference, but it does a little.
13:19 Ah, so this fact can actually help Puff a bit at the start of a match with platforms (even with netural spawns turned on) as the slight timing difference means you'll be higher up in the air relative to when controls can actually be inputted if your port's closer to 4-- similar to what you said on aerialing through the top platform. As a result of that, enough difference is made that it's barely possible to get off of side platforms at the start with full drift forward and you can then, let's say, up air -> rest a Falco who went for approaching laser as their starting move as well. (I've actually gotten this gimmick a couple times and it'd otherwise not be possilbe if there wasn't that port quirk) Also realized when typing this that some other floaty characters could get a similar difference with them then being able to waveland off the platforms on the added air time, so it's probably not even a thing exclusive to Puff.
I think the interesting thing here is that port priority isn't a problem because of the lack of buffer. In traditional fighters, because of the buffer, "frame perfect" actions happen a lot more, which is why instead of port prio, things like simulgrabs are instead turned into a grab+grab break. However, in melee, since you have to do frame perfect inputs, this e ds up being why the port priority issues are rare, because while people buffering can easily lead to simultaneous actions, this isn't true in melee without a buffer.
It’s amazing that I have absolutely no intention of playing Melee at the level of involvement discussed in these videos, and yet I still find them so goddamn interesting
Whoa didn't know you watched AsumSaus. You both are some of my favorite channels!
I tried playing melee for the first time a month ago and it is so fucking hard. Gave me a new respect for all the tech and little nuances asumsaus says in his videos
i have never played a single game of smash in my life
@@sunny0042 😂 nice
I thought about downloading and playing melee but it pretty much gave me anxiety because of the skill ceiling lol.
I love how the more Melee is analyzed, the more apparent it becomes that it's code is held together by duct tape.
That's true of so much software. Melee just has the disadvantage of being obsessed over for two decades with no way to get updated.
@@TheRationalPi also being made in roughly a year for entirely new hardware. It definitely needs more duct tape than your average game
That it is code
Same with tf2
Duct tape is generous to be honest
That luigi cyclone fact is one of the most obscure things I've ever heard about this game. And that's saying a lot
Same, and I've heard A LOT of weird stuff about this game! lol :P
Yeah, this is why it's recommended that variables get initialized in some way, otherwise they'll end up as garbage (which is the technical name for the bunch of junk that gets slapped into the variable when no initialization is done). Most likely they just forgot to initialize it at some stage and it never got noticed after that.
@@keeganapsey9238 by extension, isn't it actually RNG whether Luigi gets his charge? He makes it sound like the initial value is some sort of function of the stage+skins+characters like doing some sort of sum mod 2 but goes on to say it's junk data. so which is it? is the junk data seeded based on the stages/skins/chars?
@@sybilcuthd When the variable is created, it is assigned an address in memory.
In this case, it's likely initialized around the same time as the character, stage, port, and skin data. The order these are initialized is not set, so it might go later or earlier.
Basically, it reads the address of where the variable is supposed to be. This address can contain any of that data. So you end up with pseudo-random but "predictable" junk when the variable is read, which the game may interpret in different ways
@@sybilcuthd the initial value of an uninitialized variable is basically "whatever value that region of the system memory was set to by whatever used it last". Which is often essentially random from the perspective of the observer, but also kinda technically not. The following is guesswork based on my assumption that the Gamecube has heavy re-use of memory addresses.
I imagine the byte of memory used for the luigi cyclone variable is the same address every time, just depending on the player port - for talking sake say it's byte number 8,000 for P1, number 8,200 for P2. The previous program state was the character and stage selection screens, and let's say the character selection for player 1 writes to bytes 7,996 to 8004 - the value set by this choice would thus impact the initial value of the variable when the match starts. It would technically be deterministic and not random, because the same sequence of port/character/stage selections would always result in the same 'uninitialized' value for the variable.
The exact reason likely a lot more complex and boring than this.
Feels like port priority has become more of a psychological advantage than an actual one. Under the pressure of knowing your opponent has a slight unfair advantage it make sense to crack a little more than usual, especially when there’s something to blame it on. It’s like a handful of bad stories have lead to it being seen as a bigger advantage than it actually is.
it’s like a manual breathing sort of scenario. once you know about it, it’s difficult for it to leave your head
If I was any good at smash I would go out of my way to give port priority in favor to my opponent just to mess with them.
It’s a smaller effect than stage but it exists
Seriously a masterclass in editing.
Didn't expect to find you here
Love the videos man
Merry Christmas btw :D
MELEE
Merry Christmas and happy new year!
Hello
True legend of the memes. Glad to see you like advanced Melee stuff!
Bro your editing just gets better and better!
Yeah, and hi btw
And your upload schedule is getting worse and worse lol
Yeah his editing is incredible
Yeah no kidding I definitely agree especially looking at all the different circumstances of DI’ing out of a grab a frame earlier as that was really interesting
@@s3b874 I hate to say it but yeah his upload schedule is all over the place even but he’s probably pretty busy and these videos do take a long time to edit and perfect so I do understand why he goes many months without uploading although I’m sure you could look up all the jank he mentions as it is pretty well documented
Every time i think he’s made the best video possible, then he somehow makes an even better one
Chill tf out lmao
You're very skilled, it's not often you see someone throat every inch
He's uploading now yay
Yup I really couldn’t agree more on that one
Shut up, Nonon Jakazure, you short short person
I have heard of port priority for years and now finally understand it. Thank you
Sup dude
Does a filling machine have port priority over a rinsing machine?
Learning that huggbees like melee is so awesome
YOOO love ur vids man also me too lmao
Holy shit I wasn't expecting you here
My man really spent 3 and a half minutes to expose Plup's Johns
Hold up I kept watching and he kept going for another 2 minutes 🤣
and it probably took him several days to analyze those throws....
It would be nice to have more moments like that
We don't allow Johns in the Smash community
Please, no Johns
There some Port Priority oddities you missed:
When a Sudden Death is initiated, if both players are KOd at the same time, the lowest port wins there. (that doesn't work on any of the 1P modes because it still results a Game Over in Regular Match or Failure in Event Match or Multi-man Melee).
And when two characters attempt to pick the same item at the same time, the lowest port will grab it first.
If two (or more) airborne characters attempt to land in the exact same place on the ground, the lowest port always get pushed to the left.
Personally, my cyclone gets charged whenever AsumSaus uploads a new video.
You might want to have that checked.
Sounds gay! Yasser quenn!!!queen!!!!
@@dougr8646ion get it
No wonder Luigi isn't used by high-level players. To use him to his maximum potential, you need to memorize every combination of skin, character, and stage.
and port.
20XX Luigi just you wait
or just make sure to charge your down b
@@CSDragon yeah but that's punishable I'd you do it porly
These are the kind of things that make me honestly believe we should create a community patch for melee. Just the one, fixing the most glaring issues in the game (luigi cyclone always charged, g&w shield, roy’s dash attack, bowser’s jumpsquat, the kirby suicide throws) and maybe even fixes that were introduced in later smash games (like falcon side-b snap to ledge, or luigi’s dash attack having that final hitbox). I honestly see no downside to standardizing these changes, maybe even throw in a few more viable stages!
you can consistently make the most technical topics entertaining without dumbing it down at all
well played sir, amazing vid per usual
omg it’s the legendary smash world tour commentator WolfeyVGC!! Big fan!!
Bootlicker.
@@constantinethe2hpencil409 Junebug is more involved in the competitive scene than Asumsaus and has experienced the subject of the video countless times. His opinion of the video is clearly something substantial.
What if Luigi Cyclone wasn't actually nerfed in Ultimate and we just haven't found the right combination for it to fly yet?
i've found that if training mode is set to slowest speed you can get a very tiny amount of vertical gain from mashing the fuck out of it
@@Qobp a lead
Several gamecube controllers will be sacrificed for this forbidden knowledge
if there was, CPUs would do it
@@UmbraVivens94 What if the CPU was programmed to not know how to? Doc in Smash 4 didn't know how to use DocTornado.
I'm surprised, I never actually knew that about the Luigi cyclone. That's crazy. It's honestly impressive to me that reading the cyclone charge doesn't cause more issues somehow since it's not reading an intended variable but random garbage data.
I think missfire works similarly but I don't remember exactly what garbage data it's reading or what the context for it is.
Some programming languages have weak typing, like C for example, so you can set boolean flag variable to basically anything and any value that isn't 0 will just be interpreted as "true" by the code.
@@godlyBlade do you think that's what happened here?
@@seronymus I can't be certain, but it looks like that's the case. Older games usually were written in assembly or, later, some languages like C, because optimization was crucial, both for space and performance. Today the requirements are not as strict and other languages are more used than before, but in the end, data is still data and this could still happen.
Trying to keep this non-programmer-friendly, my guess is that it uses one bit (the most basic "1 or 0" unit) as a flag to determine the charge. As they forgot to set the variable, it used the garbage data of whatever was there before, but whatever that is, the only part it will look at is either a 1 or a 0, so that shouldn’t cause unexpected behaviors beyond the initial charge state.
What _could_ cause issues is changing its value during the match. Because, if external factors can change its value, we should also assume that the same memory address of the flag is being used elsewhere in the code. However, I think that part may be intentional behavior, maybe that data is only important before the match starts and can be freely changed during it. As I said before, older games relied a lot on optimization, so using the same address for different things at different times may be a minor optimization to not go over the RAM limit.
@@木原篤郎-b4m That's extremely interesting, thank you. How funny is that paradigm shift from creative optimization to now, where AAA games take up WAY WAY too much space than they need for several reasons. Every byte certainly not being put to use haha. I also want to learn C
Bruh the Luigi cyclone charge broke me more than anything else in this
Oh fuck a furry fucking run
@@goofygoober7183 ikr, horrifying
@@goofygoober7183 Way out of pocket for that one. Imagine walking up to someone (in private) and _actually_ saying this to their face. Yeah, gtfo, nobody thinks you're funny. And stop liking your own comments before you grow so lonely you start feeling the need to reply to your own comments, too.
@@oofles5514 malding
@@oofles5514 cry harder
As a programmer, I get the sense that port priority is more of an artifact of how machines work. For example, the CPU probably updates the state of each character one at a time and might not finish before rendering the next frame.
I was thinking this too. I doubt they sat around and said "hmm we will make grab ties win based on port", it was just how it worked by default. They would have had to spend extra time to resolve it in a fair way, and that was time that they didn't have.
@@somerandombub Assuming they even noticed the weird behavior.
This seems like the simplest explanation
@@Izandaia They do AND they fixed them in PAL version. The US just collectively ignore that cause PAL fixes the broken shit they called "meta" like Marth waveshine not possible due to nerf on his weight
@@asianjackass237 pal has plenty of it's own issues which is the reason it's not used competitively. if it was truly less broken enough to warrant using it, then we would
That Luigi cyclone shit is insane. Please tell me that every iteration for legal stages has been gone thru and figured out.
what you wanna bet M2K knows all of them.
yeah it isnt too bad. and honestly port usually doesnt matter and so you just remember the exceptions
Given the arbitrary nature of the numbers involved it's pretty much 50/50 on whether you can find some sort of rule or if it's just effectively random
@@papersonic9941 He probably does
@@papersonic9941 that's hardly a bet more than it is a guarantee
Port priority is almost certainly never designed with intent, as the start of the video suggests. It's a consequence in the order of operations of game states, so it usually manifests as a side-effect
day 1 of development: "we have to make them do *something* when they attack at the same time. lets just make half the situations have player 1 win, half the situations make player 2 win, and then we'll figure out actual solutions when we have time later."
*they did not have time later.
So that's why it seemed so random
Tbh I doubt they expected a game for kids to become such a sweaty competitive thing, like most of the design is good enough for casual play
@@turmspitzewerk highly likely this is not what happened. It's simply that the input from the first port is evaluated firdt
@@Anon.G well, yes, exactly. instructions have to be read in a certain order one at a time. thats why they chose higher ports to win some times, and lower ports to win other times. they *have* to pick one player at minimum, so they chose to make port priority go half and half both ways in hopes that it would balance itself out.
the vast majority of multiplayer games have port priority in some form of another, for all the same reasons. but in fighting games its a lot more pronounced, as you can often hit on the same frame.
they can create a way to detect inputs at the same time, and come up with a proper outcome later down the line. port priority is simple a placeholder solution until then; because it is impossible for them to normally hit each other at the same time. and of course every developer hopes to squash every bug, polish every feature, and replace any placeholders; but when the deadline closes in you have to drop those ambitions.
There's another thing you didn't menction: higher ports spawns in the air while port 1 spawns grounded. That means you can't waveland or double jump at the begining of a match with port 1, but you can do it with certain characters in the other ports. Nice video!
Man, these port differences give me aneurysms. Who decides on this crap?
@@k-leb4671 idk, i suppose they didn't think we would exploit this game so much that we would notice every little random shit they added
@@k-leb4671 most likely not a decision but an oversight. Possibly not even that. Might be something that naturally occurred due to the design process and computers back then and they didn't have the time (or they just didn't notice) to come up with a workaround.
Saw a guy further up the comments talking about CPUs who's probably more educated on the matter then me lol
@@k-leb4671 it's more a problem of the machine doing everything 1 at a time and not able to affect all 4 ports in 1 frame
@@k-leb4671 is what happens when a game is rushed and there isn’t enough time to properly debug it
Also keep in mind this code was written over 20 years ago lmao
8:00 wait can we talk about how Zain is apparently frame perfect out of grab basically half the time? The precision of top players is astounding.
Not to mention all of the frame perfect pivot tippers/regrabs. Top players make it look so easy.
Thank toy. That’s the most awesome take away of this video for me. Need to step my game up
Yeah that's kinda the point that Plup is making. Sheik can literally like nair out of marth's upthrow significantly more "easily" at low percent. That doesn't make Zain not amazing. IIRC vanilla dashback for instance is 1 frame to hit and UCF buffs it to 2, literally 1 frame different with way more consistency.
Luigi's cyclone variable is straight up unassigned? That's crazy. Earliest mistake new coders are warned about, can't imagine what kind of mess the development crunch was and the suffering involved for the developers.
It's pretty believable, it's not something testers would catch unless they were really paying attention. And we've got tools to check for memory errors nowdays, while early Gamecube games were coded during the horror that was 90s era C and C++.
Nah man just read a semi-random point in ram it'll be cool
I think someone developing a machine learning bot for Melee gave a talk about making the Dolphin interface and they mentioned (among other things) that some boolean values in Melee are stored as floats. I don't wanna know what kind of crunch leads to that
@@shukterhousejive Best guess is rapid changes to the intended use of the variable. With a crunch, those variables are less likely to be refactored or cleaned up.
@@DigiEggz As someone in the early stages of learning to code, I've definitely experienced exactly that. Sometimes you think it's best handled by a number assignment only to realize later you just need a true/false, and it's definitely quicker to just leave it as it is than try to make it "proper"
i want to believe that there is a luigi player who has memorised *every* match-up possible to always land himself a charged cyclone no matter the scenario
I also want to believe that there are scenarios like "ah fuck, red falco on yoshi's island, none of my skins let me start with cyclone"
@@rabidtangerine truly, the life of the luigi player is an arduous one
The issue is he can't know what stage his opponent is picking before he selects his costume.
@@velvetbutterfly I now wish to believe there is a player who has memorized every matchup possible to *deny* a Luigi player his charge.
Probably a younger brother.
@@twistedtachyon5877 well if it's to deny a Luigi his charge then he would only have to know the combinations that involve his main
Luigi doing the "Luigi ladder" into grabbing the back of the T in the word "Weirdest" shown on screen is fucking insane, I love how above and beyond the editing goes for these videos
The "cyclonecharged" thing specifically is uninitialized and would be referred to as undefined behavior in the context of C (and I believe C++ as well, but that has a different standard). It's uninitialized meaning the value was not set to zero. This is literally a single character difference: malloc (allocate only), and calloc (allocate, set zero). These are heap state management functions, so if the data is uninitialized, it is set to whatever the current value is after the memory was freed. Using uninitialized variables is not a good source of randomness assuming that was the intended design decision; however, a more reasonable explanation is that the programmer forgot to initialize the variable which is easy to do if the GameCube standard library doesn't have calloc, in which case you have to write "variable = 0;" at some point before it's use, and if it's an array of memory, you have to now iterate over all of that memory and set that to zero manually as well. It could also be due to a compiler bug.
How does the uninitialized variable get filled with junk data?
@@seronymus When assets are unloaded from memory, the system only "unallocates" that data. It still exists, but it's considered free memory because no one is actively using it now.
When Luigi is allocated memory, he's given a portion of this free memory filled with junk data. Because his variables are defined but are not initialized (not given an initial state) the junk data is left alone. Therefore, Luigi's charged state is actually determined by whatever variable/data existed in that block of memory before it was allocated to him. Stages, characters, costumes, and controller order all affect when and how data is loaded into memory, as well as which blocks are allocated to Luigi's charged state.
It should also be noted that memory allocation is a very low-level function, and while some early consoes (e.g. the GameBoy Colour and the SNES, as well as all older consoles) required programmers to manually allocate memory for variables, most consoles handle it automatically using code included in the operating system.
Also note that because memory allocation is an OS-level function, the junk data can originate from outside the game on consoles that are allowed to run code unrelated to the game you are playing (for example, to display the Home menu or to download updates automatically).
As a final note, the previous point doesn't apply to anything from a console that doesn't have such features being run via emulation (including VC and NSO retro games), because the emulator makes a single bulk memory reservation for enough memory to run itself, and then simulates the console it is emulating within that allocation, including having that console's simulated OS allocate memory to the game being emulated.
@@alexstewart9592 Dude... all consoles did not adopt Java as the primary programming language... I guarantee you... garbage collection is extremely undesirable...
Luigi cyclone also looks at what stage you were hovering over when you started. If you picked battlefield, it may be charged, but if you *randomed* to battlefield, it may not be, with every other circumstance being exactly the same.
That Luigi one hurt my soul.
Declaring a variable without even a temporary ANYTHING assigned to it is just asking for trouble. They're lucky it didn't crash the game, though if it did, then they might have noticed it.
I was think about that too, as a programmer. They're lucky as hell that it not only didn't crash, but also worked without issue. It should have crashed or returned an error as soon as Luigi loaded in or tried to use the move. I don't know how this got passed them in testing or at all.
@@GT-Rev how does the game instead interpret random data as a binary input?
@@seronymus It depends. If Melee was written in C#, the unassigned variable would be assigned as false, 0, basically uncharged. Only to be assigned as true if explicit so.
If was written in C++, the variable would be assigned with the value as the last assign, so if Luigi's last move from the game before set it as charged, the variable would be assigned as true for the next game and vice-versa. Not sure if this is applicable when the console turns off tho.
Not only this, the code might be doing something else with this variable that we dont know. It's impossible to debug it without checking the code.
edit: This is if Melee was wrriten in these language. Each code language has its fail-safe and each one behaves differently in this unassigned case.
@@nankinink thank you and bless you for the informed answer, I'm just starting to try coding in C
@@seronymus most boolean types either read the first digit to see if it is true or false, or more likely they return true if any of the digits are 1. if that is the case though, then a very small fraction of the time would luigi start uncharged
He managed to make a 15 minute video feel like a 25 minute video in the best way. It's always good when he uploads.
Just the calm "This son of a bitch skipped a frame" still lives in my head to this day
I think that theres also a mental factor to this, since plup knows that the combo is true because of port priority, he's probably trying slightly less to avoid it because he knows he'll get hit by it either way
As with most obscure jank, it's so rare for it to matter that mental ends up being the only real contributor. Sure, theoretically port priority matters, but it actually doesn't because mental accounts for 99.9% of everything else.
@@mofire5674 untrue, it's an issue of opportunity cost. There is no downside to attempt it because you get a very real tangible benefit roughly one in 20 times.
The mental aspect is part of it, but even ignoring that, it means in some matchups you have the equivalent of your throws having a Luigi misfire tacked onto it, with no additional cost to do what you already want to do in the matchup.
In the cases where the opponent gets a frame perfect escape is actually irrelevant because there is no negative outcome for the attempt when you have priority thanks to the port.
That's why it's free, you already are attempting the same thing otherwise, but 1 in 20 times the game gives you a huge benefit for it, and that's just using his own numbers.
@@mofire5674 untrue, it's an expoilt and he knows it
@@everythingpony yeah man, plugging your controller into the console is kind of a crazy exploit
Jank and quirks like this are dumb, incredibly specific, and very much melee. Love it.
Merry Christmas, AsumSaus! And thanks for the video!
merry christmas!
AsumSaus has by far the greatest thumbnails and content on youtube
lol true
I don't know about thumbnails but he has some of the very best editing on the platform.
Verified user = free likes
Port priority is a huge personal gripe of mine on melee, so thanks for the extensive coverage!
Little less significant but ledge grabs, and team combos are also affected by port priority, it can also come up for landing on Randall at the same time.
Crazy stuff, great job on the video!
Your visualizations are so wonderful. You do a great job of conveying complex/confusing things clearly.
Having them do rock paper scissors right before the game gives a pretty big psychological advantage in that regard, would almost be better not to know.
??? it would tell them in game with the “P1” and “P2”
When you think his editing can’t be better, he surpasses himself
"this SOB skipped a frame" had me rolling lmfao
y'know, it's subtle, but the players spawning in at different times isn't stupid in and of itself; that's exactly how it works in other smash games, after all, albeit far more noticeable thanks to those games calling attention to it with the greater delay between players, camera zooms, and unique intro animations
what really makes it stupid is that players become actionable at _different times and apparently before the timer counts down why_
The sheer level of jank in Melee is insane, I love how this broken mess of toothpicks and duct tape became a competitive smash hit
Schrödinger's Charge:
I don't know if Luigi's cyclone is charged or uncharged until I use his down B.
I really love the way you portrayed the frame count in this
it took me a long time to come up with a way of visualizing it i thought people would best understand, so i really appreciate this!
AsumSaus is the G.O.A.T. in video editing, and this was (again) explained in a way that even non-players would understand perfectly. well done 👏
16 minutes of actually dense video, contentwise, based on a really specific aspect of the game and discussing all the possible implications of said aspect. I love this channel
For the example on Plup to be more accurate, I don’t think you can argue that port priority only mattered 4 times and that Plup probably could not have acted in time anyway. If both are true, you should also consider cases where he had 1 actionable frame but got combo’d anyway. In those cases he might have escaped if he had 2 frames instead
Very true, good thought
Would be cool for someone to make a supplemental video
This is a good point, and the same occurred to me. A lot of "fake" combos are effectively "true" if the defender exits hitstun but has no defensive options that would be effective in time, so what matters isn't whether that extra frame of hitstun keeps you in hitstun until the combo connects; it's whether that frame of hitstun prevents your defensive options from coming out in time. Plus, what if the combo isn't frame perfect? What if the attacker fails to act out of the throw frame-perfectly, but gets a combo anyway because of that extra 1 frame of leniency? In a game without any sort of input buffer, this can make a huge difference!
@@FlameUser64 very true, you could essentially not be punished for being a frame late due to port priority
This. The analysis was flawed at best in the video.
This channel is partly why I know so much about melee and why I was excited to try it on slippi, and i finally installed it and started playing it yesterday. Has been extremely hard to put down since. Thanks Asum!
That' is a bad thing
@@GiftfromGod333It's a fun game
Never before has a game been more precise in it's actions and inputs while also being fundamentally broken and I love it
Finally, for so long, he has uploaded once more.
Its his Christmas present to us
Finally, for so long????? Please English.
Ah yes, he has uploaded again for so long.
Technically not incorrect, been uploading videos for a while.
"frame-perfect" is very hard to improvise despite being possible to practice. Melee is so complicated because of the decision making in short amounts of time, and 1/60th of a second is rarely enough to decide between a ton of moves, only a few of which will even do anything
What makes Zaine so crazy was in his throws, he was frame perfect for HALF of them.
The content king is back! Merry Christmas AsumSaus :)
the duck part for luigi's cylcone made me literally crack up this was an extremely well created video
You mean *quack* up? Haha I hate my life
With your explanation of port priority it seems to me it's even more important than I previously thought. With zain being frame perfect actionable out of grab about half the time, then very likely hitting the opponent frame perfectly reduced by another half so say 25% or let's be liberal, 12.5%. Adding a whole new frame takes another half away, and should (on average) matter for at least 12.5% of the cases (on the low end) - and that's actually a lot.
A 1-frame window becoming a 2-frame window is so strong, it's more or less made into a feature on the UCF (Universal Controller Fix) - fixing backdashing from being a 1-frame window to a 2-frame window to activate a backdash. All of a sudden, mostly everyone could do it consistently, instead of previously where it was hard to do. (That was also because of frame polling, which is another really weird issue). It's essentially twice as easy, and because of the frame polling issue, a lot of time it increases the time you have available by several hundred percent.
For the Zain-Plup analysis I think it's worth analyzing every time Zain throws, regardless of if he's frame perfect with his follow-up. Sure, that's not answering a question of "is the combo true," but it does more accurately answer the question of "did port priority influence the match," which is the more interesting question.
When the world needed him most...
He Returned.
It's a Christmas eve eve miracle :D
Same frame grab can be fixed by causing a recoil and same frame ledge grab can be fixed with ECB position comparison and denying both players the ledge if both players have identical ECB x positions. These mods exist on SmashBoards and I haven't heard a good reason why they shouldn't be implemented into the game since they are 100% neutral.
THAT'S SO SMART, the ledgegrab buff
Do you have the link for Smashboards thread with it?
@@jugohayashi2389 Wow this is my 4th reply. Why is youtube deleting it. Guess I can't link to anything :(
I was not prepared for 3:13 when I came back from doing something else lmao
Cyclone charge being an intentional game mechanic with a dedicated variable and not some weird physics glitch is the most surprising revelation in this video
2:44 these simple details really just make my day,good one asum,bird’s funny.
Incredible video. Great narrative, oration, editing, calling-out human bias, information, everything. Loved it.
This game never ceases to amaze me with how broken it is
Besides the extensive research, great writing, and excellent game capture- your animations are just super lively, creative, and entertaining! They fit so perfectly alongside melee's art style that I could picture these videos as some bonus trivia mode within the game itself! It's what keeps me coming back to this channel with every new upload.
I honestly answered "cyclone charge is off because this is Melee and it loves to make characters suffer for no reason" and I simply did not know exactly *how* Melee this was.
Finally someone mentioned the spawn timing difference! Again the reward varies extremely based on the positions and matchup, but a character like Falco could start a laser and any rush down character could start running (also note that the "Go!" is on the screen at this time which can be used to hide your character)
Your editing and thumbnail game has got to be the best in the whole community, I'm always just blown away. Also, super glad to see more people learning about port oddities. I find the reaction hilarious every time I tell non-Melee players that I play rock paper scissors before every single set so that I can use port 4.
Oh, and I had actually just memorized the Luigi cyclone charge starts vs Sheik 2 weeks ago LOL what a coincidence
I had no idea Luigi's cyclone charge was such a mess lmao
I think the fact that so many of them were that close to the line for being true combos, the one frame difference impacted it in terms of how it feels when playing & other mental factors and can't be quantified in the way shown here.
One thing to correct, luigi's cyclone charge does not get used if you do not get air and end the cyclone on the floor. So you can use cyclone as many times as you want and still keep it charged as long as you didnt try to gain height with it and end up on the stage/floor by the last frame. However not doing that will use the charge. So im pretty sure the only way to charge his cyclone is to end the cyclone somewhere on the stage whether that be the main stage or the platforms, doesn't matter. Correctly me if im wrong. There could be some other jank to it but that is generally how it functions.
when he metioned luigi's cyclone and all the factors determining charged or not, I went " WHAT " outloud.
followed directly by WHAT on screen.
it was perfect
I said "bro WHAT" only for the screen to agree.
The skipped frame on throws and the ledge grab priority are almost certainly caused by the exact same thing. (And ledge grab priority is certainly not intentional.)
Which is that the game doesn't process all of the character's actions at the same time. Instead running all of the code for port 1 first, then port 2, then 3, and finally 4. And things that are done on an earlier port, can effect what later ports can do.
Lets take two characters grabbing ledge at the same time as an example.
The character on an earlier port will check if it can grab the ledge, it can, so it grabs the ledge and marks the ledge as "already being grabbed."
Then when the next character also checks if it can grab the same ledge on the same frame. It cannot because the ledge has "already" been grabbed by the character on the earlier port. Even though the two characters should have grabbed the ledge on the same frame.
Same thing with characters grabbing each other on the same frame. The character on a port that is processed earlier will grab the other character, before that other character gets to process that it grabbed the first character.
This "port order" as one could call it, is also responsible for the skipped frame on throws.
If a character on a later port throws a character on an earlier port. Then on that frame, the earlier port will *not* update its stun timer as they haven't been thrown *yet*. And it is only once the later port gets to process the throw, that the earlier port's character actually is considered "thrown"
But if the roles are reversed, with the earlier port character throwing the character on the later port. Then the throw will be processed BEFORE the thrown character gets processed. And so once the thrown character does get processed, they will read that they are being thrown and will update their stun timer *on the same frame that they got thrown on.*
Thanks for a great explanation
Rejoice, mortals, for your one true saviour known as Melee has arrived to free you from your shackles of such things as 'sensible programming'
One thing I'd like to mention about the +1 frame port priority throws; even if that extra frame doesn't make a combo true, it requires whatever option the victim can use to be one frame faster than otherwise, which limits options
Of course that doesn't matter for Fox and Falco because of funny shine move
the animations are very well done and make it extremely easy to follow along. A+ video all around
If fighting games were dogs melee would be an old pug with several health complications and no teeth but with very loving owners
You must storyboard your video with that level of coherent editing. Props! Great vid!
Melee has the advantage of getting us AsumSaus videos
Just found this channel, gotta say I'm impressed with the editing. It's very helpful in explaining a pretty complex topic.
I feel like most murder investigations don't get this level of in-depth research and analysis, I'm honestly blown away
Luigi's cyclone charge= 🦆
Lol
I actually think it perfectly fits Luigi's character design. He's supposed to be wacky, and unpredictable.
The quality on this was amazing! You were able to make all the concepts easy to understand and visually interesting at the same time. Great work!
Port Priority is an interesting one. Because its core concept is still used in games today. One of the more notable examples being Team Fortress 2 where, in gamemodes like CTF and KOTH, the time when the player joins determines who gets to capture first if both players manages to succeed in capturing the point/flag at the same time.
"Still used in games today"
*References a 14 Year Old game
But you're absolutely right.
@@ju2tunknown Wow... It's hard to remember that TF2 was released in 2007.
Cheers to another amazingly edited and visually educational video! I can only imagine how easily understood the world would be if more people had your editing style and explanation!
Your level of writing and editing has reached absotulety insane heights! It has been a pleasure to watch you improve. Congrats and thank you for the insightful entertainment 😁
12:54 I was hoping for this set and I am not disspointed
Love how you break down these technical concepts in a fun and entertaining way. Edutainment, if you will
Sounds like the real effect that port priority had on Plup was the mind game. If he’s still complaining about it after the match, you know he was wasting brain space on it during the match.
I heard a Paper Mario sound effect in there, a true sign taste if I've ever heard one. Seriously though, your editing is top tier and all of TH-cam should take fucking notes.
I really enjoyed this video! In particular the analysis of the effect of port priority on throws I thought was interesting. I do not understand the game at a high level well enough to make a "counter-argument", but I do have some thoughts I wanted to put out there and see what you think.
This analysis argues that in order for the extra frame of hitstun to "matter" the combo needed to be made "not true" (hitstun ends before the next hit of the combo) by the extra frame. But then you also make the good point that combos don't really need to be "true" for them to work. Surely then some cases where the combo isn't made "true" by the extra frame were still affected by the extra frame of leeway? Maybe it still isn't "free" as plup said, but it seems to me that if you are going to bring up the fact that combos that aren't "true" are still prevalent at top level, you can't then toss out all the grab followups Zain got where he didn't act frame-perfectly - he still gets the extra frame even if he doesn't execute perfectly and, in fact, it almost certainly matters more when he _doesn't_ execute frame-perfectly, no?
Given that I'm not the one doing the analysis/making the video, It's easy for me to say that I think, to be truly convincing, this analysis needs to go into the rest of the throws as well, not just the ones where Zain acts frame perfectly, and not just the ones where Plup would be actionable for exactly 1 frame before getting hit if he had priority... but here I am saying what it is easy for me to say lmao.
Anyway, just some thoughts. Loved the things you decided to dig into in this one. And the editing was fantastic! So smooth and easy to follow.
At least a year late to the party here, but this comment slaps.
The whole hour-and-a-half he spent trying to make Plup's complaints seem unfounded absolutely reeked of "I started at the conclusion I wanted, and went backwards from there".
I wanted to like the video more than I did, but all that time that was spent trying to argue "one frame doesn't really matter" just felt... off, in a way that was very hard to put into words at first.
I'm for sure not a top Melee player (as is the case for the overwhelming majority of folks, even the ones that purport to know what they're talking about), but even I know that a single frame can often make all of the difference in a set.
Even if we were to go off of only the numbers presented here (which, as you stated, seem to be lacking in certain ways), just saying "lol Plup is really complaining about getting hit with 4 combos throughout the entire set" like ????????
My guy do you not realize how absolutely huge even a single combo can be as far as determining the outcome of a tense set?
A person would easily lose count if they attempted to list all of the sets that were ultimately decided by a single combo's worth of %, or by the stage control granted resulting from a single combo, or by any number of situations in which a particular breakpoint was the difference between a Win and a Loss.
It just feels like a really weird hill to die on, especially when presented with the smug, "I have the numbers on my side 🤓 " vibes that this *admittedly very well-produced* video brings to the table. Like, if you're gonna claim that the data supports an argument, I can't help but feel like you need to include ALL of the data, and not just the bits of it that, when framed in a certain way, tell the story you want them to.
10:03 Can you imagine how salty the community would be if Hbox regularly hit rests out of up throw up air attempts?
I think they would throw another crab at him
@@Party-Rocker007 They _threw a crab_ at him?
@@syweb2 one idiot did, nobody supports them obviously because it was attempted assault
@syweb2 yes lmao. Look up "hungry box gets a crab thrown at him
The return of the king!!!
Man this is gonna be great
The editing on these videos is amazing. Truly informative and entertaining.
8:25 I think it's worth noting the power of the mind in this whole section. If you *believe* port priority is unjustly impacting play, then you may start "seeing" it on all instances even when it isn't.
As an example, imagine if I'm a ref and tell you before a snooker match that "someone spilled beer on this corner last week and it's slowing the ball down and messing shots up", and then you have *just one* bad shot in that corner, you may believe the fabric in that corner is bad. Even though it wasn't true. How do you respond? You try to avoid letting balls go to that corner. Now you're diverting attention from the game and your opponent into a meta problem.
Confirmation bias is a bitch. If you believe port priority is a real big problem and it does occasionally bite you, you'll play differently. At that point you're already compromising your own abilities, making the match up harder for yourself and likely reinforcing the importance you're giving port priority.
"I'm done talking about it now."
Yeah right...
"... You know what, I'm not done talking about it."
Yusss, more tasty editing to consume with my eyes!
With that case analysis on how much of a difference port priority actually made for throws, it feels like it's actually suited as a counterbalance for simultaneous grab priority.
I'd guess the skipped frame *was* an intentional counter-balance. Though the proper fix would have been to have simultaneous throws cancel each other, you'd still have to figure out how to deal with simultaneous ledge grabs. Though even today fighting game devs can have issues with how to deal with simultaneous actions. While Street Fighter V normally has simultaneous throw attempts cancel each other, apparently for some simultaneous command grabs it instead grants priority based on whether the current frame count is even or odd.
The year was 2006. I pitted my buddy 1v1 against a lvl 9 Marth.
Down to the wire, he throws a mine, sets down his controllers and says "NPCs always walk into the mines"
Right on cue, Marth walks right over the mine and GAME
(For 2008 Brawl, this NPC/mine exploit was sealed off)
0:22 Dark Souls 2 hitboxes
In my CS120 university class, my professor always stressed that we have to initialize our variables, whether it be a number, a word, etc. I wasn't sure why we even needed to go through the trouble, even after doing many coding problems that directly involved me having to initialize my variables in order to solve it.
I finally found my answer at 15:22.
Never forget to initialize your variables, kids.
Melee is so amazing I've been playing this game for 20 years and it still doesn't get old
I actually like that there is a benefit to having lower port priority to make up for losing grab ties, even if both effects are largely negligible. I'm a 64 player, and it actually makes a difference in at least one important combo in the game.
Also pro tip: vigorously trying to smash DI up can make you inadvertently jump out of non-true combos. This might not be a good thing in certain situations though.
I think the methodology for analyzing Plup vs Zain was wrong. You can't throw out all of the examples where Zain wasn't frame perfect on his execution. Frame perfect or not, if the minus frame resulted in him hitting his opponent where otherwise he would not have then that constitutes an advantage.
Fair point. I'd argue however that in the sense Logan was speaking of at 6:43 ("port 4 makes x combo true"), to make a true follow-up possible that isn't on a higher port you'd have to act frame perfectly to take full advantage of a lower port's extra frame of hitstun. Acting even a frame later with the lower port and you're essentially working with hitstun available to higher ports, and thus any true combo past that is true regardless of port, just with one less frame of leniency. That one frame of leniency being its own issue that I, admittedly, failed to bring up in the video, but still find mostly inconsequential considering the likelihood of any single frame being the difference in escaping a follow-up.
Exactly, in fact these matter more. If Zain is frame perfect, he deserves his combo anyways. If he wasn't perfect, there's an issue
@@AsumSaus The problem with this is that you're using this to say that port priority wasn't as big of deal as Plup was saying. Your words and actions are not aligning. If the whole video was just framed as an analysis on when it creates a true combo when there wasn't one then just taking the examples where Zain was frame perfect makes sense, but your exact words after analyzing ONLY the combos where Zain was frame perfect are "One Frame just doesn't make a lot of difference when it comes to avoiding a follow-up." When you say that, there is no reason to disregard the combos where Zain was not frame perfect but it still got him a follow-up, because those matter just as much as the other ones in terms of a competitive match.
@@-Comet. melee doesnt care who "deserves" something
@@johai7241 Your analysis is wrong. He did take these into account. Just look at the comparison between ports and their animations and how you would escape from them.
One frame does not make a lot of difference, but it does a little.
13:19
Ah, so this fact can actually help Puff a bit at the start of a match with platforms (even with netural spawns turned on) as the slight timing difference means you'll be higher up in the air relative to when controls can actually be inputted if your port's closer to 4-- similar to what you said on aerialing through the top platform.
As a result of that, enough difference is made that it's barely possible to get off of side platforms at the start with full drift forward and you can then, let's say, up air -> rest a Falco who went for approaching laser as their starting move as well. (I've actually gotten this gimmick a couple times and it'd otherwise not be possilbe if there wasn't that port quirk)
Also realized when typing this that some other floaty characters could get a similar difference with them then being able to waveland off the platforms on the added air time, so it's probably not even a thing exclusive to Puff.
This editing style is absolutely bonkers.
I think the interesting thing here is that port priority isn't a problem because of the lack of buffer. In traditional fighters, because of the buffer, "frame perfect" actions happen a lot more, which is why instead of port prio, things like simulgrabs are instead turned into a grab+grab break.
However, in melee, since you have to do frame perfect inputs, this e ds up being why the port priority issues are rare, because while people buffering can easily lead to simultaneous actions, this isn't true in melee without a buffer.