Posts for Bobo_the_King

1 2
11 12 13 34 35
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
First and foremost, I want everyone to know that I read everything in this thread. You all have an audience and I'm sympathetic to anyone in pain, no matter how trivial their problems may seem. GoddessMaria15: How agonizingly awful! Any one paragraph of your story would cause enough anguish to last a lifetime. It's good that you're getting help and, for what it's worth, I think you should be proud to have come this far. I wish I had more to say, but please contact me if you'd ever like to talk about it. boct1584: I imagine that wrestling with medication must be extremely frustrating because you are faced with a daily choice. Many depressed people can alleviate symptoms with medication, but simply face a long, uphill struggle. In your case, you have to choose what kind of difficulties you can or are willing to face on any given day. It must be difficult to know that an emotional outburst could have been prevented by taking a couple of pills or, conversely, that your inability to concentrate could have been alleviated by skipping a dose. Samsara: I second Aqfaq's recommendation that you investigate narcissistic personality disorder, if you haven't done so already. I suppose you probably already know about it if you're studying psychology. It's good that you can recognize your ex's mistreatment of you. Use that as a foothold. If you have a partner in your life now, they can be a guiding force, reminding you that you're being irrational as a result of the abuse you faced. My girlfriend faced years of abuse from her narcissistic mother and grandmother and I sometimes try to point out that she's being needlessly distrustful (or sometimes too trusting) because she's convinced that that kind of treatment is normal. Don't be ashamed of wanting to be a therapist! You are one of the most compassionate members of this forum and your comments regarding psychology are always thoughtful and nuanced. Warp: I take your chronic loneliness very seriously and I trust that you felt compelled to speak up about it because it means so much to you. I hope you can meet up with the other Scandinavian users here, but in case you can't, I suggest you take up a hobby, preferably one that requires or leaves room for a lot of social interaction. My first suggestion would be a book club. My second recommendation might sound a little unusual, but perhaps a knitting club might be relaxing and fun and allow a lot of free time for talking. In any case, find something that's right for you. I know there are good websites out there for finding people who share interests. ars4326: I've never had any interest in the Army since its culture is almost exactly opposite what I crave. Having said that, I had the opportunity to teach many veterans and work with them through the problems they face. Your post is a reminder that one doesn't have to see combat to be psychologically tormented by their time in the military. The one thing I'd like to emphasize is that you did nothing wrong. The Army is not worse off for you having been a part of it temporarily, despite the condemnation you've faced. I hope you're now in a better environment where you can shed your past and find unconditional acceptance for who you are, not the person the military wants you to be. I have a few skeletons in my closet and I'm in an ongoing fight both internally and externally (where appropriate). They're not nearly as bad as most of the problems people in this thread face and besides, I'm not really comfortable sharing them here. Ultimately, I'm a pretty happy and well-adjusted person and I try not to take that for granted. I sometimes feel sad, angry, or depressed, but at the end of the day, I know that life is pretty good on the whole, even if I have to cope with problems that are part of my life for no reason. If anyone ever needs someone to lean on, please feel free to PM me and I'll see if I can help. If not, I'll at least try to point you in the right direction.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
I took a break from TASVideos for a couple months because I've moved halfway across the country, so I'm late to receive this news. Ugh, how heartbreaking. Rachel was an expert TASer and programmer and a pillar to our community. Her openness about her transgenderism was refreshing and has helped me consider my own gender identity. I know the suicide rate among transgendered people is shockingly high, but I never would have guessed she felt so hopelessly depressed. Rest in peace, Rachel. I'm so sorry that life never treated you the way you deserved. Edit: And hang in there, MUGG! I haven't read the rest of the thread and I didn't mean to overlook your comment. I don't know what you're going through, but just know that I'm here for you along with the rest of TASVideos.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
My hope was that the joke was that the board was rotated. The white (blue) pawns on the left and right hand sides of the board quash that theory, though. If you can find a chess game that allows you to rotate the board 90 degrees (or I suppose 180 degrees, though that's less fun), that might be a good April Fools joke for next year.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
adelikat wrote:
Why was the J version used? Does the glitch only work on this version?
From the submission text:
The Japanese version has a larger character set than the English version even though it only supports the phonetic Hiragana alphabet and a few other characters. Turns out that some of the character codes not available in English are needed to execute some of the more interesting glitches.
They're injecting arbitrary code via the player names. The Japanese (hiragana) character set includes a character ("ko", I believe) that corresponds to hexadecimal $4C, the invaluable JMP command in the 6502 processor. I played around with the US version but the only characters that affect the program counter correspond to BCC and BCS (branch on carry clear and branch on carry set), which can only send the program counter somewhere in the VRAM, if I remember correctly. Believe me, I'd like to see the American version of the game broken, but it's not going to happen any time soon barring a major breakthrough. I may toy with it some more at a later date.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Warp wrote:
And of course there are myriads of other ways you could describe the size of a googol (such as describing the diameter of a sphere of water made up of that many molecules, for instance.)
Such a sphere would rival the size of the visible universe, which the layperson has a very poor grasp of. Even the best physicists and cosmologists don't have a very good intuitive understanding for how large the universe is. And you still haven't defined "conceivable" or "inconceivable".
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
I'm going to try just one last time, Warp. What is your definition of "conceivable" and/or "inconceivable"? What makes one number conceivable and another number inconceivable? Edit: Also...
thelegendarymudkip wrote:
The first logarithm of googol is 100. I'd say the average person can comprehend 100 quite well. It's also perfectly easy to say how much water it is to weigh googol kilograms. Quite simply, it's a 100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x 100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100x100 meter 50-hypercube full of water.
Professor Frink (explaining that Homer Simpson has fallen into the third dimension): "Well it should be obvious to even the most dim-witted individual, who holds an advanced degree in hyperbolic topology..."
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Warp wrote:
No, a million is easy to conceive because you can say, for example, "10x10x10 meters of water weights a million kilograms". The thing is, even if you consider those verbal descriptions of googolplex highly abstract, my point is that there just is no such description for Graham's number. You can't just say, for example, "writing down Graham's number would take 1010000000000 books", because that would be way too little.
Graham's number is irrelevant to the conversation at this point. We both agree that the number itself is inconceivable, the number of digits in it is inconceivable, the number of digits in the number of digits is inconceivable, and the number of times I would need to continue with this string of "inconceivables" is inconceivable. There is no argument. You still haven't said anything about how to conceive of a googolplex itself, only descriptions of how one might write down the number. It's big. It defies all comprehension and even a googol is too big to truly understand in any meaningful sense. We cannot play some trick to relate it to our day to day lives, like saying, "It's such-and-such amount of water." You need to take the logarithm of it twice before the average person can comprehend it on some level.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Warp wrote:
Wikipedia itself gives examples of how you can describe the magnitude of googolplex: "Written out in ordinary decimal notation, it is 1 followed by 10100 zeroes." "A typical book can be printed with 106 zeros (around 400 pages with 50 lines per page and 50 zeros per line). Therefore it requires 1094 such books to print all zeros of googolplex." "if a person can write two digits per second, then writing a googolplex would take around about 1.51×1092 years, which is about 1.1×1082 times the accepted age of the universe." Graham's number, however, has no such easily understood description because of its sheer magnitude.
You're talking about the conceivability of writing down a googolplex, not the conceivability of the number itself. It's the difference between saying a million is easy to conceive because it has just six zeros versus actually imagining a million objects. Also, if you can imagine 1094 books, I'm impressed...
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Scepheo wrote:
Bobo the King wrote:
But Graham's number is the upper bound on a solution to a problem that-- with a little bit of effort-- the layperson can easily understand. I don't really know how you can decide that a googolplex is conceivable just because the operation used is more familiar to people but at the same time discard Graham's number.
While true (although the upper bound has been drastically improved to 2↑↑↑6 last year), I don't think this says anything about its conceivability. After all, any number greater than or equal to the solution of a problem is an upper bound for it. So while the number that's the solution to this problem (does it have a name?) might be conceivable, it doesn't necessarily have a logical or intuitive relation to Graham's number.
Yeah, but I was trying to make a point about how we're defining conceivability. It seems in this context we're saying that a conceivable number is one that is "manageably small", not necessarily one that is easy to write down in some form. By the latter definition, a googolplex might be regarded as conceivable because it can be easily written down and also approximates the solution to a problem in statistical mechanics. My point is that a googolplex, regardless of how succinctly it can be defined, is still unfathomably unfathomably huge.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
What happens if you use a cannon?
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Warp wrote:
Bobo the King wrote:
The magnitude of googolplex can be more easily understood because it uses familiar notions, namely exponentiation, and only two levels of it. I'm sure one can come up with a visualization of the magnitude that can give even a vague idea of its size. It's not inconceivable. Graham's number, however, uses too many levels of exponentiation to be describable by comparing it to anything. It just escalates way too quickly and defies all comparison. It defies all description.
But Graham's number is the upper bound on a solution to a problem that-- with a little bit of effort-- the layperson can easily understand. I don't really know how you can decide that a googolplex is conceivable just because the operation used is more familiar to people but at the same time discard Graham's number. You yourself said you're talking about magnitudes and said exact representations are not the point. By your own criteria, Graham's number is the most inconceivable, a googolplex is more conceivable but still inconceivable, and pi is most conceivable.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Vulajin wrote:
I registered on this forum to let you all know that I think the community for which I just signed up is dying. In fact, TASing as a whole is dying, as evidenced by the fact that I just started TASing a game recently. Doom and gloom.
Sorry to have you, Vulajin.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Warp wrote:
(This is not really a math question, but given that it's about math, I thought it would be appropriate here.) The memetic phrase "you keep using that word; I do not think it means what you think it means" is a quote from the movie The Princess Bride. The word in question being referred to is "inconceivable". The character (who is using it "incorrectly") is using it to mean "incredible" or "hard to believe". Yet, as the other character says, there may be a subtle difference. "Inconceivable" means "difficult or impossible to be conceived" (rather than difficult or impossible to believe.) But what could be a concrete example of something that's inconceivable? The human mind perceives the "size" of numbers mostly by comparing them to real things, or multiples of the size of real things. We compare very large numbers to things like "the number of atoms on Earth" (or even "the number of atoms in the universe"), or things like "the size of our galaxy/universe". Even if we don't really have a good grasp of how large that amount is, it nevertheless anchors it to something real that we can compare to. Although the exact size may be more intangible to our brains, it nevertheless allows us to compare bug numbers between themselves. For example if something is "as big as Earth" and something else is "as big as the solar system", we get a concept of which one is significantly larger than the other. We often also use multiples of these real things to get a picture of the quantity, by saying things like "a trillion times the number of atoms in the universe", or "a trillion times the mass of the Sun". Again, while the actual quantity remains pretty abstract, it nevertheless gives us a comparison point, so we can compare the large numbers between themselves, and know which one is clearly larger than the other. Something that's "a trillion times the size of our galaxy" is much larger than something that's "the size of our solar system". Graham's Number, however, defies all visualizations and comparisons to real things, even if using multipliers. There exists no way to adequately compare it to anything. You can't say something like "Graham's number is as big as a trillion trillion trillion times the number of subatomic particles in our universe", because that would still be way, way too small of a number. Graham's number is so immensely large, that there is no simple sentence, comparing it to the size of anything real, that can be used to describe its size. It is basically impossible for our brains to have even a vague concept of how large it is. In other words, the size of Graham's number is truly inconceivable.
First, as a simple example, the vast majority of numbers are literally inconceivable because they are not computable or definable. Put one way, we might attempt to list all possible programs a computer might run (say, through assembly language) and make a list of every possible output. We can do this because the list of all algorithms is at most countably infinite (which requires infinite disk space) but the cardinality of the continuum is strictly higher than that. Therefore, the number line is densely populated by what I like to think of as "phantom numbers"-- numbers that have never been considered, never will be considered, and are outright impossible to be considered. I think it's fascinating that the list of numbers everyone (or every machine) has ever written down or imagined is surprisingly small-ish (maybe in the trillions) while all those numbers are buoyed by a ghostly aether of numbers that lie beyond our imagination. Second, I mostly agree with you on Graham's number. However, it can be defined rather succinctly. If you accept some notion of chained arrow notation, then it's not all that hard to "conceive" of a number greater than Graham's number. Still, I've toyed with the idea of "conceivability". Somewhere in our psychology is an approximate quantity that is the largest we can wrap our brains around. Perhaps it's about a thousand and if I showed you a thousand beads, you would look at them and say, "that's about a thousand", demonstrating that you have a notion of what you're looking at. (Of course, the largest conceivable number may be much smaller or much greater depending on what you mean by "wrapping your brain around it".) A number greater than this amount is inconceivable, but most simple examples don't really stand out from one another. For example, is 10^23 (roughly Avogadro's number) less conceivable than 10^200 (roughly the number of Planck volumes in the universe)? I'd argue that they equally defy human imagination, despite the fact that they are 177 orders of magnitude apart! But there are numbers that stretch beyond inconceivability. For a simple and familiar example, consider a googolplex, which is 10^10^100. We can't even physically write down the number! I'd say that a googolplex is "inconceivably inconceivable". All of this is a very roundabout way of saying that the inconceivableness of a number is the number of times you must successively take its logarithm before it becomes conceivable. A number like 2^3^5^7^11 is basically an inconceivably inconceivably inconceivably inconceivable number. Furthermore, Graham's number is not just inconceivable, its inconceivableness is inconceivable and the inconceivableness of its inconceivability is likewise inconceivable. Trying to put together a sensible string of "inconceivables" to describe Graham's number (or its inconceivability...) is extremely difficult and maybe impossible.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
This run leaves me breathless. Kidding aside, I found some of the movement to be a bit erratic. Some lines you took seemed inefficient at first glance, for example, requiring you to move backwards because you overshot your destination. I trust that it's actually carefully optimized, but to a casual observer, I say it looks a little sloppy.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Ferret Warlord wrote:
I haven't read much about what you're talking about, but this seems appropriate.
Looks extremely relevant. I noticed the same strategies that I figured out, labeled in the paper as risky, safe, and pass. I'll take a closer look when I get a chance. I haven't had time to put pencil to paper, but I've been thinking about how to analyze the game. The game's state can be completely determined by the following variables: 1) Total number of pairs remaining. Let's call it P. 2) Number of points the current player is ahead (or behind) by. This variable effectively ranges from -P to P because in those extreme cases, the best (or worst) you could expect is a tie. For example, if you're 20 points behind and there are just 5 pairs left in the game, you've already lost and there's no point in conducting any analysis. We can call this variable S for score. (The range of S is giving me flashbacks to raising and lowering operators in quantum mechanics.) 3) Number of known cards. This ranges from 0 to P because if it exceeds P, then a pair is already known, which can't happen with optimal play. We'll call this variable N. To each state, we assign the expectation value of the round's point value (loss=-1, tie=0, win=1) given optimal play. I'll call this variable X, so in short, we're looking for X as a function of P, S, and N. From there, I would work on a constructive argument. Start with the trivial P=1 cases and then reduce all higher states to this case based on an analysis of the probability. This analysis should probably be carried out on a computer. For P pairs, there are P*(2*P+1)*(P+1) = 2P^3 + 3P^2 + P different states to analyze. For P=1, we already have five states to analyze and for P=2, this balloons to 29 different states and P=3 has 84 different states.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Truncated wrote:
Who wins at Memory? While playing Memory today, I thought about 1) the best strategy to win and 2) who wins statistically, the player to go first or the player to go second? Let's assume that both players have perfect memory, so that all that matters is statistics. Let's also assume that you must reveal at least one new card on your turn, so we don't get stuck with both players only choosing known cards because revealing a new card decreases your chances of winning. 1) I have a good idea about the optimal strategy. When there are lots of cards left, it's is better to only reveal one new card, and then pick a card which is already known. Reasoning: if you reveal a card which you don't know the match for, you should not reveal another card, because that increases the risk that your opponent can match that card with an already known card. If there are only a few cards left, it can be better to switch to reveal two new cards, if the first one isn't a match to a known card. For example: 6 cards left (AABBCC), 2 cards known (AB). You reveal a card which is C. If you guess on one of the three remaining cards, you have 1/3 chance of winning. If you instead pick one of the known cards, you have 0 chance of winning, because all of the new cards which the opponent turns up will match a known card. 2) For a small number of pairs, calculating player 1's chance of winning is easy. For example, for 2 pairs is 1/3. Reveal one card, A. You now have 1/3 chance of guessing the matching card. Whoever gets the first pair also gets the second. For 3 pairs, it is 1/15 (win directly) + 8/15 (win on second turn), or 3/5. How about x number of pairs? Is there a way to generalize this?
There may be some deep theory here, but for starters, let's consider one pair and two pairs. If there's just one pair, the first player has a trivial advantage. They'll turn over the pair and automatically win every time. But if there are two pairs, the tables turn in favor of the second player. The first player will fail to make a match two-thirds of the time. After that, the second player will pick one of the two remaining cards, which is assured to match with one of the two revealed ones. From there, they win. (I'm assuming that when a player makes a match, their turn continues.) I'm guessing that the pattern may continue such that an odd number of pairs favors the first player and an even number of pairs favors the second player. I'll give this a little more thought. Edit: I took a few minutes to write out what I believe are all the possibilities of two- and three-pair games. I've assumed (without loss of generality) that players turn over cards from left to right. If they can make a match, they choose the appropriate card. If they can't, they pick the next card to the right. Also without loss of generality (I think-- someone should work out the details here...), we'll label the cards in ascending order from left to right. Note that this is different from your strategy, but I'll give that some thought as well. 1122 - P1 win 1212 - P2 win 1221 - P2 win 112233 - P1 win 112323 - P2 win 112332 - P2 win 121233 - P2 win 121323 - P1 win 121332 - P2 win 122133 - P2 win 122313 - P1 win 122331 - P2 win 123123 - P1 win 123132 - P1 win 123213 - P1 win 123231 - P1 win 123312 - P2 win 123321 - P2 win Using this strategy, player 1 wins seven out of fifteen times, so my intuition was wrong. Player 2 seems to have the advantage here. Okay, now let's consider your strategy, in which player 2 "wastes" a move by turning over just one new card and also turns over a card he knows is not a match. As far as I can tell, that strategy affects the following games: 121323 121332 122313 122331 123123 123132 123213 123231 123312 123321 Or more succinctly: 1213XX 1223XX 123XXX In the first two games, player 2 finds themselves ahead by a match. Because the 3 is uncovered, they must take a chance on one of the Xs. Otherwise, player 1 will uncover one of the Xs and be assured a victory. The third game is marginally more interesting. Player 2 has just uncovered a 3 and can uncover one of the Xs, hoping it's a 3 as well. Two-thirds of the time, however, it's not a 3 and player 1 is assured a victory. Their other option is to uncover one of the first two cards, kicking it back to player 1. Player 1 would then uncover one of the Xs and be positively guaranteed a victory. In this case, the optimal strategy is to uncover one of the Xs. So assuming I didn't make any mistakes, the original analysis stands. A perfectly played game of memory with three pairs favors player 2 just slightly, as they'll win 8 out of 15 times.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Yeah, looks like I'm a little late to the party, but I recommend anyone who is interested in this puzzle try the test themselves. Without that context, it's hard to figure out how they "think". Edit: The below paragraph is kind of wrong. Not entirely though. The cards should be read in three separate rows from left to right. I initially tried to be creative and read them top to bottom or as a grid. Nope. The first two rows establish the pattern and you're supposed to deduce the last card of the last row from that. Edit: I'm not deleting the above text because it's usually right. It doesn't apply to at least one of the questions. It's kind of dumb to strongly establish a pattern and then say, "Aha! Tricked you! This one isn't horizontally based." Most of the questions rely on the following concepts off the top of my head: - Rotations - Reflections - Exclusive or (lines/shapes that are present in one card or the other but not both) - Addition (in the arithmetic sense) - Precedence in overlapping My reasoning on the question posed by NordicAnomaly is along the same lines as Masterjun's and Flip's. I don't think anyone so far has a good explanation for what's going on on the left-hand side of each figure.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
I made a short-ish WIP of this game for fun following the Dream Team Contest. I don't think the quality is good enough to be publishable. Instead, it's just a demonstration of what superhuman play might look like. I'd appreciate it if someone encodes the WIP and I'd also like feedback if anyone likes what they see. Comments and criticism are quite welcome. For convenience, I'm copying the description of my movie's upload text below: This is a WIP of Mario Tennis I spent a few weeks on following the Dream Team Contest. I'm reasonably confident in the long-term route optimization but the individual matches are horribly unoptimized. To preserve my sanity, I basically just tried different inputs until it resulted in an ace. I generally avoided using luck manipulation to ensure that I could get an ace on the next point. It would save a little walking time to use the training center much later (on the way to the varsity team), but without power-leveling first, it is hard/impossible to ensure aces against your first opponent. Besides, I figure that upgrading power results in the ball bouncing twice and ending the point sooner, which saves time on all of the first four opponents. Because not all of the lessons are unlocked initially, I avoided the training court until becoming champion of the senior class (not accomplished in this movie). This may have been a mistake. I am currently stuck on an opponent who I cannot consistently beat with one, two, or three shots. I don't know if she could be defeated with a few upgrades to my spin, but level ups are harder to come by at this stage and they tend to come at the cost of other categories. My upgrade strategy has been pretty simplistic, but I feel I'm on the right track. My first priority is power because it results in faster points and can take out the first couple of opponents with service aces and return aces. My second priority is control because it is needed to maintain aces against later opponents. My third priority is spin because it might come in handy, though I'm not sure. And my fourth and final priority is speed because as a TAS, the player is omniscient and I haven't yet found a purpose for it. I upgrade any attribute as long as it does not come at the cost of a higher priority one. My greatest insight into this game has been disassembling its experience point calculator. The formula is actually very simple, although there are still some open questions: 1) Start with the opponent's "base score". I do not know where/how this is obtained. 2) Add the total number of games played (NOT games won!) multiplied by some multiplier. I do not know where/how the multiplier is obtained. It is not determined solely by your opponent, since a test showed that completing the training center first increased the value of the multiplier. I suspect it is dependent on the number of stars you have in your completion screen. 3) Add the total number of service aces multiplied by some multiplier. I do not know where/how... etc., etc. 4) Add the total number of return aces, smash aces, lob shots, and drop shots, each multiplied by some multiplier. This is done individually, but in my experience, their multiplier is always the same, so the game could have just added them all together, then multiplied. 5) Repeat steps 3 and 4 for your partner's service aces, return aces, smash aces, lob shots, and drop shots if he is present. 6) Multiply by 1.5 each if you have the iron racket and/or shoes equipped. (I actually haven't tested this and don't know for certain if that's strictly true.) From what I remember, the base score starts at 70 (typically incrementing by 10) for the first opponent and the multipliers all start at 2. By the fourth-ranked senior class opponent, the base score is 120, the games played multiplier is 5, the service aces multiplier is 4, and all other multipliers are 3. I recall that your partner's multiplier's are typically higher than your own. Glancing over my tracelog, however, I don't see evidence for that, so it's an open question. If it is true, however, then it may be a good strategy to upgrade your partner's stats and try to manipulate them into performing return ace drop/lob shots. For singles, the optimal strategy is clear: perform a service ace whenever possible when you're serving and, when returning, perform a return ace lob/drop shot. I do my best to adhere to this strategy throughout the WIP. I intended this to be a 100% run, so there is still a lot of ground to cover. One possible improvement to the route would be spending a few experience points on your partner to upgrade his power and control and then playing the junior doubles matches after the junior singles matches (it's faster to reset back to the dorm anyway, so you might as well team up then). Alternatively, you could leave your partner at level 1 and swallow the loss of his service and return ace experience points, which may not make up for the gained experience you "steal" from him. It would be worthwhile to research whether investing in your partner is worth it. I was hoping to keep this project to myself until it was finished, but since I've hit a bit of a roadblock and I recognize when I'm losing interest in a project, I'm opening this WIP up to criticism and commentary.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
It's a great game, to be sure, and I'd love to see a run of it as well. However, I don't see much opportunity for a TAS to distinguish itself from the segmented RTA. If we're lucky, a TAS might clock in at under 2 hours. Count me as mildly interested, but I'll probably be on the sidelines.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
I'm going to try to summarize that video because it's very long and, incredible as his accomplishment is, Kaztalek's commentary is really annoying. It's full of rhetorical questions like, "But how am I going to get the zora eggs without bottles??? Stay tuned...". My summary will have some gaps in it because although I've played Majora's Mask, I'm not very familiar with speedrunning techniques in the game. • Uses grandma's stories to fast forward to dawn of the final day, then dances with the scarecrow to make it night. • Backflips out of Clock Town and goes to Goron Village to pick up the Lens of Truth, which he later uses to pick up the Goron mask. (The Goron Mask can't be obtained without the Lens of Truth.) • Suicides to return to Clock Town. • Gets magic from the fairy in North Clock Town. • Buys a bomb bag to use bombs for extensive hovering later on. • 21:43 - Pauses to equip bombs, the Lens of Truth, and the Ocarina of Time. • Runs to the swamp (still a deku), gets to the giant octorok, drowns, gets hit by a rock spit by a small octorok which sends him flying past the giant octorok into the area with the Deku Palace. • Does some creative wall clipping and jumping and is shot by a Deku to put him on the higher level of the Deku Palace. From there, he straightforwardly picks up Sonata of Awakening. • Heads to Woodfall to use the Sonata of Awakening. • Heads back to Clock Town to get the Song of Healing. Uses some giant dragonflies and a similar trick to earlier to clip past the giant octorok blocking the path. • Now in human form, gets the bomb mask to allow him to pick up the large bomb bag. Buys bombs and does an out-of-bounds warp at the fairy fountain to send him back to Woodfall. • Does some bomb hovering to get to Woodfall Temple. • Gets the bow. • Uses some bomb hovering and an out-of-bounds trick to get to the boss room in Woodfall. Defeats Odolwa. • Plays Song of Time. Picks up rupees and buys more bombs. • Staircase (bomb) hovers over the fence to Great Bay. Gets the zora mask. • Fairy warps to Ikana Canyon. • Uses extensive bomb hovering to get up to Stone Tower Temple. This portion takes over ten minutes. He uses a few enemies to replenish his bombs along the way. • Uses bomb hovering to get to the light arrows. • Flies back to Clock Town. Uses staircase hovering to reach a hidden owl statue. This is used for something called "mayor's warp", which I don't understand well. • Goes to Romani Ranch to pick up Epona. The mayor's warp, an owl statue, a stored Song of Time, and a gossip stone combine to trigger something called the "zeroth day glitch", where the day is returned to the first day's state without interrupting progress. This allows him to get Epona's song. • Uses Song of Time. Picks up more bombs. • Goes to the mountains, obtains the Goron mask (recall that the Lens of Truth is needed). • Goes to Snowhead Temple. Staircase hovers all around it to pick up the flame arrows and eventually reach the boss room. • 1:38:25 - Pauses the second and final time. Equips light arrows, the goron mask, and the zora mask and then equips the fire arrows over the light arrows while triggering the zeroth day glitch again. This allows him three seconds to use the fire arrows before they are permanently replaced with light arrows. Uses the fire arrows to thaw Goht. • Kills Goht with light arrows. • Returns to Termina Field and loses his sword to a bird. • Saves at an owl statue in Clock Town as zora. • Copies the save, loads the second file, goes to Romani Ranch, picks up Epona. Saves at the owl statue while on Epona in the second file. • Resets, loads first file, now on Epona as zora in Clock Town. This cancels zora's B button (now he can't use the boomerang fins) and allows him to use the B button for items depending on the state of the B button at certain times (I'm a little unclear on the details of this). Basically, if the B button says "Pound", he can use the zora's B button to instead drink Obaba's drink and obtain a bottle for catching zora eggs. He uses a similar trick with the goron mask to store the ocarina as the goron's B button. • Begins the Easter egg hunt at Pinnacle Rock. He also stores the Song of Time, which allows him to clone the first egg. I'm not exactly sure why or how this works. • Deposits the first egg and clones it by activating the stored Song of Time. This also resets the Pinnacle rock eggs, so he now needs the three Pinnacle Rock eggs and two Pirates' Fortress eggs. These are obtained one by one. To get on the aquariums in Pirates' Fortress, he jumps off a chest in one room and a barrel in another room. The entire egg quest takes about 30 minutes... • Something about depositing bugs at a gossip stone allows him to use the ocarina as a zora. This lets him play New Wave Bossa Nova. Saves at a nearby owl statue and resets. • Transfers Epona from the second file for the third time. This allows him to use the zora's boomerang fins again. • Gets eaten by a like-like while it's on land and he's underwater, then kills it. (The exact sequence of events here is hard to follow.) This paralyzes him except for punching, which moves him forward slightly. Also, the player's y position is preserved, except when they move uphill. This allows him to hover over various terrain to get up high enough to mount the tortoise. • In the Great Bay Temple, clips through the wall to get to the boss room. Kills Gyorg. Flies to Stone Tower owl statue. • Does a hover glitch to reach the background area of stone tower. Runs into position to shoot a light arrow at the gravity inverter. • In inverted Stone Tower Temple, hovers off of some poes to get out of bounds and reach the boss room. This takes about six minutes. • The rest is straightforward. Kill Twinmold, uses Oath to Order to get to the moon, kills Majora. The end.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
samurai goroh wrote:
I was going to create a new topic, but it's about the same subject (help on LUA, also for SNES9x). On the Lua Scripting page, there's a TODO section to cover about joypad.set (which is what I'm interested on). I want to create a script for Final Fantasy V where you press every single combination of buttons (all 12: up, down, left, right, select, start, B, A, X, Y, L, R) in a single frame to see how the RNG advances when entering a battle. When I try this manually, it doesn't seem to act like each button advances the RNG by determined amount, so I can't calculate it and must go with trial and error (hence a need for a script to automate this part). I want to try to see if I can get a lucky path to beat Omniscient as Solo Berserker using Mage Masher to silence him. Since Berserkers doesn't need any input when playing (and doing so doesn't affect the RNG in any way), only part you can manipulate is the startup (which any other Job setup can benefit from, so the script could be used later for any other battle in particular and not just for this case...) Here's the steps I want to try:
1. Load save state
2. Press new combination of buttons for 1 frame
3. Advance (say 30 frames) and check values of 2 addresses
4. Send information to a file so I can analyze
5. Repeat steps
If the output is to big to try manually, then it'll be both good and bad news. (Good because fights can have many paths, hence more outcomes; Bad because it wouldn't be practical to test manually, so the script would need to updated, but I suppose that would be easy - just need to wait more time before trying a new input...) I know these are some of the instructions, but I'm not sure how to use them: 1. savestate.load(object savestate) -- <-- Guess I replace with the name of the save 2. Update "ButtonSequence" -- <-- This part is where I'm most lost Joypad.set(1, ButtonSequence) 3. emu.frameadvance() -- <-- Place it inside a FOR to advance X frames? A = memory.readbyte( 0x7E003A ) B = memory.readbyte( 0x7E003B ) 4. print (ButtonSequence, A, B) -- <-- Since BS is likely a table and not a number, this isn't straightforward I would later check the first instance of A,B having the same value in different button sequence, or maybe could be included first and print the results at the end... 5. Repeat until every button sequence is covered (2^12 times). Any help or better suggestion would be appreciated.
I'm not going to test this script and it's probably not the most efficient way to do things, but here's a quick stab at it:
Language: lua

local function TestBit(num,whichbit) num = math.floor(num/2^whichbit) num = num%2 if num==1 then return true else return false end end local ButtonsPointer = {[0]='A','B','X','Y','select','start','up','down','left','right','L','R'} local ButtonsPressed = {} local A = {} local B = {} local state1 = savestate.create() for ButtonIndex = 0,2^12-1 do savestate.load(state1) for b = 0,11 do ButtonsPressed[ButtonsPointer[b]] = TestBit(ButtonIndex,b) end input.set(1,ButtonsPressed) -- CUSTOMIZE THE CODE BELOW TO SUIT YOUR NEEDS emu.frameadvance() -- Frame advance once? -- Does BizHawk have memory.readword? You may want to use that. A = memory.readbyte(0x7E003A) B = memory.readbyte(0x7E003B) -- BizHawk SHOULD be able to output tables to the console, but in case it can't like you suggest, you can just output ButtonIndex and manually check which buttons it corresponds to. print(ButtonIndex,A,B) end
Hopefully you can debug any problems with that code. Good luck!
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Run Lola Run. I suppose you could argue that it's more of a non-assisted speedrun, though.
Warp wrote:
Nobody has even to this day made any comment about this movie, so I'm assuming nobody has actually checked it. Just check it. It's the most "TAS" movie I have seen. Even more than Groundhog Day. http://www.imdb.com/title/tt0435705/
Actually, you did...
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Voting no for not getting the max score in Beetle Mania. Just kidding. Enthusiastic yes vote!
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
I'm trying to figure out what options are available to us. Without the JMP or JSR commands, we're in a difficult spot. Using the character name directly to write values is impossible because there is no overlap between our character set and the RAM. We could potentially work around this using the registers themselves, though. Let's look at the register states after using welcotar's script up through command $310:
A:A2 X:10 Y:00 S:11 P:nvubdIZC
A's value comes from $310, which is
A:00 X:10 Y:00 S:11 P:nvubdIZC               $0310:01 00     ORA ($00,X) @ $B549 = #$A2
The values at $10 and $11 are set somewhere in the $C681 subroutine (lines $B173 and $B177 respectively). Since they are in the volatile zero page memory, we may ultimately be able to manipulate A's value, although that depends on whether or not subroutine $C681 is effectively deterministic. X's value is straightforward, coming from subroutine $D9EF, which loops 16 times. As long as $D9EF is called immediately prior to the corruption (which looks likely), we're stuck with that value. Y's value is also set by $D9EF, so if we're stuck with X=$10, we're just as well stuck with Y=$00 as far as I can tell. I'll ignore the stack pointer and flags because I think they're stuck with the values we see here. So how do we move forward? One powerful way would be manipulating the zero page memory at $10 and $11 to give us an arbitrary value for A, allowing us to jump anywhere in the $294 to $396 range, hopefully to RAM that we've written to take us somewhere yet more favorable. I'll leave that possibility as speculative. Assuming instead that we're stuck with $A2, $10, and $00 as our register values, our options are more limited. We can't execute outright arbitrary code and we have just a few tools to poke the RAM. We can store A, store X, store Y, or transfer X to the stack pointer and that's pretty much all. As far as addressing for the purpose of storing values, absolute is out of the question, since our character set points to the ROM, not the RAM. I may be wrong, but I also think that messing with the zero page memory is unlikely to do any good since it's so volatile regardless. That leaves us with indirect addressing. So without knowing what's in $80-$FF (which is easiest for us to access), that's where I'm stuck as of this morning. It looks like we either want to manipulate A's value or store A via indirect addressing. One final possibility would be to load a favorable value for X and then send that to the stack pointer, but I'm not sure how useful that would be. Perhaps there's a good spot to load to if we knock the stack pointer out of alignment. Edit: I looked a little deeper into the code to see if we can manipulate A. The short answer is apparently no, we can't. I ran TheAxeMan's published run to see if the values in addresses $D2 and $D3 ever change. Outside of battle, no, they're a constant value of $49 and $B5 (or $B549 in little endian, since they're actually an address pointer). The subroutine at $C681 features a loop that continues to execute until address $4D is equal to $D0. This subroutine loads $D2 and $D3 and transfers them to $10 and $11 and then A effectively loads the value there (at $B549). Since that's part of the ROM, we're stuck with A=$A2. I'll keep looking for new possibilities. Edit 2: Addresses $30A through $311 appear to be affected by entering (item?) shops. Those changes linger, so we might have an avenue there. Edit 3: Nope. Shops also override $312 through $315. I suppose if we're very lucky, whatever item or text is being loaded into $30A through $311 might correspond to useful opcodes.
Experienced Forum User, Published Author, Player (79)
Joined: 8/5/2007
Posts: 865
Hey, welcotar! Fantastic find! I've gone to work on the NA version, trying to see what we can accomplish with it. You're probably well ahead of me, but what I've got is not especially promising so far. I've copied my notes below. In particular, notice the list of opcodes that are available to us (I've listed them as hex/mnemonic/corresponding character/description):
Player 2 name stored in $312.

8A 8B 8C 8D 8E 8F 90 91 92 93
94 95 96 97 98 99 9A 9B 9C 9D
9E 9F A0 A1 A2 A3 BE BF C0 FF
80 81 82 83 84 85 86 87 88 89
A4 A5 A6 A7 A8 A9 AA AB AC AD
AE AF B0 B1 B2 B3 B4 B5 B6 B7
B8 B9 BA BB BC BD C2 C3 C4 C5

80-8F
90-9F
A0-AF
B0-BF
C0
C2-C5
FF

0123456789ABCDEF
GHIJKLMNOPQRSTUV
WXYZabcdefghijkl
mnopqrstuvwxyz',
.*-|!?

HEX MNM CHR DSC
$90 BCC  G  (branch on carry clear)
$B0 BCS  m  (branch on carry set)
$c5 CMP  ?  (compare accumulator, zero page)
$c0 CPY  .  (comapre Y, immediate)
$c4 CPY  !  (comapre Y, zero page)
$B8 CLV  u  (clear overflow)
$A9 LDA  f  (load accumulator, immediate)
$A5 LDA  b  (load accumulator, zero page)
$B5 LDA  r  (load accumulator, zero page, X)
$AD LDA  j  (load accumulator, absolute)
$BD LDA  z  (load accumulator, absolute, X)
$B9 LDA  v  (load accumulator, absolute, Y)
$A1 LDA  X  (load accumulator, indirect, X)
$B1 LDA  n  (load accumulator, indirect, Y)
$A2 LDX  Y  (load X, immediate)
$A6 LDX  c  (load X, zero page)
$B6 LDX  s  (load X, zero page, Y)
$AE LDX  k  (load X, absolute)
$BE LDX  '  (load X, absolute, Y)
$A0 LDY  W  (load Y, immediate)
$A4 LDY  a  (load Y, zero page)
$B4 LDY  q  (load Y, zero page, X)
$AC LDY  i  (load Y, absolute)
$BC LDY  y  (load Y, absolute, X)
$8A TXA  A  (transfer X to A)
$88 DEY  8  (Decrement Y)
$85 STA  5  (store A, zero page)
$95 STA  L  (store A, zero page, X)
$8D STA  D  (store A, absolute)
$9D STA  T  (store A, absolute, X)
$99 STA  P  (store A, absolute, Y)
$81 STA  1  (store A, indirect, X)
$91 STA  H  (store A, indirect, Y)
$9A TXS  Q  (transfer X to stack pointer)
$BA TSX  g  (transfer stack pointer to X)
$86 STX  6  (store X, zero page)
$96 STX  M  (store X, zero page, Y)
$8E STX  E  (store X, absolute)
$84 STY  4  (store Y, zero page)
$94 STY  K  (store Y, zero page, X)
$8C STY  C  (store Y, absolute)
The good news is that we have access to $90 and $B0, branch on carry clear and branch on carry set, respectively. This means we should almost certainly be able to jump around somewhere within the game's code. The bad news is that the character set is mapped mostly to hex values $80 to $C5, which means we have to jump backward. I guess that's not bad news if the RAM there can be manipulated, but I have some information on that... Character 2's name is stored in address $312. I verified directly by running a trace that, indeed, that is where the code is executed from. Using the BCS instruction, the only addresses we have access to are $294 (corresponding to character 2 name "m0**") up to $2D9 (corresponding to character 2 name "m?**"). (You may want to check my arithmetic for both of those.) Unfortunately, RAM in that range seems to be stuck with values like $F8 and $F0 most of the time. I fired up TheAxeMan's current publication to see if those values change at all and so far I've only seen them change appreciably when he enters the Circle of Sages, after which they go bonkers. If we can manipulate the values there, it will still obliterate half the game. As yet, however, I still don't understand what's being stored there. So my questions/comments for welcotar are as follows:
    1) I'd very much like to see the disassembled ROM! PM me or post it publicly. 2) If you happen to know, what is stored in address range $294-$2D9? I'll research it myself in the meantime, but so far I'm stumped. 3) What happens if you climb the stairs, say, another 70 times? Since 256 and 7 are coprime, maybe we have some leeway as to where the stack corruption takes us. I'm not very good with assembly language and it's hard for me to interpret what you've written, so I'm exploring that very slowly. 4) The glitch actually sets the program counter to $30A and it eventually increments to $312. What is in the $30A-$311 range? In my latest test, the first three instructions were garbage ($80) but the instruction at $310 happened to be $01 00 corresponding to ORA ($00, X). If as many as 8 more bytes can be directly manipulated, I'm confident we can get arbitrary code execution to work.
For anyone who would like to experiment with a modified version of welcotar's script that works on the NA version of Final Fantasy, you may find a copy here: Download FF_ACE.lua
Language: lua

-- this is a sloppy little script to walk up and down the coneria castle stairs -- a number of times and then enter the menu screen emu.speedmode('maximum') trips = 70 function walkToY(desty) while true do y = memory.readbyte(0x2a) if y == desty then break elseif y == 0 or y > desty then -- on the world map screen initially y is 0, since this y variable is -- only used for inside maps. we need to go up initially to get into -- the castle. joypad.write(1, {up=true}); else joypad.write(1, {down=true}); end; emu.frameadvance(); end; end; function press(button, n) mask = {} for i=1,n do emu.frameadvance() mask[button] = false joypad.write(1, mask) emu.frameadvance() mask[button] = true joypad.write(1, mask) end; emu.frameadvance() end; -- hard boot emu.poweron() -- get through prophecy press("A", 28); -- enter whatever for character 1 press("A", 9); -- use default thief for character 2 --press("right", 3); press("A", 1); -- enter a magical name -- 8A 8B 8C 8D 8E 8F 90 91 92 93 -- 94 95 96 97 98 99 9A 9B 9C 9D -- 9E 9F A0 A1 A2 A3 BE BF C0 FF -- 80 81 82 83 84 85 86 87 88 89 -- A4 A5 A6 A7 A8 A9 AA AB AC AD -- AE AF B0 B1 B2 B3 B4 B5 B6 B7 -- B8 B9 BA BB BC BD C2 C3 C4 C5 -- some examples: -- 4c ae 95: class change -- 4c 84 b2: give airship press("right", 2); press("up", 2); press("A", 1); press("left", 2); press("up", 2); press("A", 1); press("A", 6); -- select character 3 press("right", 8); press("A", 12); -- character 4 press("A", 15); -- walk up to two tiles before stairs. walkToY(13); -- take trips flights of stairs for i=1,trips do -- the stairs are at y=11 on both the ground floor and the second floor. -- first walk to one square away, then walk onto the stairs, then walk off. walkToY(12); walkToY(11); walkToY(12); end; -- enter the menu screen for i=1,15 do emu.frameadvance(); end; joypad.write(1, {start=true}); -- exit the menu screen and glitch shop for i=1,25 do emu.frameadvance(); end; press("B", 100); -- show menu for fun for i=1,25 do emu.frameadvance(); end; joypad.write(1, {start=true}); while true do emu.frameadvance(); end;
Edit: Here's a quick update to report on what I thought was a promising lead. I discovered that a flag at $62CA dictates whether the black orb is present in the Temple of Fiends. I cheated it to 0 (corresponding to it being gone) and the tile is not traversible. I suppose you really do need the four orbs shining to step forward through the altar. Oh well. Of the other skips we might reasonably execute, I'm wondering whether it would be better to get the early airship (it may depend where it shows up) or skip the air orb, which would also obsolete the Waterfall, Leffein, and parts of the Sea Shrine and the return to Melmond.
1 2
11 12 13 34 35