Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Darn it, I can't wait for the Multi-track rerecording anymore! I want it now!
... You know, why not now? I tried crafting up a lua script to do just that!
--------
EDIT: Just pretend I had this awesome script here. Removed so this site uses a little less bandwidth. The particular script that was here is outdated anyway!
--------
I put it up to a stress test of sorts: I ran a copy of my current progress through Salamander. The whole movie, roughly 10000 frames, as it stands. After the read-only finished, I restarted the whole thing in read+write mode. The script played back the entire movie without any desync.
It's still a prototype. Needs more comments in the code to help people to read some of it, displaying the input could be handled differently, and so forth.
... Man, it was quite a feeling I got when I finally got multi-track rerecording done through lua. If there's anything that shouldn't work in there, well too bad, it's working anyway. At least, on my end.
I offer what I got so far, as seen by that huge, white blot with words and symbols in the same post, and ask for how I should go about improving it.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
local t= {} -- Cool! A table!
t["A"]= false -- Somebody set us up the bomb
joypad.set(1, t) -- After excecution, "A" is stuck at false
For whatever reason, when I set a button to false, that button is forever stuck. I set it to true, nothing. I stop controlling the button, and the player still can't press the button. I end the script, and the button is still stuck. In fact, there's only two ways to get the button unstuck.
The above code, a mere three lines, should display the problem well. As far as I can tell, only one button at a time may be stuck like this. One of the ways to get a button unstuck is, implied by the previous sentence, is to get another button stuck. In any case, sending joypad.set a table with multiple false values will only make one button stuck.
The other way to unstuck the glitched button is to completely close down FCEUX. Thankfully, it doesn't persist beyond that. It persists beyond the script, that much is certain.
Setting true and nil seems to be fine, though. Just something odd I found out with false.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
adelikat wrote:
I can't make this one happen. Perhaps I could have the .fm2 in question?
Mind if I use Microstorage for that?
Should be seen when you select "Play Movie..." and the first one that shows up is this one. If it isn't, back out, remove some files from the folder it defaults to, and check again. Make certain that, when the window appears, it picks this one out of the list.
Better yet, whatever the default directory you're using, make sure the only movie file in there is that apparently affected one. That way, it has no choice but to pick the file in question. Should say Soft-Reset, but if you use that pull-down and select the same movie, it'll fix itself to read Savestate.
That's what I'm seeing, anyway. If it doesn't work that way for you, I really have no explanation why what I see is different from what you see.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Few subtle things I notice with 2.1.1:
- When selecting "Play Movie...", if it defaults to a movie that begins from a savestate, it claims that it begins from soft-reset. When selecting a movie yourself, it correctly displays savestate, and playing the movie when the information still displays soft-reset will begin the movie as normal. Appears to be a display error.
- Any new movies created with 2.1.1 will be displayed as being made from "FCEUX 2.01.00" from the "Play Movie..." window. Forgot to change a digit?
- The same Memory Watch bug I pointed out earlier appears to still be in effect, even though Adelikat thought the problem is gone. At least, the problem still exists on this computer. Unzipped into an entirely new folder, so none of the earlier configurations should interfere. It seems to be caused by the second address box in the second column when you put five characters in it and is recognized as a number. X0062 is five characters, and is recognized as a number, for example.
Only problems I recognize seem minor. I ask for confirmation of said errors so I don't think I'm insane or the world does everything to make things fail on me alone.
After an extended length of time waiting, half a minute at least, I'm hit with this message. It happens often enough that it gets quite difficult to see much of what's going on at the forums.
I often enough lurk without being logged on, so I'm not quite sure if the problem works the same way with our without this status. In any case, things are extra slow for a while when trying to view the forums.
The main site appears to be fine, however. You know, any page without /forum in the address box.
Strange... Works fine here. I copied and pasted the entire three segments into a new file and that works without problems.
Made more strange considering I'm using x and y on a previous statement, here:
if getwall(PosTile(plX+x*plS , plY+y*plS)) == 0 then
If it fails on the drawbox because of x or y, then it should have failed earlier, when I make the call to PosTile.
Additionally, the for loops use x and y. The drawbox is within the for loops. This just adds further questions. Why is it failing on you, and not me? Why that statement, and not the previous one that uses some of the same values?
Basically, to get it to work on your script (script), simply change (script) to [a function, and call it through gui.register().]
I was thinking about testing a few of my own ideas, but after you said this, I tried it and it works. Thanks. I made sure to keep the main while loop and frame advance outside the newly made function. Should be easier to spot where I can safely go without first crashing into things now.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I think I just added some convenience for when I try to continue.
First, I cleaned up my getwall a little...
function getwall(tx, ty) -- Expects input by tile
-- Returns a number from 0 to 3, identifying collision data for given tile
-- 0 is open space, 1 is solid wall, 2 and 3 are types of destructible
-- Has knowledge of location and range of wall array.
addr = 0x6000
tx = tx%64
ty = ty%30
if tx > 31 then -- horizontal scroll uses two different arrays
tx = tx - 32
addr = addr + 0x100
end
addr = addr + math.floor( tx/4 ) + ty*8
return AND( 3 * 4^(tx%4) , memory.readbyte(addr) ) /4^( tx%4 )
end -- Bitmask Target Byte RightShift
Next, I created another function...
function PosTile(px, py) -- Expects input by pixel
-- Returns the tile position for given screen coordinates.
-- Keep in mind in vertical scrollers, ty is often negative.
-- Has knowledge of scrolling type and stage position
sp = memory.readbyte(0x0044)
if memory.readbyte(0x0041) == 0 then -- horizontal scrolling
sp = sp + memory.readbyte(0x0045)*256
tx = math.floor( (px+sp)/8 )
ty = math.floor( py /8 )+4
return tx, ty
elseif memory.readbyte(0x0041) == 1 then -- vertical scrolling
sp = sp + memory.readbyte(0x0045)*240
tx = math.floor( px /8 )
ty = math.floor( (py-sp)/8 )
return tx, ty
end
return "nil" -- It shouldn't fall out to here.
end
Then I did stuff with them:
while true do
for pl=0, 1 do
plX = memory.readbyte(0x035C+pl) + memory.readbyte(0x0064+pl)/256
plY = memory.readbyte(0x0337+pl) + memory.readbyte(0x0062+pl)/256
plS = memory.readbyte(0x0070+pl)/4 + 1.25
for x=-2, 2 do
for y=-2, 2 do
if getwall(PosTile(plX+x*plS , plY+y*plS)) == 0 then
color="green"
else
color="red"
end
gui.drawbox(187+x*4+pl*28, 215+y*4, 189+x*4+pl*28, 217+y*4, color)
end
end
end
FCEU.frameadvance()
end
I have my own personal terrain radar. It tells me if I were to move 1 or 2 frames in some direction, whether my position will intersect with a wall. We can adjust a few values to change scanning radius or where the boxes are located.
I see something about that gui.register() function. I'm wondering how it is to be used... Having the small green/red boxes show up when it's important and not a frame after it's importance should help things a bit.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Dromiceius wrote:
There are, in fact, no bitwise operators. Lua itself doesn't even have AND, OR, etc. DeHackEd added those to Snes9x himself, and it wouldn't be difficult to add shift functions.
It's simple enough to shift stuff around with 2^n, multiplying or dividing for whatever the case may be. Just a few more characters I have to type. I can understand why there are no bitwise operators for lua alone, since it doesn't use things like integers, preferring to instead exclusively use double precision floating point.
It seems to be a language less for things that needs to work with individual bits and more for just working with numbers in general. Unfortunately, manipulating bits is often a concern when dealing with quite a few games, which makes me think lua isn't the ideal language, but the bitwise functions that were added is proof enough that we can change the language a bit to fit our needs.
Dromiceius wrote:
You can use semicolons to put multiple statements on one line... possibly with some caveats.
But I was thinking about putting a single statement over multiple lines! That's certainly has some difference from putting multiple statements in a single line.
Dromiceius wrote:
If you've found where the game stores hitbox coordinates, a call to gui.drawbox() is all you need, IIRC.
Hmm... Haven't found the hitboxes. As far as terrain is considered, your ship is an infinitely small point, checking only its location to see if it overlaps with the terrain. Something clunky like a box? Nope. Which is how I'm able to fit in some tight spots, and thus draw such neat designs in my WIP. The game does use actual boxes when concerning enemies.
But different size hitboxes must exist. There are tiny bullets, decent-sized enemies, and those huge fangs. Therefore, there should be a spot in memory which tells us how big they are. The player ships also seem to have their own hitbox, but again, those particular boxes are definitely ignored on terrain.
I was thinking about drawing 8x8 squares where there are solid wall tiles. An improvement over hard-to-see pixels. But that's a fairly trivial change. That's kind of what I'm talking about when I was thinking about boxes. Definitely trivial.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
--Salamander (J), draws a single green pixel where there exists a wall.
--FatRatKnight
local sp, temp, addr, nx, ny = {}, {}, {}, {}, {}
function getwall(x, y) -- Expects input by tile, not by pixel
-- Function reads the target address. Silly numbers are clipped to within range.
addr = 0x6000
nx = x%64
ny = y%30
if nx > 31 then -- horizontal scroll uses two different arrays
nx = nx - 32
addr = addr + 0x100
end
return AND( 3 * 4^(nx%4) , memory.readbyte(addr + math.floor( nx/4 ) + ny*8) )/4^(nx%4)
-- Bitmask Calculate Address Location rightshift
end
while true do
for x=0, 31 do
for y=0, 24 do
if memory.readbyte(0x0041) == 0 then -- horizontal scrolling
sp = memory.readbyte(0x0044) + memory.readbyte(0x0045)*256
if getwall(math.floor((sp+4)/8) + x , y+4) ~= 0 then
temp = 7 - (( sp + 4 ) % 8)
gui.drawpixel(x*8+temp, y*8+4, "green")
end
elseif memory.readbyte(0x0041) == 1 then -- vertical scrolling
sp = memory.readbyte(0x0044) + memory.readbyte(0x0045)*240
if getwall( x , y - math.floor((sp+4)/8) ) ~= 0 then
temp = ( sp + 4 ) % 8
gui.drawpixel(x*8+4, y*8+temp, "green")
end
end -- if; horizontal/vertical scrolling
end -- y-loop
end -- x-loop
FCEU.frameadvance()
end
I believe this will dot up all walls successfully, until bosses show up and start scrolling around themselves. Some dots are hard to see, but at least we can recognize walls and where they are. I'm pretty sure the getwall function I made should work perfectly in other things besides drawing dots, though it lets the caller handle the stage position stuff.
Though, I got a surprise when the vertical scrolling segments has address 0x0044 go to 239 instead of 255. However, I spotted that and... Yep. Those dots aren't sliding out of their spots now.
Where's my shift operators and the ability to put single statements over multiple lines? Yeah, I'm just more used to C code. Lua feels... Unclean, somehow. But as is said in some places, it's not too hard to transition to lua if you know some programming. Then again, there's probably a few things that aren't "optimal" coding with my lack of experience in lua. Especially the variables.
I haven't experimented or searched enough to understand if it's possible to stuff local variables that only the function itself can see, or if it can affect whatever variables passed to it from the caller's point of view. It... Works, and is therefore passable, but it certainly screams for improvement.
Drawing boxes shouldn't be hard to implement, hopefully. Checking player's position to see if it would overlap with a wall would be a neat trick to do.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I imagine that the brain boss is also affected by the terrain transformation. For once, you might be able to shoot down pieces of the silly boss before it becomes "vulnerable". Though, now that I think about it, I recall in the USA version, Life Force that the second boss's central region does not have any hit-detection at all. The "arms" are still painful, but it's like it failed to load up the collision data for the terrain or something. The JPN version, Salamander has it properly loaded.
I might be wrong about the top-down scrollers taking up 0x6100 to 0x61EF. That array appears to be unused in those stages.
As far as I can tell:
0x6028 to 0x60EF and 0x6128 to 0x61EF for side-scrollers.
0x6000 to 0x60EF for top-down scrollers.
I think this little chat did help. I feel much more optimistic about things now. It'll certainly make things easier when I don't feel things are going nowhere. All that work ahead of me? Not so intimidating now. Might change once I start on it again, but I feel fine now.
I'm starting to get deeper into lua scripting. I have successfully created an array of dots that scroll along with the screen. Problem is, the dots have no significance, and will utterly fail to look good in stages 2, 4, and 6. Point is, I'm farther in lua scripts than before. I'll try creating a script that dots out where the terrain is. I'd like the practice.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Dromiceius wrote:
Well, I overwrote the entire 0x6000 0x61E9 region with zeroes, and couldn't hit the terrain anywhere in the level, including the brain at the end. Setting it to 1 would logically make every 4th tile deadly, and sure enough, I can keep the ship in a tiny invisible column of safety before being crushed against the side of the screen. Your findings seem to be correct.
The next piece of fun coding to do is to multiply each byte by 2, OR it with the original value, and AND it with 0xAA every frame. All terrain should be shot away with one shot, while the open space remains open... Theoretically. But putting in destructible terrain where there shouldn't be any... How will the game react? Probably normally, just with more destructive bullets than you thought possible.
There seems to be some spots within the range 6000 to 61E9 that aren't used. Or at least, not by the terrain. It also seems to switch between two sets of addresses, both within the range I specify. 0x6028 to 0x60EF, and 0x6128 to 0x61EF. On the other hand... There's the top-down view. That needs more width. In which case, it uses a larger range from 0x6000 to 0x60EF and 0x6100 to 0x61EF.
We might want these, too. You know, just in case we want to draw our boxes:
0x0043 - Stage sub-position
0x0044 - Stage position
0x0045 - Stage position * 256
0x0041 - 0 = side view 1 = top-down view ... I think...
0x035C - 1P X-pos 0x0064 - 1P subX
0x0337 - 1P Y-pos 0x0062 - 1P subY
0x035D - 2P X-pos 0x0065 - 2P subX
0x0338 - 2P Y-pos 0x0063 - 2P subY
0x0070 - 1P speed Each speed up is +1/4 pixel/frame
0x0071 - 2P speed At 0 speed, movement at 5/4 px/fr
Alright, so we have the arrays for the terrain, which we merely need to look at for a bit in order to align things correctly. We have the stage position. We might be able to draw neat little boxes that are accurately placed. I think we have side/top view states so we don't mix up the boxes. And if ever you want to mess around with the players, my intuition says that knowing their positions and speed are mandatory.
On a side note, I decided to skip ahead a little and pick up three Options to see what I can do with 'em. It's amazing how much you can do with 10 onscreen bullets at a time, and a bit easier than I thought it would be. I have a habit of spoiling things... In any case, this is a moment that I'm glad for editing in the input with a text editor.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Dromiceius wrote:
...Waitaminute, didn't the windows build of FCEUX already have this feature?
I'm not aware of this. I've looked through a few things, but never saw anything about it. Since I apparently can't find this, I probably would need to be pointed exactly to where it is.
Dromiceius wrote:
Can't say I've succeeded at discovering tile or collision data in RAM before, though it would be indispensable for some bots I've been meaning to write. I've already got my own set of memory search functions, so I may conjure up a custom function to detect the memory structure(s) we're interested in. That should be interesting, if not altogether useful.
Some terrain in Salamander isn't a constant, apparently. You can shoot some terrain, others just grows in, and there's plenty of constant terrain about.
In any case, I went into the Hex Editor just now and eyeballed some curious looking addresses. In the PPU Memory, I'm curious about 0x2080 and a few hundred locations after it... Very curious. Curiosity went up a bit more when I spot things changing a bit more rapidly while my ships were digging through the various terrain. Like, zeroes were popping up as some terrain got shot into pure blackness. There aren't many of those zeroes in parts where there are no black tiles.
Things got extremely curious when I overwrote a few values in those places. Like, the terrain suddenly changes. At a particular spot on the screen. Just to make sure, I piloted a ship at the spot that transformed. Clearly, by setting it to 0x00, I didn't remove the collision, merely the graphical tile used at the spot. Might be useful, but...
I took one more look. Another curious spot is, in the NES Memory, locations 0x6000 to 0x61E9. I think this is our collision detection. Each tile is packed in two-bit chunks. It does not "scroll" with the screen. Here's what I observe:
00 - Open space
01 - Solid wall
10 - Destructible (1 HP)
11 - Destructible (2 HP)
At least, that's basically what I think... May be worth screwing around with this to confirm whether or not I'm right...
Yes, I eyeballed this just looking in the Hex Editor. Which makes confirming this all the more important, as we can't openly trust intuition straight up.
Er, what is PPU Memory and how is it different from NES Memory? I'm guessing primarily graphical stuff happens in the PPU Memory...?
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
As I said, I am thinking about this run again. I'm just frustrated at how hours/days of work only pays off with 30 or so seconds of game time. It's as though everything here demands high precision the entire time... With two players. Worse yet, I may have to redo that last piece. I hated thinking about that fact while trying it out, because it means I spent hours (Yes, I mean hours) on that last bit of regenerating gunk, only to throw it away.
I don't mean to spoil the mood. It's a fair bit of precision carving I've been doing, and hopefully it will prove to be entertaining. Few would know just how to direct the regenerating gunk just right...
I put in subtitles pointing out things I want to change...
1st message: The GO I wanted to display is... Almost invisible. I'll likely try dancing differently at that spot.
2nd message: I miss the bonus like I say in the subtitle. Predict what the change will be!
3rd message: You know, I was lazy here. I really could have played with those claws, but no... I think I should change that.
4th message: Latest addition. I wasted a LOT of time after this subtitle shows up, like entire seconds, just to prove what sort of design I can make.
Well, okay. As an auto-scroller, I can't actually "waste" any time other than lag, but I could easily have danced using those seconds I wasted. And in a TAS, don't we need perfection?
I would like help. I'm not sure what sort of help I need, but without any of it... Compare the times between my last post and this one. I've been spending a fair amount of that time only to produce a small piece. Projected completion time based off that is at least years. I don't want that. Besides that, take a look at the rerecord count.
Again, I'm not sure what sort of help I need. Maybe a script that lets me know what directions I can take without blowing up on the terrain would be a start. I don't have many useful addresses, but if you need me to find something, I'll go look.
If not, I'll just temporarily abandon this project in favor of creating a few short clips of what I envision what this run should be. At least everything up to those parts wouldn't matter, as long as I have the power-ups I need.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Aw, I really want to see what you've done so far! But you don't want to spoil everything, that's fine.
So, as a compromise, how about revealing exactly one second (as defined by the in-game timer) out of each operation? That's at least 14 seconds of stuff we get to see, right there. That way, you can royally tease us while still keeping it mostly secret.
Just a suggestion. Act however you like with it. I'm not really much familiar with this game (never played it), and I'm still anticipating this run.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
My advice: Make a test run, and try to follow the route without bothering to optimize things. Use savestates just in case you mess up bad enough, and slow things down if certain parts need precision. If you can't get through it at all, even when going frame by frame on the trouble part, you might need to check a few things in your route. Would be a pain if you try "for real" and didn't anticipate the trouble spot.
After you confirm that it is possible, then make a real run, using the newly-gained knowledge of what to do.
I was hoping for something more than just spawning whatever arbitrary items you feel like, such as pinpoint teleportation to the exact spots you need to be, having events done for you, or glitching away obstacles. Then again, if the glitch can't do that precisely enough, I should be glad that we can use the glitch at all. Having spare Vortex Cubes in your back pocket is certainly a good thing.
One question, though. Can you just transfer items from your party to one character, who then stuffs his bag with all that junk? No walking needed to loot various parts of the castle that way. Besides, it's not like they need their armor or anything... Is there anything that would prevent this from working?
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I'm curious about one thing: Is it possible to use a teleporter trap on the bottom floor in order to skip the checks for KOD's equipment? I am aware that the bottom floor blocks your own teleports, but I'm pretty sure a trapped teleport from a treasure chest goes through just fine. Then again, I don't actually know how the game would handle it, or if the game would let you appear on that special tile.
In any case, I saw the encode. I saw a fighter turn into a ninja (at that speed, there'd better be a ninja!), then the ninja dieing, then you get the final object and then "You appeared in the Castle moat and have probably drowned!" Certainly a lovely sight.
Nicos wrote:
the game is actualy shorter than the ending, it would be silly to refuse a 1 min movie that actualy complete a game...
Likethemanyotherrunsthatarealsojustaminute? I'm sure there are a few that didn'tmakeit, but I thought I'd list out a few of those that are accepted.
I wonder if there's any other dungeon crawlers out there where the heroes can step forth at a speed of 10 squares per second or faster...
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I'm thinking about this run again...
Because I want to catch all secrets, I thought I'd craft up a lua script whose only job is to paste an "x" where there are things. I took a look at Dromiceius's code (the one made to help with enjoying my Magician run), and decided to work off of that to create something simple.
... So I treat some variables as an array of one element. It works, and I'm a tad worried about experimenting too much. The loop overwrites the variable before using it anyway. ... Okay, so I don't even rename the variables. I'm sure there's lots of stuff to make fun of.
--Salamander (J), places an x where stuff exists, no questions asked.
local ex, ey, eh = {}, {}, {}
function readword(a, b)
return memory.readbyte(a) + (memory.readbyte(b or a+1)*256)
end
while true do
for i=0, 15 do
ex[0]=memory.readbyte(0x035f+i)
ey[0]=memory.readbyte(0x033a+i)
eh[0]=memory.readbyte(0x042b+i) -- If non-zero, it probably exists.
if ex[0] > 0 and ex[0] < 248 and ey[0] > 0 and ey[0] < 223 and eh[0] > 0 then
gui.text(ex[0],ey[0],"x")
end
end
FCEU.frameadvance()
end
I suppose this is my first lua script... Perhaps a breakthrough for me.
Some oddly placed "x"s show up. Some have something to do with the transforming terrain, but sure enough...
4matsy wrote:
There's also one around at least the top hand (dunno if there's one near the bottom hand too) just before entering the blue section of level 1.
... There's one at the top part, where the point bonus is described. The "x" shows up right there, alright, and flying there does give 5000 points. The bottom area has no such bonus, in case you're curious.
I missed this bonus in my run. At least this game appears very friendly to input editing. As long as you match up the exact position, sub-position, and power-ups, things should be fine, unless some enemies are seeking the other player instead. Besides, there are some "lazy" parts that should be fixed up anyway. Notably, the two claws right after that missed secret.
But first, I really should complete the input all the way through the first stage. I'm still wishing I had multi-track recording, but I'll run with one player and manually edit in the other player...
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I shall suggest a short description, as I would like to get rid of that TODO there...
Our hero defeats the evil dictator threatening our peaceful land faster than the eye can see, as if by magic!
The author has provided subtitles for this run. We recommend viewing them.
This is just a suggestion, nothing more. If it doesn't seem quite right, then make changes. If it's no good, well... It is a suggestion, anyway.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I am thinking passively on how to go through the TAS...
To start with, what should we name the city? (First thought being Property, for no obvious reasons that come to mind)
Luck manipulate the zones into growing as equally and quickly as possible, but anyone can imagine just how troublesome that can become. Things do grow depending on luck, so a bit of manipulation here...
I still believe the best goal is to hit 600k in shortest in-game time, with shortest input coming third. The second goal is arbitrary, showing off various statistics and what happens when one fails to prepare for disasters.
Once one hits the goal, I'm thinking one would want to play out whatever congratulatory message that shows up, and show statistics. Then trigger the 6 disasters and manipulate the entire Megalopolis getting destroyed, watching the population go back down to zero from only those 6 disasters (Alas, roughly 5% survives in my test run. We need it 0%!).
Finish with player selecting END to show that sleepy crescent moon, so some sort of ending is seen rather than ending it with possible gameplay still hanging.
Those are my thoughts. If anyone wants to try, there's my test run and a nice script for use. If no one wants to, I may try on my own time, but don't expect me to rush. I want to hear what should be done before I try to do it, if I'm going to at all.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
antd wrote:
Thanks FatRatKing for your PM. Your advice was extremely useful.
I was expecting "helpful" or "fairly decent" or even a "pretty good", but if you did find it to be "extremely useful", then I have explained it a lot better than I thought I did. You made progress, in any case, so whatever the case, the RNG is much closer to being cracked. ... Hopefully.
Dromiceius wrote:
Also, FatRatKnight, I want to apologize for volunteering your assistance without your knowledge, or permission. That was a bit thoughtless on my part. :/
Actually, I now realize I'm not being asked to work out the whole thing alongside everyone here (I think)... I'm just being asked for advice. In any case, I accept your apology and throw in a "don't worry about it" for good measure.
I didn't think I'd be famous enough to get a request already... I'll stick around in case further help from me is desired.
I looked up the Battle Mechanics FAQ at GameFAQs in order to get a somewhat better feel around here. I'm not sure how helpful it will be, but at least I know something about how damage is calculated.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
I'm probably not the best person to give feedback, but I feel that since no one else is replying, I feel that I should. There's a lot of stuff I imagine could be when all I hear is silence, and I don't like most of what I think about. Then again, it's only been a day since you posted the videos...
Regardless, although I don't know the game, it looked nice. It's too bad about how much dialogue is in there, when compared to the length of each battle you do go into, but the battles themselves are nice. Thanks for the YouTube videos!
I don't see what further feedback I can give, especially since I know virtually nothing about this game. But I felt a single reply is preferable to complete silence. If nothing else, that view counter for this thread proves that someone is looking here. ... I hope...
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Somehow, I'm mentioned in this topic. Then I spotted something about a private message, and lo and behold, there it is.
I'm not sure how helpful I will be using an emulator I'm unfamiliar with to work on a game I merely have passing knowledge about, in an attempt to decode the critical hit formula which only has two results (crit or not crit), which uses a rather sizable list of numbers to determine which result. I could forgo the emulation completely, and never gain any familiarity with the game, and still attempt to crack through it from everyone's data collection here.
This definitely does not sound easy. I have a record of analyzing some deepgamemechanics without knowing what the code is, so I think asking for my help isn't entirely worthless, in spite of my unfamiliarity of the situation.
I suppose the first thing I should ask is to be pointed to the recommended tools, and instructions on how to use said tools. The next thing is to ask about what is known now, though I could just read through the thread for that. I'll probably need a few weeks to get myself fully started with my own tests, but if you still haven't figured much more by then, then I can be of help.
On the other hand, after I read through this thread, I could try to point out what to do next in an attempt to figure it out the darned RNG. Sure, I'd depend entirely on everyone else to get the exacting data I want, but I don't exactly need all the set-up time to just talk about it. The "first thing I should ask" up there, forget it!
Hmm... Weeks of set-up and dealing with other stuff in life in the meantime, or a bit of reading now and jump straight into the logic, skipping all the story, wandering, and so forth. I don't exactly want to try to track down the FFVII ISO and read up on how to use a new emulator's features, so I'll attempt to inject my skills while scarcely even knowing this game. If that fails, we didn't lose much in the attempt.
But first, reading. If I come up with something, I'll state my thoughts.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
At the moment, I'm having some minor trouble with those cockroaches. If anyone wants to try, go ahead, or else just watch what I did so far. Some manipulation can take place by delaying exit of the boss screen, going into the menu, or different timing of movement. Besides, I need to waste a few frames as fishy in order to begin bouncing from my first jump. Keep in mind that I can only gulp air once in any jump, and only one bounce per enemy in that same jump. Some help would be appreciated, but I can work on it later myself.EDIT: Huh, I manipulated those cockroaches well enough already. Don't want help now! I still gulp down air just like last time, though.
I'm not going to sit back and do nothing in the meantime, I'm going to test again whether the detour to become fish again is worth it, since I lost the results of my previous tests. I want to make absolutely certain that, even with strong manipulation of food (300 EVO.P is the target for pre-debustega, for the 6 strength), that I can't beat the detour.
By the way, this is your opportunity to see the different name I've chosen. Actually, it was suggested over PM, and it seemed reasonable. Site recognition seems appropriate in this case.
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Chapter 1 complete. 282 frames of improvement!EDIT: Actually, now it's 293, due to a different name, not shown in this movie. I'll reveal it when I finish Chapter 2.
A few notes:
- Some enemies that didn't appear in the test run's Cave of Origin are appearing now. This probably has something to do with the fact that some enemy sent itself to the left rather than right, going off-screen sooner and thereby allowing another enemy to spawn thanks to the room limit (7E0764,1u) no longer maxed.
- Once I leave the Cave of Origin and enter the Domain of Kuraselache... Take a good look at our heroic fish. I'm sure you'll be surprised. This actually costs a few frames, but I'm sure you'll forgive the speed loss in this case.
- Boss battle went faster due to scrolling the screen, giving the boss less room to be bashed around in. A technique that wasn't used early on in the test run.
- I'm going with the same names I've used last time. A fresh viewer would still enjoy it just as much, would they not?
Editor, Experienced Forum User, Published Author, Skilled player
(1197)
Joined: 9/27/2008
Posts: 1085
Talking about it did help, alright. I got past that point and currently milling about inside Cave of Origin. The Domain of Cepalas did not agree with me this time, and roughly 14 frames are lost there due to luck manipulation and/or lag. At least I am a little faster at the point I was stopped at, inside that maze.
Though, one question does pop up... Should I sacrifice a few frames for entertainment in the names? I could keep the EatAtJoes! and FatRatKni. I have in my test run, or I can stick in A and A and be done sooner, but that would be a waste of a perfect naming opportunity. Maybe throw in something else other than what I have in my test run instead.