Posts for jlun2

Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Well, playing online MMO's/certain video games take a ton of time to grind and all, and people still do it, no matter how much others complain about them "wasting their lives away". Whenever someone asks me why, I just say "because I'm bored and I can". My mom absolutely hates this and constantly nags about monetizing it any way possible, since $$$$, but I'm rather content being middle class and TASing/play games than gaining more and more (but never satisfied).
Post subject: Re: Help exploring games
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ready Steady Yeti wrote:
But is there a way on the site to get people to help you actually beat the game to the point you want it to be beaten first, or to help you explore all the various aspects of it and glitchhunt, etc.?
If it helps, you can also use cheats during the game; just don't submit a run that does so to this site. For some games, it may be possible to find saves from sites that people have uploaded. For certain obscure games however, you might either have to beat it yourself, or use cheats (made by yourself) to help get through the game.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ready Steady Yeti wrote:
Quick question. Why are there no actual submissions on TASVideos of the completely awesome any% runs people did? I've always wondered this. Especially the 1:09 TAS?
Sup-optimal maybe? Also, there was a bug on serenia island that plagued this game for years on Dolphin. I think they finally fixed it for real last month.
Post subject: Re: State of the Current Gaming Industry
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Mitjitsu wrote:
1. Whats the point of CD's anymore? You put the game into the console and you load the contents of it onto the internal memory. Sure, it makes sense from the point of view that the game will run smoother, but if that's the case. Why not just download the game, or put onto some SD card? 2. The whole issue of patches. Yeah, I get that you want some annoying and game breaking bugs and glitches to removed from the game, but this aspect has made developers lazy by rushing unfinished products to market. It makes me wonder what's the point in even getting a game at launch if you know it's going to be unfinished. 3. Micro transactions. I understand it from a money making point of view, and especially for games which you can obtain for free on your Android, but for a game you already spent $50-60 on?
These 3 points + the massive amounts of online content nowdays makes me actually wonder how the hell will future generations play back old (this decade) games. Even if say people somehow make private servers, and somehow get all the patches/microtransaction via hacks, how will that solve the problem of multiplayer needing other people? While some popular games might have tons of people on the servers, obscure games are going to be near impossible to have an "authentic" multiplayer experience :|
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Anty-Lemon wrote:
How about using Cheat Engine's pointer scan?
iirc, it works, but it finds the addresses in terms of the computer you're using. I know there's a method for Dolphin to find out the region, but I never actually tried on CE to find an in game pointer like this. Please try and see if it works; ie find the pointer for the in game pointer (B3D8) using only pointer scan.
Post subject: Guide to finding a specific type of pointer
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Every now and then, there are games where the address for important variables such as the player's position change through out the game. This can be frustrating refinding them over and over, so here's a guide on how to keep track of it, but only for a specific situation: the game only points immediately to the address, rather than having multiple pointers with no extra operations needed. 1. Find out where the address location to change First, find out where/what causes the address for what you need to change locations. For example, in the GBA game Monster House, it changes on reset, and when you enter another floor. 2. Find addresses before, and after a change Say, if the player's X/Y address is at 02E1E8. After moving to another location, it moves to 02FF48. Note both the addresses down, and keep a small list of address locations for every time it changes. 3. Make savestates corresponding to step 2. Since some games don't follow a order or offset, you may have to make a different savestate for each time it moves. This will be used during RAM Search. 4. Loading the first savestate, open RAM Search Most likely, it will be in the same memory region as the roaming address, so say if the postions are located in ERWAM, then search EWRAM. Start by searching for a 4 byte Hex value greater than 0. You should get a large list of things like this Load the next savestate, and take a note of where the address hopped to. For example, using the watch list from above: Savestate 2's X address is 02FF48 and Savestate 1's X address is 02E1E8. With that in mind, 02FF48 is greater than 02E1E8, so set the comparison operator to "Greater than" the previous value, and search again. The list should now be smaller. Note if the X address ends in a "smaller" location compared to the first scan, say 02BFB8 when your first scan the address was at 02F120, then select "Less than" the previous value! Don't blindly follow this guide and search "Greater than" regardless of the address's change! 5. Narrowing down the options 2 cases: If using BizHawk: Given the memory region, find out what "number" it maps to. For example, the IWRAM/EWRAM, according to http://problemkaputt.de/gbatek.htm#gbamemorymap, is at 0x02000000. Now at the RAM Search, for specific value, search greater than the what the memory map says. In this case, 02000000. If using another emulator: There are no memory regions, so instead look at the first 2 digits of the address you're looking for. In the case I used, if using VBA, it should look like 0202E1E8. 02 being the first 2 digits. Now at the RAM Search, for specific value, search greater than the first 2 digits appended by 6 zeros. In this example, it will be 02000000 Yea, this was on DeSmuME instead, and for a different game, but this trick works regardless. Sorry. In both cases, it should make the list drop a lot. Without doing anything else, immediately set the first 2 digits higher by 1, and search less than the previous value. Here's an example: Once again, do not blindly follow the example; if the memory region for some reason was at a different place, like 04000000 for instance, search "greater than" 04000000 and then less than "05000000" rather than the numbers I use! If there is still a large number of addresses left, do not worry. Load the next save state, and search greater than "<memory>"/less than <"memory region number +1">. After a while, you should get a smaller list below 100. 6. Note what your current address location is and compare it with the remaining entries See which value is closest to the address's location. If using BizHawk, subtract the value you see by 0x02000000. Example: 7. Confirming those are related Take note of the addresses you found closest to the current address. Without searching for anything else, load another savestate which addresses in a different location. Look at RAM Search and see if the addresses you noted down also change to a relatively close location. In my case for example, loading a savestate where the X address is at 286C4 in BizHawk causes the suspected pointer, B3D8, to have a value of 020286B0. That is basically the X address (subtracted by 02000000) offset by +0x14. Loading another savestate where the address is at 02FF48 (in BizHawk), causes B3D8 to have a value of 0202FF34, which is still the x address (subtract 02000000 since BizHawk) offset by +0x14. In other words, they are very likely related, and B3D8 is most likely a pointer that allows you to easily refind X no matter the floor. I personally tried this on 4 different games (Over the Hedge (DS), Monster House (GBA), Harry Potter: Prisoner of Azkaban (GBA) and Scooby-Doo! - Mystery Mayhem (GBA)); made by different game companies and on different consoles and this trick worked out. I hope this helps someone, since as far as I know, there's no automated pointer scan for emulators outside 3rd party programs like Cheat Engine.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Just a request, but can these 2 boxes: Please allow higher values than 0xFF/255? It works nicely for small values, but for 4 byte numbers it's far too small.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Really really late, but I believe I found the pointer to the player's x/y position: B3D8 B530 Both in EWRAM. If using BizHawk, read one of the address, then subtract that value by 0x02000000 and make the memory region also be for EWRAM. If using VBA, simply read it again. Offset by +0x14 to get X, and +0x18 for Y. The lua script used an address that "mirrors" the X/Y to an extent, but changing it will not affect your position, and fails during OoB. This pointer allows you to change X/Y for testing purposes, and also works OoB. :) ccfc - dialogue box? 2e78 - no idea; softlocks when changed and frozed
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
jlun2 wrote:
First stage done. The reason I used (EU) rom is because I can't seem to find a (U) version that doesn't freeze on the emulator. Anyways, movement is usually allowed every other frame, with some slight changes every now and then. Addresses annoyingly change locations every stage, so I have to refind them over and over unless the pointer(s) are found.
I think I found how the addresses move around. Sorta. The pointers seems to be 02161DB4, 021625C4 The first one works fine on reset and garden areas, but glitches badly in certain spots + if you have more than 1 character at a time. The second pointer does not seem to always work, but it changes to another character only if you swap, unlike the first address. I tried to make it not update falsely, but I haven't managed yet. At least no more needing to refind addresses. Download display.lua
Language: lua

--pointer may be 02161DB4, 02161DB8, 021625C4 --first one works shit when on certain stages, but works fine-ish elsewise --second is wonky on reset and garden areas local pointer1 = 0x21625C4 local pointer2 = 0x2161DB4 local pointer3 = 0x2161DB8 --Declarations here player = {direction = 0, x = 0, y = 0, z = 0, speed = 0, run = 0, cooldown = 0} --first pointer names = {[0x211E66C] = "RJ", [0x211EE94] = "Verne", [0x211CE70] = "Hammy"} --[[the following offsets from above, in hex ptr + 0x18 = direction ptr + 0x30 = x ptr + 0x34 = y ptr + 0x38 = z ptr + 0x84 = speed ptr + 0x460 = Hammy run ptr + 0x464 = Hammy run cooldown The pointer should point to an address 0x18 before the direction address. That address should be the following: 211E66C - RJ 211EE94 - Verne 211CE70 - Hammy Anything else then something is wrong. 0212BE48,02131B3C determines what char you are 1 Verne, 2 RJ, 3 Hammy ]]-- --both for single player; just sanity test function update(state, pointer) --Results from reading the pointer; this should be a value that when read again, should point to the character local ptr = pointer if (state == p1) then player.direction = memory.readlongsigned(ptr + 0x18) player.x = memory.readlongsigned(ptr+0x30) player.y = memory.readlongsigned(ptr + 0x34) player.z = memory.readlongsigned(ptr + 0x38) player.speed = memory.readlongsigned(ptr + 0x84) player.run = memory.readlongsigned(ptr + 0x460) player.cooldown = memory.readlongsigned(ptr + 0x464) end if (state == p2) then player.direction = memory.readlongsigned(ptr + 0x18) player.x = memory.readlongsigned(ptr + 0x30) player.y = memory.readlongsigned(ptr + 0x34) player.z = memory.readlongsigned(ptr + 0x38) player.speed = memory.readlongsigned(ptr + 0x84) player.run = memory.readlongsigned(ptr + 0x460) player.cooldown = memory.readlongsigned(ptr + 0x464) end if (state == p3) then player.direction = memory.readlongsigned(ptr + 0x18) player.x = memory.readlongsigned(ptr + 0x30) player.y = memory.readlongsigned(ptr + 0x34) player.z = memory.readlongsigned(ptr + 0x38) player.speed = memory.readlongsigned(ptr + 0x84) player.run = memory.readlongsigned(ptr + 0x460) player.cooldown = memory.readlongsigned(ptr + 0x464) else player1 = {direction = 0, x = 0, y = 0, z = 0, speed = 0, run = 0} end end function fn() local ptr1 = memory.readlongsigned(pointer1) local ptr2 = memory.readlongsigned(pointer2) local ptr3 = memory.readlongsigned(pointer3) local char = memory.readlongsigned(0x212BE48) --Testing if it points to char if (memory.readlongsigned(ptr1) == 0x211E66C and char == 2) or (memory.readlongsigned(ptr1) == 0x211EE94 and char == 1) or (memory.readlongunsigned(ptr1) == 0x211CE70 and char == 3) then update(p1,ptr1) gui.drawtext(0,60,"p1") end if (memory.readlongsigned(ptr2) == 0x211E66C and char == 2) or (memory.readlongsigned(ptr2) == 0x211EE94 and char == 1) or (memory.readlongunsigned(ptr2) == 0x211CE70 and char == 3) then update(p2,ptr2) gui.drawtext(10,60,"p2") end if (memory.readlongsigned(ptr3) == 0x211E66C and char == 2) or (memory.readlongsigned(ptr3) == 0x211EE94 and char == 1) or (memory.readlongunsigned(ptr3) == 0x211CE70 and char == 3) then update(p3,ptr3) gui.drawtext(20,60,"p3") else end gui.drawtext(0,0,"Player: ("..string.format('%.6f',player.x/65536.0)..","..string.format('%.6f',player.y/65536.0)..","..string.format('%.6f',player.z/65536.0)..")\nDirection:"..string.format('%.6f',player.direction/65536.0).."Speed:"..string.format('%.6f',player.speed/65536.0*100)) --debug; ptr# + ofset for x/y/z; "ptr result" is pointer -> ptr -> character things gui.drawtext(0,30,"Ptr1: "..string.format('%.8x',ptr1).." "..(names[memory.readlongsigned(ptr1)] ~= nil and names[memory.readlongsigned(ptr1)] or ' ')) gui.drawtext(0,40,"Ptr2: "..string.format('%.8x',ptr2).." "..(names[memory.readlongsigned(ptr2)] ~= nil and names[memory.readlongsigned(ptr2)] or ' ')) gui.drawtext(0,50,"Ptr3: "..string.format('%.8x',ptr3).." "..(names[memory.readlongsigned(ptr3)] ~= nil and names[memory.readlongsigned(ptr3)] or ' ')) gui.drawtext(0,70,"Frame: "..movie.framecount()+18) gui.drawtext(0,80,"Run: "..player.run.."("..player.cooldown..")") end gui.register(fn)
Edit: Rewrote the code to make use of 0212BE48 which determines what character you're using to prevent using the wrong pointer.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm not sure if this is the right place to post, but the game Star Wars: The Empire Strikes Back seems to not exactly...work. Disregarding the black bars on the side of the screen, on BizHawk 1.11.6, pressing any of the buttons do not move the ship whatsoever. Given there's only 1 button on the controller I'm not sure what I'm doing wrong. Is it the emulator's fault or the game?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Can the submission text please be expanded on? It makes it sound like a "simple" game that warrants no comment despite taking 2 years plus 2/3 authors to create. I'm really curious why/how. :P
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
How? :o Also, that looks nothing like the original method; no double jump or yoshi spawning. Does that mean it's not (J) exclusive?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Not sure if it's related but: Post #408697
If it is just a menu function that does not require cheats, passwords or unlocks, then yes, it can be used for a run. This would go for both that run and this submission. At the end of the day, skipping levels like this is a game feature, so can be used to make runs faster. I also think it's similar to e.g. skipping tutorial levels. By the way, the quoted rule has been rewritten so as to hopefully be less ambiguous now.
Context sounds like what you just described. If I'm wrong please ignore this.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
http://tasvideos.org/userfiles/info/31198309127519214 In almost every room, there's a short preview of the area. Turns out moving before the preview cost 18 frames. I'm going to go scream for a bit. :)
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Try contacting feos; he seems to know how to fix some bugs that were posted before. He posted a version of BizHawk here.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Mothrayas wrote:
If the only thing that would change is the encode, and not any of the run input, there's no reason to update the movie file. Just keep the movie file the way it was originally submitted and published, for authenticity reasons.
Maybe a mirror/alt link? I know older versions of BizHawk is now mirrored on this site, but having a file that works with newer versions without needing to convert would be nice.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
With all these new discoveries, I'm curious. How fast would a 100% be with everything known used so far? :o Also congrats on finishing it! I'm surprised you managed to do this over and over. 0_o
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
sack_bot wrote:
Well, given that FMVs are going to have copyright claims and that they're not where the gameplay is ... I would, in that situation make it myself and note that the FMV is messed up
Yea, I think that happened with the Resident Evil 4 TAS. Just make a note of it saying FMV not included due to graphic error/copyright.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
StarrlightSims wrote:
So essentially the entire battle is determined before it even starts?
Seems like it. Also I found out that the battle ID's also change between locations; by the time I get to the train the addresses are different. I suspect the RNG (havent found yet) may be like that too, but I'm not sure.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Not sure if it is just me but on BizHawk 1.11.6 I loaded this watch file
SystemID GBA
0328E0	w	h	0	Combined WRAM	
032928	w	h	0	Combined WRAM	
032970	w	h	0	Combined WRAM	
0329B8	w	h	0	Combined WRAM	
032A00	w	h	0	Combined WRAM	
0	S	_	1		
01E610	w	h	0	Combined WRAM	
01E658	w	h	0	Combined WRAM	
01E6A0	w	h	0	Combined WRAM	
then pressed control R to reset the core. It then crashed and gave me this error:
System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at BizHawk.Client.Common.WatchList.<>c__DisplayClass4.<RefreshDomains>b__3(Watch watch)
   at System.Threading.Tasks.Parallel.<>c__DisplayClass31_0`2.<ForEachWorker>b__0(Int32 i)
   at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
   at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object )
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IList`1 list, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, Action`1 body)
   at BizHawk.Client.Common.WatchList.RefreshDomains(IMemoryDomains core)
   at BizHawk.Client.EmuHawk.RamWatch.Restart()
   at BizHawk.Client.EmuHawk.ToolManager.Restart()
   at BizHawk.Client.EmuHawk.MainForm.LoadRom(String path, LoadRomArgs args)
   at BizHawk.Client.EmuHawk.MainForm.RebootCore()
   at BizHawk.Client.EmuHawk.MainForm.CheckHotkey(String trigger)
   at BizHawk.Client.EmuHawk.MainForm.<ProcessInput>b__1d(Boolean current, String trigger)
   at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable`1 source, TAccumulate seed, Func`3 func)
   at BizHawk.Client.EmuHawk.MainForm.ProcessInput()
   at BizHawk.Client.EmuHawk.MainForm.ProgramRunLoop()
   at BizHawk.Client.EmuHawk.Program.SubMain(String[] args)
---> (Inner Exception #0) System.NullReferenceException: Object reference not set to an instance of an object.
   at BizHawk.Client.Common.WatchList.<>c__DisplayClass4.<RefreshDomains>b__3(Watch watch)
   at System.Threading.Tasks.Parallel.<>c__DisplayClass31_0`2.<ForEachWorker>b__0(Int32 i)
   at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
   at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object )<---
I narrowed it down, and it seems to do this whenever I use a separator for the watch file. This is the mgba core, if it's relevant.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Hey, instead of talking about games in a series that might be different in some way, how about make some rough run of them? I never played a single (EA) sports game, so for all I know they're literally the same with different characters. An example would help visualize.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ok, from what I gathered, the damage is "set" based on what you do; say casting Flippendo causes a rat to miss on their turn. Well, no matter how much delay you add before you use flippendo, that attack will still cause the rat to miss. Same with other spell/action outcomes. I haven't figured out the RNG yet, but I suspect it may be possible to delay before a battle starts (manipulate everything before hand). Also this has nothing much to do with the run, but apparently 003340 in Combined Wram is dialogue/spell text. Just posting that in case it is ever need it. Edit: 04339C 0433B8 Both in Combined WRAM. No idea what it does, but freezing them makes your partner suddenly walk off the screen. Battle Addresses - 2 bytes Combined Wram 0328E0 - First turn's ID 032928 - Second turn's ID 032970 - Third turn's ID 0329B8 - Fourth turn's ID 032A00 - Fifth turn's ID It's not the RNG, but at least using these addresses it would help immediately knowing what the order is. Casting Informas using cheats for example: