This may not be of importance, but the movie files generally compress extremely well using something like winzip or winrar.
Maybe some compression algorithm is used?
Wow, I didn't even know there were old boosting techniques. It's looking like a really good TAS of this game would be more insane than I'd imagined.
Snes9x savestates are compressed. (With gzip, I believe.)
Changing input every 4 frames, it did it in just under 1:02 -- which beat my 30% speed trail run (on which I did lots of reloading), but is nowhere near the record.
But not only was my bot not using NBTs, it wasn't using 'old boosts' (hop, turn, skid, skid the other way, release R) either -- and it'll take me a while to figure out the optimal way to get those boosts, and maybe some major reprogramming.
Huh, so the powerslide boosts have been in since the beginning and were just undocumented (and perhaps unintentional?). Kinda like wall-jumping in the Mario series.
(I wonder if wavedashing will become an official technique in Super Smash Bros Brawl?)
Joined: 7/12/2005
Posts: 23
Location: Connecticut, USA
you know whats something funny to do, is whenever there is a ramp that you have to go over, like that one on that track (lol i cant remember the name of it, it was the one that has the turbo jump over the track before the left hand curve right before the finish), find the line that the comp goes on and put a banana peel or a shell right there infront of the turbo, so all they do is jump back over onto the road in the middle, totally skipping the turbo boost. its just kinda funny to see someone get all f'd up
It doesn't seem clear to me that the boosts are intentional in SMK. There's nothing in the manual about it, and the way they behave looks like it could well be a glitch.
hehe, I've found it's possible to get boosts on straights, without even changing the karts angle or losing any speed at all!
- by wiggling the left and right buttons at approximately 15 Hz while holding R, and then letting go of R.
Now the question is: can I use these boosts in conjunction with a feather to cross even longer gaps...
I have some ideas...
but I want to investigate these boosts a bit more until I'm confident I've worked out the best way to get the most from them, before I go back and modify my bot to play better.
Huffers, did you disable video output during the bot search, in order to save computation time ?
I'd be curious to see your time-zones for Mario Circuit 1, if you have any picture of them ...
And yeah, great job to have a bot up and running in the first place !
Huffers, did you disable video output during the bot search, in order to save computation time ?
I'd be curious to see your time-zones for Mario Circuit 1, if you have any picture of them ...
And yeah, great job to have a bot up and running in the first place !
thanks :)
Yep, I disabled video and sound output (but left it in as an option, for debugging), but it draws every 500th frame it does so I can see roughly how far it's up to and it hasn't got stuck or anything.
There isn't much point in posting the old quadralaterals I worked out, since I'm going to change them completely when I know more about these boosts (and its a hassle because the computer they're saved on isn't connected to the net atm).
Oh, and feathers don't interfere with the boosts - extra long jumps ahoy! :)
Now just to work out if mushrooms interfere with them, and how to best do off-road boosts....
Joined: 5/20/2004
Posts: 118
Location: Over there!
I just did a bit of experimentation with boosting, and here's what I came up with:
1. Hold Left/Right and L/R for 65 frames. You can freely switch directions provided that there are no frames in between. Hitting Left and Right in alternate frames down a straight works, and switching between L and R lets you hop whilst charging the boost (9 frames during a hop seem to be ignored for boosting purposes).
2. You don't need to hold anything any more. The boost will be stored for as long as you're either turning or drifting sideways. You can keep it stored like this for as long as you like; even whilst jumping around and bouncing off things.
3. Straighten yourself up and you'll get a boost. If you straighten whilst in the air, you'll get it upon landing. Note that boosts are interrupted by L/R, so make sure you release them in time.
Thanks for the help, SprintGod :)
I think I now know enough to start changing the bot and its routes (although I'll have to do some more experiments later on - e.g. does snow behave the same way as dirt?)
Here's a summary of what I know about SMK's physics (or am at least pretty sure of):
Accelerate moves you in the direction the screen is facing, not the direction the kart is drawn as facing.
The kart's handling is completely unaffected by being in midair.
Turning left or right causes the kart to move in the opposite direction, up to a point. Moving at high speeds exaggerates this effect, and holding L or R greatly exaggerates it.
L/R have this effect whether the kart is in air or not -- the hop the kart does when L or R is pressed down doesn't affect the handling.
Skidding does not slow the kart down, nor does it slow the kart's acceleration.
Driving over dirt without pressing accelerate causes the kart to deccellerate slower, but will eventually slow the kart to a halt.
For every frame while one of {L or R} and one of {right or left} are held down, a 'boost' is charged.
releasing L/R or right/left destroys the boost-charge
You may swap right or left without destroying the boost-charge, so long as at least one is held down each frame.
Driving onto dirt destroys the boost-charge.
Using a feather destroys the boost-charge.
Over-charging may make 'skidding-out' while skidding happen sooner.
How charged the boost is doesn't affect how fast or long the boost is. It's all or nothing.
To use the boost (when sufficiently charged), release L/R.
the boost will then happen as soon as the kart straightens out, isn't moving sideways, and left/right aren't pressed.
Pressing L or R during the boost will stop the boost.
Driving over dirt won't stop the boost.
Using a feather during the boost won't stop the boost.
Swapping which of L/R is being held during charging causes the kart to hop
after the hop starts the boost-charge will continue to build with or without L/R being held.
after the hop starts the boost-charge won't dissappear if left/right aren't pressed every frame
you may hop again without losing the boost charge.
if the kart straightens out, isn't moving sideways, left/right aren't being pressed, and L/R aren't being pressed the boost happens.
the same as above, but L/R are pressed then the boost-charge is just lost.
If the kart is straightened, not moving sideways and left/right + L/R are released in mid-air, then the boost happens immediately upon landing -- even if the kart lands in dirt.
I'm not sure how long you have to charge the boost for, or what affects how quickly it charges. But I don't think this is too important.
Edit: A lot of the above is a load of crap, see below for better information
You know, this might make a decent distributed computing problem... If we can host a "current best" somewhere for each track (with the timezone data that generated it) we could then make clients that downloaded that data, mutated it, then uploaded the "solution" to that set of zones if it beat the current best time. The server could fairly easily verify that the set of inputs resulted in a faster time than the current record. It'd be pretty awesome to have a "bot brute-forcing Mario Kart" screensaver.
The concept of sort of the "ultimate" tool-assistance - a bunch of computers trying to find the absolute best time for a game with little to no human intervention - rather appeals to me.
Is there a value in memory that changes when a boost is ready? That would make things real easy. =)
Can you start charging a new boost as soon as the old boost is released? That is, charging the frame after boosting...Hope that made sense.
You know, this might make a decent distributed computing problem... If we can host a "current best" somewhere for each track (with the timezone data that generated it) we could then make clients that downloaded that data, mutated it, then uploaded the "solution" to that set of zones if it beat the current best time. The server could fairly easily verify that the set of inputs resulted in a faster time than the current record. It'd be pretty awesome to have a "bot brute-forcing Mario Kart" screensaver.
The concept of sort of the "ultimate" tool-assistance - a bunch of computers trying to find the absolute best time for a game with little to no human intervention - rather appeals to me.
It seems that the number of choices on where to go (based on what huffers is doing) is quite small. Small enough to be computed overnight.
A true perfect playthrough, of a game without well defined boundaries (such as Super Mario Bros) would probably take on orders of 1000s of years if not more, even with significant pruning with every computer devoting its processing power. I believe Bisqwit showed this a while back.
But a distributed computing grid would be awesome. I'm just not sure if I would abandon folding for a long time. It would probably be a bitch to code, too.
I wasn't suggesting we try to apply this method to anything other than Mariokart.
This does give me another idea for a more general tool, though - A "conditional input" bot that works in parallel with user input, so you could make it do things like "press A whenever this memory value is less than 32" or even "keep a running 5-frame 'ring' of savestates, and when my character's hit recovery timer is nonzero then rewind two frames and repeat those frames' input except with the shield button held".
didn't Luke code such a conditional bot on his FCEU mod ? the bot seemed to be hard to be used by anyboby but him (since there is very little doc), but it understood a very basic programming language.
I'm not sure it would be very useful here though. the smk bot is supposed to find the best conditions by brute-force ; human help could only support it a little, and it could miss inhuman moves. I'm thinking of Bisqwit's Megaman 1 bot, which did find things that no human could have ever thought about.
even if no distributed client is set, it'd still be cool for some people interested here, to test the bot, and watch the results (even if they are still far from the World Human Records). btw, does the movie saving works, Huffers ? it should since they are stored in savestates, due to bulletproof recording. could you show us some examples of what the bot achieves at the moment ?
I never sleep, 'cause sleep is the cousin of death - NAS
But a distributed computing grid would be awesome. ... It would probably be a bitch to code, too.
Yep, thats the reason I'm not doing it :)
AzHP wrote:
Is there a value in memory that changes when a boost is ready? That would make things real easy. =)
I've been looking for it. No luck yet :(
I have found the game records how many frames L/R and left/right have both been pressed in a row, but it doesn't reset this value when the kart hits dirt, but I'm almost certain the boost charge is reset when this happens.
AzHP wrote:
Can you start charging a new boost as soon as the old boost is released? That is, charging the frame after boosting...Hope that made sense.
Pressing L or R during a boost stops the boost, so it's best to start charging again exactly when the boost hits its peak (it drops off rapidly then anyway).
SXL wrote:
btw, does the movie saving works, Huffers ? it should since they are stored in savestates, due to bulletproof recording. could you show us some examples of what the bot achieves at the moment ?
Erm... how do I extract the movie file from the savestate?