*raises hand*
I also would like to see this finished, too!
Seriously though, I'm surprised there aren't more people working on this. It's Kirby for chrissakes.
I liked how you shot the already-dead dinosaur with the grenade launcher while waiting for the wall to come down... and then ran across a pond like a ninja. A ninja Indian who runs around stabbing raptors in the head.
It was worth the wait, and I had a great time watching. The pulse timing and walljumps were particularly impressive.
My only gripe is that you didn't shoot the monkeys. Was there a particular reason for that?
Edit: obviously my vote is not contingent on the feasibility of monkey-shooting, so I voted Yes.
Ha! Yeah, it didn't really occur to me that the ATB was reversed. I realized after seeing your changes to the code that I could make the ATB go left to right, and remove "barlen" entirely. Ever the efficiency nazi, I also trimmed a few things.
It's probably not perfect, but the mouse thing is fixed this time. :D
Apropos, Inichi, do you have any interest in writing a "director's commentary" to be added as subtitles in the movie? It's relatively simple to code, but the subtitles themselves could be laborious to write.
I think there's a problem with gui.transparency not resetting correctly. I ran a script with gui.transparency(1), removed the call, ran it again, and it was stuck on transparency(1). Stopping the script causes the transparency to get stuck like that, ignoring calls to gui.transparency.
Also, I notice Snes9x only cares about the last call to gui.transparency in the loop. So this:
gui.transparency(3)
gui.drawbox(x, y, x2, y2, "#FFFFFF")
gui.transparency(0)
gui.text(x, y, "Fuzzy pickle!")
...comes out completely opaque.
It would be nice if it didn't, but it's no big deal.
In anticipation of what is obviously going to be one of the most impressive expositions of TAS-kickery we'll see this year, I've written a Lua script, the purpose of which is to show interesting information during the movie.
It displays the HP of the enemies underneath their sprites, along with their ATB meters... the ATBs don't seem to be a "real" representation of enemy behavior in some cases, and so are a bit wonky at times.
I'm open to suggestions for more features.
Rock on, Inichi! :)
It could plausibly be done with movie.framecount().
What do you think about a function like Sleep(DWORD milliseconds) to pass CPU time back to the emulator? In other words, to prevent snes9x from going insane when I try something like this:
while blocking do
readinput()
modifyguidisplaystuff()
if joypad5.start ~= nil then snes9x.frameadvance()
--Sleep(5)
end
Any means of passing an arbitrary amount of input to the script between frames is what I'm after, really. Preferably with gui/screen refreshing. I just haven't been able to think of any other solution.
From what I can tell by watching, it's a lot more polished than the last submission for this game, though I wouldn't be at all surprised if sub-15 were possible.
The game itself is somewhat boring, but not without interesting elements, and some variety in the platforming.
I give it a weak Yes.
Actually, I meant that I had only tested so far as getting my ass kicked. Checking again just to be sure, it does emulate correctly between battles, so it should be fine to TAS.
Indeed.
WHACK-AK-AK-AK-AK-AK, dead. Just as any time-traveling samurai should operate.
I've been looking forward to this since the first WIP, and lived up to expectations. Though I probably should have played the game for five minutes to see what the hell is going on before watching this movie, I give it a Yes vote for the boss fights, the deliberate drowning, the awesome music in level 1, and general polish. :)
The latter. I already knew quite a bit of C and had spent time hacking ROMs before NESvideos came into existence. But since coming here, I've been motivated to learn about things I probably wouldn't have otherwise- like using programming environments like MinGW to compile open-source projects, (i.e, FCEU.) There's also the S/NES ASM.
I think nearly all of us are here both because we like games, and have a natural hackerish interest in learning how things work. Programming certainly falls within that domain.
Glad to see you back to work on this, atro!
I've made a watchlist for you.
Right click -> save as
It lists what I am fairly certain are the Hit Point values for the eight possible enemies that can exist at any point in time. I didn't test it too thoroughly, since my gimpy wrist doesn't agree with SoR type games. Damn ninjas.
If you don't already know, usage is simple: in Gens 9.5b, click tools -> ram Watch. In the dialog that pops up, click "Load..." and select the .wch file I just linked you.
If you need any more addresses, give the word and I'll see what I can do.
FWIW, I made a Lua script in snes9x that can rewind however the heck I want it to.
The only problem with it is that the current implementation of Lua in that emulator seems to require the frame advance button to be pressed concurrently with the rewind button... one step forward, two steps back.
It works, at least. I can upload it later if anyone's interested... though it's not like it's hard to write, or anything.
We need moar Lua, clearly.
Kind of. I did want to make a "learning program" that didn't need heuristics, but heuristics and randomization is all I've used so far. Now it's stuck at the start of Yoshi's Island 3 because I've not been able to explain that "you're just running back and forth, not getting anywhere! Try walking slowly and jumping more."
Methinks it's time Mario became acquainted with his own X/Y coords and a little modal logic...
Wouldn't the overall frame count be adequate? I guess it's one thing if you want to figure out how it works, but for the purposes of TASing, I wouldn't think it really matters.
Unrelated note: v0.04 is crashing whenever I load a ROM. I'm just going to assume the problem is my system, until someone else reports the same problem.
Yeah, definitely. Hal's ridiculously awesome script has blown my mind and inspired me to brute force the hell out of 7th Saga, so I'm somewhat diverted, though.
The inputs will become more random in the next version. It might also be cool to use hard-coded input sets to affect flying and certain glitches from the TASes, but I expect that it will be stuck as a dodo, considering the unlikelihood of Mario grabbing a feather. ;)
Ahoy, mates.
I don't know if anyone is actually working on subtitles anymore, but this TAS seems to sync with DeHackEd's Lua-enabled version of Snes9x, for which I have cobbled together a very serviceable subtitle script out of straws and chewing gum.
Uh... has work progressed?
I'm working on a Lua script at the moment that should facilitate luck manipulation and general strategery.
I'm not sure if I should bother with decoding the algos/RNG, since:
1) knowing what is going to happen doesn't mean being able to change anything, and
2) the bot could just brute force (with some degree of intelligence) the overworld instead; test a slew of different battles to see which has the overall best outcome.
If there's interest (i.e., if someone wants to deal with the strategy and route-planning end) I'll get right on it.
Just when I thought this Lua thing couldn't get more awesome, I realized it could be used for botting, and created a rudimentary bot script for SMW. How it works is, it runs to the right while holding Y, and randomly presses B. Brilliant, isn't it?
Here's a movie of it in action... sort of. I had to help it a lot with the savestates, because it does not yet know how to avoid getting caught in an infinite death loop.
Linky
Here's the general outline of what I'm planning:
local buttons = { Y = 1, right = 1 }
local sol = savestate.create(5)
savestate.save(sol)
--start movie recording to random filename, set speed to maximum
while true do
joypad.set(1, buttons)
--if mario dies, reload.
if (memory.readbyte(0x7e0071)) == 9 then
savestate.load(sol)
--compare input to previous inputs, dump results into a buttons table
end
--TODO: pseudo-randomize input, weighted according to previous attempts
--but for now, just jump up and down like an idiot
resetbuttons = math.random(0,20)
if resetbuttons == 1 then
buttons.B = math.random(0,2)
if buttons.B == 0 then buttons.B = nil end
end
--incrementally save every N frames
--detect instant death
--detect end of level, drop out of warp
snes9x.frameadvance();
end
I think it has potential. More ideas, anyone?
It would be nice (if not incredibly handy) if movies could be handled as objects, the way savestates are- particularly with regards to the creation of temporary files.
Edit: Also, I couldn't get savestate.create() to work without passing an integer.
Bah. It sorted itself out. Nevermind. Sorry for the edits, IRC. ;)
It's definitely a lot better than Gex64, which I couldn't sit through; an hour of this wouldn't be excessive. Still pretty mediocre, though. It seems to have some of the same factors that made the original monotonous to watch. So, even though I'd most likely vote yes on a submission of this, there are bound to be other projects out there more deserving of a skilled hand.