Posts for Omnigamer


1 2
8 9 10 11 12
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
I'm currently working on trying to track down a bug that occurs on at least BizHawk 1.4.1 with the SNES core for the game Dragon View. About halfway through the game it loads a certain dragon sprite with some wavy effects. This crashes on all versions of snes9x that I've tried as well as BizHawk. It works on zsnes, oddly enough. I've made a post about it in the thread, but I think it has to do with how a STY is interpreted. In the game: -$7EA98B is not set in any observable way, and is initially 0. $7E00E7 is preloaded with 0x0125, but only the 0x25 is important. -At the start of a graphics routine, the processor is set to 8-bit mode, and $7EA98B is loaded into Y as 00 00. Y is then stored to $7E00E6. -Since the store is from Y, it overwrites $E6 and $E7 with 0s. -The game then blindly proceeds to decrement $E6 in 16-bit mode. Since it's now 0, this underflows it and the game can crash or warp to the credits depending on prior inputs and some other factors. My main question from this is: is this the expected behavior for a STY in 8-bit mode? Does it always store 16 bits regardless of the processor mode? I don't have a way to verify what is *correct* since I don't know of an emulator that actually completes this and has a trace logger. If the STY is only intended to store one byte then the sequence makes sense, but as it is it creates a semi-infinite loop that corrupts a lot of addresses. I have the traces but no movies/save states for BizHawk. The scene works without issue* on console. *It has been observed on console before, but we can't be sure if it's the same activity. It works 99% of the time.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
I was investigating this glitch recently. It occurs because of one or more bugs: -At some point after starting the text sequence to load the dragons, it transfers the contents of $7EA98B to $7E00E6 in 8-bit mode. In my experience this value is always 0. It is then blindly decremented until it reaches 0, so the bug forces it to underflow and cause general havoc as it cycles through a lot of values. Forcing it to 04 or any other value via a poke or AR code will allow you to progress, but the graphics will still be messed up on the dragons for a bit. -$7E00E7 is also set to 0x25 at some point and isn't really cleared. The transfer to $7E00E6 is in 8-bit mode but is from the Y register so it bypasses this. The decrement occurs in 16-bit mode, so it wouldn't be farfetched to believe that it was meant to be 0x2500 instead of 0x0000. What is the expected outcome of a store from Y in 8-bit mode? Should it overwrite the high and low bytes or just the low byte of a target address? After playing with it a bit more, I'm pretty certain it's the latter.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Actually, could you post your WIP for what you have currently? If the music messes up in the run I can use that to compare with a non-messed up version and figure out which things aren't getting set correctly. We might be able to figure out the Stage 2 and 9-1 text bugs from it. The progress is looking great! Just a bit more to push the total below 15 minutes!
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
I tried playing around with a few things regarding the text skip. It doesn't look like I actually do anything different than normal in the video, and I wasn't able to replicate the behavior on emulator. This makes me think that it's not a certain input or combination of inputs, but rather something getting screwed up in memory earlier in the level/game. That also means that it can probably be done at other points in the game too, although I think there are only a couple points where there's any significant amount of text after the player name. I'll keep trying things and let you know if anything turns up.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
For that clip in particular I think they set it up similar to how you can get into the secret area in Stage 9-1. Leaving the Drache in its dive form shrinks the hitbox a lot, and then using the other player to push him in should can cause that clipping when the player releases dive. The other thought is that they may abuse the elevators for it. For example, exiting on the very edge of the elevator and re-entering while it is holding the mech mid-wall. If they use some other method to clip in, then yes, we really need to find out what it is ;)
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Some of them may be emulator-specific, which wouldn't help us much. I tested most of the tricks and could get all but the Ballistic charge to work on console. If you have questions on specific tricks I can try to explain them in more detail. EDIT: To clarify, I mean that I tried the individual tricks. The crazy switch glitch setups and some of the other misc glitches that mess with the tilesets on Stage 7 I didn't mess with.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
The pause trick with Ballistic? Do you use it with the power roll then? I remember that it's active for a few frames, but not enough to make it reliable in real-time. I do know there is a glitch where it will not cancel after running into an enemy though, so it can do a lot of damage. I haven't been able to reproduce it (I might not know all the conditions) but it's present in the trick videos from Nilusxy. It might save you some time if it's easy to set up since you wouldn't have to pause and unpause, it would just be a constant hitbox. The only description for it was to use the shield right before connecting with an enemy, but again I have not been able to make it work.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Great! Can't wait to see the results. That said, with Stage 3 done it means you're on Stage 4 again... ugh. Good luck.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Copypasta of my post on SDA: EDIT: Nitrodon pointed out some inconsistencies/corrections. I'll edit them in soon. ==================== Still looking into the full effects, but I'll at least discuss some of the basics. These pieces have been "known" for a while, but as best as I could find a full explanation is not available in English. First off: the game's RNG is based on a look-up table (LUT) at 0xC0FEC0 that has 256 entries. This means that it doesn't ever "calculate" any random numbers per se, it just keeps tracks of some values and uses those to as an index into the table. This also means that there is no strict RNG address; the values the game uses as its RNG are only ever present in the accumulator and are not stored elsewhere. Think of it as looking up a phone number and then throwing it out after you call. Determining if you trigger an encounter: There are a number of values at work for this, but the main ones to remember are your step counter (aka danger counter) at 0x7E16A8 and the encounter index at 0x7E0B4F. There's also a danger offset at 0x7E0B60 that is incremented by 0x11 every time the encounter index overflows; it is used during the calculations. The process proceeds as such: 1. Begin to take a step. At the end of the step, the step counter will increment by 0x100 on the world map and some other number in dungeons (it's an annoying algorithm). 2. Increment the encounter index by 1. Use the index to pull a value from the RNG table. 3. Add the value in the danger offset to the obtained RNG value; regard the result as one byte (ignore overflows). 4. Take the sum obtained from 3 and compare it with the high byte of your step counter (0x7E16A9). If the sum is less than your steps, start random encounter. There are still some oddities with this process. For example, not every tile in an encounter space will increase your step counter. Karnak castle only increments the step counter in certain locations of the castle, or only once per every 3 or 4 steps. On the World Map you can also reset your step counter to 0 by viewing the map or by opening the menu; this will not always save you, but should keep you safe from most battles. Entering rooms or viewing scenes will also reset the step counter to 0. Determining encounter type: This process is a bit more straightforward. There is a group counter at 0x7E0B50 that increments whenever you enter into a random battle, and an additional offset at 0x7E0B5F. The offset increases by 0x17 every time the group counter overflows. 1. Determine if a random encounter takes place. If so, increment the group counter and use it to grab a value from the RNG table. 2. Add the sum of the obtained value with the offset at 0x7E0B5F. 3. If the sum is less than 90, use enemy group 1. If between 90 and 179 (inclusive), use group 2. If between 180 and 239, group 3. Group 4 for between 240 and 255. There may be some other minor instances that cause the counter to increment, but otherwise it is not touched. For example, it might increment when entering a boss battle or other scripted battle. Battle RNG: This is the one I understand the least in terms of how the values are used, but I at least know what it's doing. Key addresses are 0x7E003A (counter A), 0x7E003B (counter B), and 0x7E7C55 (selector). 1. Clear and initialize counters A and B at the start of battle. I don't yet know how it initializes them, but it's somewhat consistent. 2. If selector is 1, increment counter A and use it for the necessary RNG operations. Else, increment and use counter B. 3. Toggle the selector between 0 and 1. 4. Repeat from step 2 until the end of battle. This sequence is particularly tricky since there are two separate counter values that alternate. While no character or enemy is taking action, the counters are incremented at a frequency determined by the battle speed. With battle speed 6 it will perform steps 2 and 3 once per frame. At battle speed 1, it only performs them on average once every 4 or 5 frames. This activity freezes any time the ATBs are frozen (during enemy attacks, menus), but it will still advance any time it needs a random value for some portion of its calculations. For example, a typical enemy attack will cause both counters to increase by 1 (meaning it used 2 random numbers). These sequences are also used for determining drops after you kill an enemy, whether you are able to steal and the resulting rarity, and other similar effects. I still don't know some other potentially helpful RNG counters, such as back attack/first strike. I also know it uses a frame counter at address 0x7E0B3F to index the RNG table a bunch, but I have no idea what the results are used for. I will look into these things eventually, but probably not until after I finish up my FJF.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
The columns in RAM Watch are always assumed to be "default" when loading from a .wch file, so if you manually reorder the columns a lot of data will be in the wrong column when you load the file. As best I can tell the reordering is preserved by the program, but it doesn't pay any attention to what the "correct" column is when filling it with information. Example: If I reorder the Diff column to be first with a few values, everything is fine. Close the program and reopen it to find that Diff is still the first column. However, adding any watches will cause them to use the default numerical ordering of columns; so now the Address will appear in the Diff column and everything else will be a bit wacky too. Just a small usability bug, but thought I'd bring it up nonetheless.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
The FAQs are wrong in that regard. They also state that to access "Basketball Mode" you need to complete the game without using a continue; this is also false. You will always be forced to play Stage 8, and Basketball Mode will always be unlocked after you beat Stage 9-2. They might have been confused since it is called a "Secret Stage" in its opening cutscene, but it is not actually secret at all.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Yes, the text is quite buggy. Beyond the mentioned issues with text events accompanied by BGM changes, text events can "overwrite" each other. This is actually the original, older way to do Stage 3: by waiting until the explosion sequence starts up (from all the generators getting destroyed), you can overwrite the "you have failed" text box with the "Good job, Stone!" event from starting to pilot the ship and thus do not fail the mission when you should. The new strats and Dooty's TAS get to piloting the ship much faster, so waiting for the explosion isn't necessary anymore. There are a couple other ways I have seen the game bug out: -In stage 3, if the "They're destroying the generators" text appears at roughly the same time that you cross the threshold for the "Capture the ship" text box, they will both appear and cause some graphical glitches. -If you pause just as a text event is being displayed it will also cause some graphical bugs. -Unrelated to text boxes, but the graphics occasionally screw up a lot in Stage 5 against the giant cannon. -The video below shows something very wrong against the last boss. I haven't been able to reproduce it, and I can't be certain it's not an emulator issue. Even so, very strange/funny. Link to video As far as I know these bugs are just aesthetic, but still worth noting.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
This is just a quick post to say that I've borrowed your script and added some things to it, mostly for my own purposes. Beyond that though there are a number of additions I've worked in. First, some clarifications: -While 7E003A and 3B are both RNG addresses, they are only used in battle. There are some other addresses that are used for out-of-battle purposes. The selector bit is also not 7E0033, but 7E7C55. -The RNG counters used for encounter group (7E0B50) and encounter chance (7E0B4F) are fairly straightforward, but require some calculations to use effectively. I added pieces to the script to display the next 3 battle types in addition to the number of steps before the next encounter. -I changed around the code for the battle RNG counters and have it now display the next 6 RNG values. Effectively using it is will be something else entirely, but it's a start. -I added a short listing of enemy weaknesses to an additional line below the other enemy info. I also wanted to dig up the name and display that as well, but I didn't manage to find it. Not that important, but maybe something for a HUD reorganization. Just wanted to give an update while I could. The trickier part will be finding a way to properly process the battle RNG values, but just having them is enough for now. I will gradually figure it out as I go through my FJF in the coming week.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
A note on the text skipping: I don't know if it makes any difference, but I typically hold b while mashing Y to advance the text. I rewatched some of my older videos, and I don't always skip that sequence of text either. I'll play around with it a bit more... maybe it can be used during other text sequences too.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Placeholder post. Quick encode coming soon (currently uploading). Link to video It is currently unlisted, so you should only be able to watch it here or with the link.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
I just watched, and I have to say that your final stage was pretty fantastic. Setting up for the pause trick on the final boss is not easy, and you made the other parts of the stage entertaining despite their monotony. It worked out to 14:50 if timed according to RTA standards; I have a ways to go it seems! That's about 3.5 minutes faster than the sum of my best splits. As you said, working out the text issues is the first thing. Some other minor things I saw: -You can fire the melee attack and the shot with Spider at the same time. Only one shot comes out between each melee cycle, but it's an extra 2 damage and saves about that many frames each time. Most notable at the start of 6-2 when taking out the cannon. Actually, this doesn't matter since you're bound by the moving platform cycle. -I still don't know how to manipulate them, but abusing the bomb boosts on Stage 8 might help out. I'll put down more things as I think of them.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Then for some final boss tips: -The hitbox for his first form is on the ball he swings around. You should be able to finish the form in only 2 or 3 swings. -The hitbox on the ball still acts as a part of the boss for the second phase. You can just keep shooting the ball while it's rolling on the ground and it will damage the boss so long as he's on-screen. -You can shorten the boss's between-phase invincibility time by not killing the little robots that he spawns. He will only spend time to respawn ones that are killed between phases. -I use the pause trick only once since it gives me just long enough to take out an additional phase while I'm on the ceiling. These would be the 3rd, 4th (Pause with flamethrower after he rushes at you), and 5th stages. -If you can land on the boss's head after the first phase, you can dish out a ton of damage pretty consistently. The only problem is that you die instantly if he turns around. -Taking on the boss with Havoc and level 3 Shot may be faster since you can get there sooner, and actually being able to jump allows you more opportunities to hit it. You can also be more precise in trying to not kill the small robos. Those are the things I can think of off the top of my head. Hopefully it helps!
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
That may explain some of the strange bugs I've encountered, then. In stage 2 for example it occasionally gets stuck in the "text-writing" sequence when it writes out the (one-character) name and just keeps repeating that character for as long as B is pressed. It eventually overflows the text box and continues a ways before the screen goes black and the music eventually stops. Some other known bugs are in stage 3 and 8, where exiting a dialogue box before the music changes will cause the game to softlock. This happens specifically on the dialog box when you approach the enemy ship (stage 3) and during the boss speech (stage 8). I've also had a few occasions where the game didn't softlock but the music was very messed up or frozen until I finished the stage and it loaded a new track.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
I was not sure if changing the name is faster in a TAS setting. It takes one extra frame per character in the name, but to set it up at the beginning takes an additional 70ish frames. I didn't count the number of times the name is used, but I felt that the time spent to change the letters was more than the potential savings. If it does save time though, then it is something to try out.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Sorry to hear that :-/ I checked as many places as possible, but I didn't see a good way to set it up either. Oh well. 9-1 should be pretty straightforward, but 9-2 is pretty dumb. Taking out the boss quickly is pretty important, but most of the time is lost while waiting on the moving walls. Then again, if you can find some way to clip in and get to the top of the map, you can skip the boss entirely. Good luck.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Stage 7 can be pretty messy, yeah. There are a number of routes through the level, but it's hard to say which is optimal with the tools you have available. You may be able to proceed much quicker with booster than with rockets, but I don't know how you'd get through the second wall without dropping down to pick up the rockets.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
The WIP looks awesome! Very clever to not take Spider all the way through. The remaining stages should be fairly cut-and-dry unless you find something radically new with them. There just aren't many ways to get through unless you can clip through the moving platforms. I do think you can get a larger boost from the missiles in the middle of 6-1 though; the speed boost you get should continue regardless of if your sprite is stuck on the cannons. Also, your rockets will occasionally fly right over the cannons and go all the way to the breakable blocks behind them.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Could you elaborate on the "checkpoints" a bit more? It sounds like you have to trigger a certain number of enemies for a checkpoint to be available, and then triggering it will move into the next phase. Are you tracking it based on experience or some memory addresses?
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
Dug in and found what I believe to be the RNG. I say that having investigated things very little and am making the claim based only on "this looks like an RNG".
8fdd25 jsl $80859b   [80859b] A:0000 X:5e63 Y:0000 S:1fe9 D:0000 DB:7e nvmxdiZC V:238 H: 484
80859b lda $0139     [7e0139] A:0000 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdiZC V:238 H: 578
80859e rol a                  A:298a X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdizC V:238 H: 612
80859f bcc $85a4     [8085a4] A:5315 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdizc V:238 H: 624
8085a4 adc $0135     [7e0135] A:5315 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdizc V:238 H: 642
8085a7 sta $0139     [7e0139] A:6ab4 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdizc V:238 H: 676
8085aa lda $0137     [7e0137] A:6ab4 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdizc V:238 H: 710
8085ad rol a                  A:ce36 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e Nvmxdizc V:238 H: 744
8085ae bcc $85b3     [8085b3] A:9c6c X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NvmxdizC V:238 H: 756
8085b0 inc $0135     [7e0135] A:9c6c X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NvmxdizC V:238 H: 768
8085b3 adc $0133     [7e0133] A:9c6c X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nvmxdizC V:238 H: 824
8085b6 sta $0137     [7e0137] A:5e35 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nVmxdizC V:238 H: 858
8085b9 lda $0135     [7e0135] A:5e35 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nVmxdizC V:238 H: 892
8085bc rol a                  A:17a0 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nVmxdizC V:238 H: 926
8085bd bcc $85c2     [8085c2] A:2f41 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nVmxdizc V:238 H: 938
8085c2 adc $0137     [7e0137] A:2f41 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nVmxdizc V:238 H: 956
8085c5 sta $0135     [7e0135] A:8d76 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NVmxdizc V:238 H: 990
8085c8 lda $0133     [7e0133] A:8d76 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NVmxdizc V:238 H:1024
8085cb rol a                  A:c1c8 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NVmxdizc V:238 H:1058
8085cc bcc $85d1     [8085d1] A:8390 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NVmxdizC V:238 H:1070
8085ce inc $0139     [7e0139] A:8390 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e NVmxdizC V:238 H:1082
8085d1 adc $0139     [7e0139] A:8390 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e nVmxdizC V:238 H:1138
8085d4 sta $0133     [7e0133] A:ee46 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e Nvmxdizc V:238 H:1172
8085d7 rtl                    A:ee46 X:5e63 Y:0000 S:1fe6 D:0000 DB:7e Nvmxdizc V:238 H:1206
It changes itself every non-lag frame, occasionally multiple iterations per frame. Seems like it can be quite annoying to work with, but I don't know which bytes it will usually pull from to check RNG conditions. TL;DR: the RNG is all the bytes between 0x000133 and 0x00013A in 2-byte chunks.
Experienced Forum User, Published Author, Player (33)
Joined: 2/16/2012
Posts: 282
You have probably noticed, but you can also sometimes force enemies to push your empty mech around much faster than it can walk. I'm not sure what you've come up with, but it might be useful somewhere along the way. I've only done it once or twice by accident, but having you on one side and an enemy on the other will sometimes cause the enemy to just chase after you without firing.
1 2
8 9 10 11 12