Post subject: Narnia: Lion, Witch, and Wardrobe (TASing help needed!)
Editor, Player (123)
Joined: 8/3/2014
Posts: 204
Location: USA
I didn't write the full title of the game in the title of this topic, because 1.) the "Subject" parameter does not even allow that many characters, and 2.) The title is SO FREAKING long. The full game title is The Chronicles of Narnia: The Lion, the Witch, and the Wardrobe. While I already know a lot about this game, and have been planning its routing for over a year now, I am asking someone knowledgable in RNG manipulation to help me with this TAS. I really badly want to TAS the game. If you're interested in Narnia, overworld action games, heavy luck manipulation, etc., please help. I've been working very hard for this game so that I can TAS it. I made a sloppy test TAS with just over 500 rerecords and I got 44:17. You can view that http://tasvideos.org/userfiles/info/42570076708006142 here. That's around 4 minutes faster than any non-TAS I've ever done on (approximately) the same route. The game is an overworld action based on the movie that came out around the time this game was released. That movie is itself based on the book made in 1950s, which is part of the Narnia series written by C.S. Lewis. It's quite likely that most people here have seen or at least heard of the series of children's books or any of the movies, as they're quite well-known. This game, however, is only really sought-after because it's based on such a famous fictional universe. I think, however, that it's actually a pretty decent game. This title was also released for other consoles, but TRUST ME, the GBA version is completely different from any of those. I mean, those are entirely different games. The GBA game has never been speedran or TASed by anyone, which I was kind of surprised by. So, currently, that sloppy TAS record, 44:17, is the TAS world record I guess, but obviously the goal would be to beat that in an optimal TAS. The main complications in this TAS would be glitch-hunting (assuming there are more glitches that haven't been found already), heavy RNG manipulation, and (in some portions of the run) heavy lag manipulation. To specify about the RNG: Most of the RNG manipulation in this run will go towards getting all these enemies out of our way in order to save the most time, so it will be quite pacifist compared to normal play (normal play which encourages battle with enemies). Depending on the extent to how much we can manipulate, it might be necessary to do some battling with the AIs, because, from what I've seen (with savestates), sometimes you have to do some work to move out of their way, and that can be simplified by a simple hit. Preferably, though, the RNG will end up in our favor because of quality manipulation, and we won't have to do much maneuvering around to get to where we need to go. The time when this will be most difficult is in the later levels. And I'm serious about those later levels! In casual play, it gets so annoying how enemies will just gang up on you and you can barely do anything to fight them off or move at all after that. When I do the last level in that test run, you can see one instance where that pretty much occurs out of my control. And that was the BEST I could get after like 10 minutes of trying to manipulate that one scene. The second application of RNG would be in the battles. There are quite a few boss battles in this game actually, but besides that there are some instances where you have to kill certain enemies in order to move on in the game (such as in Chapter 1, where the Faun and Lucy encounter those 4 enemies so you can learn how to battle). The enemies'/bosses' movements would have to be manipulated in order to best advantage the player. The third application of RNG in this run would be to take control of the companion AIs (which are usually the other siblings) in some instances of the run. As you can see in the test run, in Chapter 4, I was able to make Susan, a companion AI, collect a match, which I need to have by the beginning of Chapter 5, while I was just normally heading toward the end of the room. Companions can also possibly be manipulated to help fight boss battles and required-to-defeat enemies, and to defeat enemies to get them out of the player's way. Later in the run, Lucy can do a power to heal herself, other companions, or you. If damage routing is ever necessary (which it probably won't be), Lucy could be manipulated to heal the player when necessary. The fourth notable RNG factor in the game is item drops. When you break a crystal or other breakable object, RNG decides whether or not it will drop an item, and if it drops an item, it has to decide which item it will drop. The final main application of RNG would be to manipulate enemy hits on the player in certain instances. I've seen in many instances of playing the game that getting hit by enemies can sometimes allow you to clip between certain objects that you could not otherwise clip through, which could save time, which leads me to: Chapter 3 slope skip glitch theory I also have a theory of a glitch that could save time in level 3. https://www.youtube.com/watch?v=MzHw5WdpePs There are a FEW slopes in the game of this sort; this one, one in Chapter 4 that's out of the way of the run, and one in Level 3 where the heirloom you have to get for the squirrel is. You can go up the slopes partially, but then it usually slides you back down it. There are a few ways to restart your momentum on the slope while you're on it though, which can cause you to sometimes go even higher than before. One way to restart player momentum is the way demonstrated in the video, with the Aslan's Song nobility, which stops you and puts you in that animation, which is hence the reason for the momentum restart. That's a much easier method. Unfortunately, Aslan's Song is not unlocked yet when we need it for the heirloom. In fact, getting the heirloom is what you need to do RIGHT BEFORE Aslan's Song is unlocked. Unfortunate...unfortunate indeed... However, there is a "viking" enemy nearby, who has a bow-and-arrow he can shoot, and tends to do so when the player or a companion he aims at is far away (otherwise he uses his sword). Getting hit by enemies also restarts momentum, but it's MUCH harder to do, and I haven't even confirmed that it can be done enough to get up an entire slope at all. The viking would have to hit the player around 3 times (maybe more) in order for this glitch to work I think. It'd have to be pretty damn lucky. What makes it even harder is that the companion AI have to be manipulated SO much as not to hit or kill the viking. I haven't been able to do this yet, even when I try to make them busy with other enemies in the level. In order to make this glitch work, it has to be very well planned, but it's possible that the glitch is impossible as well. Using the hardest difficulty up to that point might solve that problem, making the viking harder to beat up and it may possibly be easier to manipulate him to hit the player. (I haven't messed with harder difficulties than the default Easy yet, but I will eventually.) EDIT: The above text is not a reliable hypothesis. There are two enemies that look the same that appear to me like "vikings"; one shoots arrows, and one uses swords to attack. Though they look exactly the same, they're two completely different enemies. According to recent RAM searching research, they even have different HPs. A sword viking can't shoot arrows. The viking I was referring to in the above scratched text is a sword viking, so it'd be useless to try and use him to get up the slope. Finishing up the RNG explanation... It's hard to really tell what is deciding where the enemies in this game move or how they decide what their various actions will be, but it seems from the naked eye that they decide based on the movements of the player and the movements of the companion AIs. Whatever the formula is, it clearly has some complexity, and will take a while to fully dissect. The movements of the companion AIs are very clearly based on both the player's movements and on any nearby enemy AIs that they have to fight. It's sort of unclear to me what the deciding factor is in terms of the item drops from breakable objects. Lag manipulation There's a lot of lag that occurs in areas of the game with a ton of enemies trying to do things all at once. This may be able to be manipulated, but I haven't tested with the specific instances yet. Glitches There are certain glitches in this game, a lot of which at this point are fairly minor skips but are still skips nonetheless. They add up, anyway. Some of the stacks of crystals and rocks and stuff in the game are poorly placed, so you can walk right between them in many instances, which is unexpected to the developers who intended you to break them to get them out of your way. You see some of that in my test TAS, but there are many more spots you can do squeeze-through glitches. Those will be addressed per situation. In regards to the squeezing through stuff, I also mentioned above when discussing enemy RNG that sometimes enemy hits can help push you between stuff that you'd otherwise not be able to crawl through, which could save time in some instances. There's a glitch at the beginning of Chapter 8 (the one with Edmund in the jail cell), that I use in the test run as well, where you can move the rock earlier than intended. This also causes Edmund's movements during the text and cutscene to screw up, making Edmund walk through the jail cell one time. That's...obviously weird in terms of the storyline. I have to give special thanks to AKheon for finding a glitch which I hadn't even anticipated before for some odd reason. If you press Select right before some non-movement-forcing text, (after slowly being taken into the Select menu and exiting it) you can skip ever having to see that text sequence and just move on. If you press Select before a forced movement, though, the game goes into a softlock. There are certain instances where you can't press Select at all, though. You can't press Select until about 1 second of being able to freely move in a room or level, so you can't do this to, for instance, skip the bunch of text at the beginning of Chapter 8. There are going to be some parts of the run where the Select screen saves time, but few compared to the times it doesn't, since going through that menu is quite slow. Here is a playlist of other glitches for the game that will probably not be useful for the TAS: https://www.youtube.com/playlist?list=PLoZMw6e_YIFGlsZLF3rme3lBMpCaEFrCT One of the glitches in this playlist is yet another Select menu glitch, but this has to do with the wrong music playing, so not relevant to a TAS, but it still shows that the Select menu sequence was clearly not tested very well. Of course, there are probably more glitches in this quite extensive game to find. RAM addresses Searching for RAM addresses is helping me to understand the game better than I understood it before. http://tasvideos.org/userfiles/info/42656154991025618 Here is a RAM watch I made that defines a lot of important values in the game. I think it's important to mention that you and your companions' HPs are determined on a per-character basis. You and your companions all have the same HP. What I used to think was the x and y positions of the player are actually the x and y positions of the CAMERA. That's also useful to know for testing, but I didn't get around to finding values for the x and y positions of the characters yet. Will update when I do. The first RAM mentioned in the watch is the value that determines which mode the game will be in. 1 is the regular mode, for just gameplay, 5 is text (don't poke it to this, it'll freeze the game every time!), and other values will put the game in other modes, like the beginning splash screen, and the multiplayer screen, and the options screen, etc. If you poke it to 129, it will reset the level you're in, which happens when you die. It's not really that useful for TASing, but it can be fun to play with. It does NOT define specific rooms you're in or specific levels either. I also want to mention that there are apparently two possible run categories for this game. You can complete the game normally, obviously, which would be any%; completing the game up to the ending credits at the end of Chapter 17. The second category would be to collect all of "Tumnus' lost items". There are apparently 15 of them in the game, according to the Select menu screen that keeps track of them all. They're basically extra items that you collect, and they're sometimes significantly out of the way of regular play. I don't think there will be anything significant that will happen from collecting them all, but I don't know. It does satisfy the general 100% requirement of "collecting everything that would show in the menu". In other words, this would be the 100% category for this game. I tried a few times, but was never actually successful in finding all of these items. Help with that would be greatly appreciated too. I hope someone else takes interest in this game, because I do not feel I can do this alone, and I love the game.
Post subject: Soundtrack
Editor, Player (123)
Joined: 8/3/2014
Posts: 204
Location: USA
Not that this has much at all to do with TASing, but I have finally finished uploading the complete soundtrack to this game, and I'm proud of myself for doing it, since it took three days. The music in this game is really good in my opinion. https://www.youtube.com/playlist?list=PLoZMw6e_YIFHLAN-v-Xlh5gjui8YUSKOF This is the playlist. Enjoy!
Skilled player (1742)
Joined: 9/17/2009
Posts: 4986
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I made a very rough script, to display at the very least Lucy's actual X/Y position, rather than graphical one: Download narnia display.lua
Language: lua

memory.usememorydomain("Combined WRAM") local Lucy = {ptr = 0x0458B0, x = 0, y = 0} function update(address) local pointer = memory.read_u32_le(address) if pointer > 0x2000000 and pointer < 0x4000000 then return pointer-0x2000000 --Minus (0x2000000) since BizHawk memory domains end return nill end while true do local pointer = update(Lucy.ptr) if pointer ~= nill then Lucy.x = memory.read_u32_le(pointer+0x28) --Address pointed by pointer + offset Lucy.y = memory.read_u32_le(pointer+0x28+0x4) --Address pointed by pointer + offset + 0x4 gui.text(0,60,"X:"..Lucy.x.." Y:"..Lucy.y) gui.text(0,75,"Lucy's X:"..bizstring.hex(pointer+0x28)) end emu.frameadvance() end
Can be expanded later to include other characters. Seems the address hops when saving and restarting. Also when saving on latter chapters, then restarting and trying old chapters. Edit: Tried playing your input file btw, and desyncs at the first snowball gathering in latest BizHawk, mgba core. Edmund's pointer for chapter 2 at least appears to be 0x042B94, and x is +0x28 just like Lucy's.
Editor, Player (123)
Joined: 8/3/2014
Posts: 204
Location: USA
Thank you, jlun2. About the movie file... The movie file mentioned above was created on Bizhawk 1.11.6, so it will sync on that emulator. Just for future reference. While I'm at it, I want to show you this glitch video I uploaded. I found this glitch long ago, and it's really not anything special, but it's just an example of how cutscenes can indeed be skipped in this game. https://www.youtube.com/watch?v=5YbfiDy2jxc
Skilled player (1742)
Joined: 9/17/2009
Posts: 4986
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Minor glitches: 1. If you had 1 HP left, and triggered a cutscene at the same time as getting hit, you can walk around with 0 HP. You'll die the next hit however. Pressing start doesn't seem to work. 2. Pressing select slightly before the "item obtained" screen skips the screen, and you still get the item. Pressing start doesn't seem to work. Can be used to skip other similar popups such as Narnia essence. 3. Pressing select before a cutscene seems to freeze the game. Pressing start doesn't seem to work. 4. Some dialogue can be skipped by pressing select before it occurs, such as the one after defeating all NPCs in Ch. 4 5. Can't skip the beaver introduction in Ch. 3; the exit outside the cabin won't work even if you use cheats to reach it. You CAN however skip the dialogue pushing the rock there if you somehow mananged to clip through it. 6. Ch. 3 squirrel cutscene is sorta skippable (using cheats tho). You can then grab the acorn and return. You can also skip the log after helping. 7. Ch. 7 wolf stalling with the beaver can be skipped if you used cheats to get down the ramp. The ice ramp exit at the beginning won't work however so you still have to go a circle. Sadly this does not trigger the chapter end, so you still have to wait. Also I made this to speed up testing: Download Narnia.lua
Language: lua

memory.usememorydomain("Combined WRAM") local Lucy = {ptr = 0x0458B0, x = 0, y = 0, xAddress} local Edmund = {ptr = 0x042B94, x = 0, y = 0, xAddress} local Peter = {ptr = 0x042BA0, x = 0, y = 0, xAddress} function update(name) local pointer = 0 if (name == "Lucy") then pointer = memory.read_s32_le(Lucy.ptr) - 0x02000000 if pointer > 0x0000000 and pointer <0x2000000> 0x0000000 and pointer <0x2000000> 0x0000000 and pointer <0x2000000> 0) do emu.frameadvance() delay = delay -1 end start = true return start end return start end local cur_char local index = 1 while true do local x local y local speed = 10 local char_array = {[0] = Lucy, [1] = Edmund, [2] = Peter} update("Lucy") update("Edmund") update("Peter") if inputdelay("C",10) then index = (index+1)%3 end cur_char = char_array[index] if (joypad.getimmediate().L == true) then if (joypad.getimmediate().Left == true) then x = cur_char.x-65536*speed elseif (joypad.getimmediate().Right == true) then x = cur_char.x+65536*speed else x = cur_char.x end if (joypad.getimmediate().Down == true) then y = cur_char.y+65536*speed elseif (joypad.getimmediate().Up == true) then y = cur_char.y-65536*speed else y = cur_char.y end memory.write_u32_le(cur_char.xAddress,x) memory.write_u32_le(cur_char.xAddress+0x4,y) end --gui.text(0,60,"Lucy X:"..Lucy.x.." Y:"..Lucy.y.." Add "..bizstring.hex(Lucy.xAddress)) --gui.text(0,75,"Ed X:"..Edmund.x.." Y:"..Edmund.y.." Add "..bizstring.hex(Edmund.xAddress)) --gui.text(0,90,"Peter X:"..Peter.x.." Y:"..Peter.y.." Add "..bizstring.hex(Peter.xAddress)) gui.text(0,105,"Cur:"..index) --gui.text(0,75,"Ed's X:"..bizstring.hex(edmund_pointer+0x28)) emu.frameadvance() end
Holding L and move to zoom all over the place. Change "Speed = 3" to something else to make it run faster. Edit: Added Peter. Right now, the default index value of 1 seems to always work with the current character. Occasionally, changing index allows other characters to be controlled, but often that's not useful.