I'm sure it's possible, but there doesn't seem to be any such library in Java itself. I know for certain that AutoHotkey can both send input to an emulator, and call any Windows function (such as memory reading) so that's another option.
By the way, how well does FF7 sync when you're TASing? If it desyncs even occasionally, that could be a problem.
I... think so. I just assumed he was intending you to use the code he posted.
Roughly, you'd copy the pastebin he linked into a text file, save it as something like "c:\stuff\bot.java", and then press winkey+r to open the Run box, and compile it by entering "javac c:\stuff\bot.java"
You'd could then run the bot by entering "java bot" and a GUI would appear. It would apparently automate the input and frame-advancing part of the manipulation for you, but wouldn't be able to tell if something good or bad happened from a particular set of inputs. Still, not a bad trick, if it works.
I could be wrong about any of that, though; I know little about Java.
IMO, it's a serious nuisance. You might need a given app once a week, but how many different apps do you need on a given day? You have to navigate to all of them individually.
I used the hierarchical approach for a long time, but gradually became dissatisfied, and convinced that there were better ways to do it. My solutions- which evolved into just using a CLI and hotkeys- never included putting icons on my desktop, but I can easily see how that would be a good combination of simplicity and effectiveness for most users who don't really care so much about this sort of thing.
I preferred a sidebar over the desktop. Just drop a folder of shortcuts onto an edge of the screen and set it to "list" view. It's like a hybrid desktop/start menu.
You mean OCR as in optical character recognition? I think I'd rather use AutoHotkey for that... but even then, I assume the hit sparks would occasionally occlude the damage numbers on striking an enemy and muck up everything, so maybe not.
FYI, [url=http://memoryhacking.com[/url]Memory Hacking Software[/url] can also do memory search on any running process (in userland, at least.) It also has a bunch of other hacking tools and a scripting language with some Win32 API wrappers, some of which are able to send simulated input. For whatever reason, I could never get that working when I tried it with FCEU a couple years ago, but it definitely seems within the realm of possibility.
But yeah, I think hacking teh src should be fine, assuming I can cross-compile.
Huh. So do you attack even if the tail is up?
I liked the glitches. They were all pretty interesting. There are some parts where you use the same combo over and over, but other than that the fighting was pretty good, too.
http://www.youtube.com/watch?v=aU20qM6TSt0Before Guard Scorpion
I am up to the guard scorpion fight. I cannot continue until someone makes something that makes critical-hits easier :P
It will not be good if I do this manually. There are far too many possibilities to try out. It's virtually impossible for me to do the optimal strat here
I'm not sure how ZeXr0 fared with his efforts. We talked a bit on Friday, but the site's been down most of the time since then.
If that doesn't work out, I should still be able to get around a few bugs in PCSX and hopefully cross-compile you an exe that has a TAS the battle for me (TM) button hacked in. Though, I'm not sure how that's going to work.
My first impulse is to make the dumbest bot possible. It would probably work in all battles, but that's probably a bad idea if there are already ideal strategies (i.e., sets of battle commands that could be hard-coded into the bot) that just need a lot of luck manipulation.
So... what's the strat?
I had an idea to use L.Spiro script (the scripting language of Memory Hacking Software) to copy/paste process memory, with the aim of simulating rerecording in a PC game.
It wouldn't be easy, since you have a running kernel to deal with, which would be constantly messing with system resources, and which can't be tampered with.
I think the best option would be DLL injection. One could hypothetically reverse-engineer the game to get an understanding of its memory structures, and then write savestate/movie recording support+hotkeys, and then treat the game itself as though it were a TASing emulator.
There's also a version of GDB that can be scripted using Python. I don't yet fathom how useful that could be, especially if it were extended to suit the purposes of TASing. I do know that vanilla GDB can breakpoint (frame-advance) and modify memory and CPU registers (save state), so if you were to script that in Python, you would conceivably be able to do both on the fly, and thus create passable tool-assistance.
Yeah, M1 is the only option for arcade games... it's old and outdated, but it's pretty good.
But winamp has all these plugins AND global hotkeys as well.
Winamp is probably better for most users. I stopped using it for a bunch of reasons, mainly that the installer tried to sneak AOL spam onto my computer.
The lists work great, BTW. Thanks.
It's kind of surprising it took so long for him to get banned, but I guess not many people paid attention to his anti-semitic rantings on IRC.
Kirkq wrote:
I must say I wasn't really impressed with the entertainment of his run, but his technical skill was quite good if his goal was to get people irritated. 3/7.5
Indeed. That kind of technical level only comes with extensive tool-assistance.
Ah. You're right. I just assumed from the makefile that Linux support was kaput, since it assumes win32. I'm up to linker errors now. Doesn't look like this will take too long.
I see... There's a separate makefile for Linux. Built it, but it's not finding any plugins yet. I'll have to fix that later and then try botting.
Which IDE or compiler should I use for this ? I'd prefer tools on Windows 7, but I can use Ubuntu if it's only available on Ubuntu (I really prefer Windows 7, the setup is better for programming).
Ach, I wish it compiled under Linux, or I'd have done this myself.
Much thanks for making the attempt, ZeXr0.
The project builds under the GNU toolchain rather than MSVC. You'll need to install MinGW. Judging from the Makefile, it's expecting GCC in the 3.X.X range, which I believe comes with the installer.
The installer should also provide you with an x-terminal. Hopefully, running make in the term will build cleanly.
My old playlist. It's about 150kb. I just kinda added everything I had one day, and gradually deleted things I didn't like. Might as well post it, why not.
If you have something from other systems, please tell us where to get the player too.
I used Foobar2000 on Windows, which beats the shit out of anything I've used on Linux. It's very customizable, and the playlist searching is fast. You also can use global hotkeys to call the "jump to file" dialog. The plugins aren't as good as you can get in Winamp, though.
The smart thing for Linux users is probably to use Winamp through Wine and dump everything to MP3, then use MPlayer or whatever. Storage is worth less than the time spent sifting through all this crap...
Lots of people like Audio Overload, but it's 1) closed source 2) CLI-impaired and 3) doesn't seem to support minipsf.
I use Audacious, which has its problems, but I find it the most serviceable player available. It's open source, and you can get it via APT. It's missing support for GSF, 2SF, USF, and miniPSF. I was able to build and run from source, though- maybe I'll fix that eventually.
For GSF and 2SF formats, there's playgsf and vio2play, both open source and reasonably complete standalone players.
M1 seems to be the only choice for playing arcade chiptunes. You don't need ripped *SF-style files to play arcade music, as this program plays the ROMs directly. M1 has some kind of playlist support (which is the alternative to the tracks repeating forever) but I haven't found any such lists online. Works on Windows and Linux. (Maybe Mac, too. I dunno.)
I was undecided, but the arguments for #2 are pretty convincing. Wobbling isn't interesting, and arbitrarily choosing when and when not to trade for entertainment doesn't sound very practical.
I'd assume you could combine developer designed blocks of a map and the procedurally generated content seamlessly so you could add certain things that repeat from game to game in different positions and arrangements.
Also, I'm assuming that with switching of the terrain and restricting the layouts a bit more (to move them from the current cave-like appearance into the sharp corners and so forth of a castle) could make it generate more castlevania-esque levels.
Well... that's one way to do it. ;)
It's definitely not a simple problem, but I've suspected for awhile that there are cleverer solutions to create "randomness that isn't random." Not that I have any specific ideas or anything.
Anyway, pretty impressive so far. I'll definetly take a look at the code and possibly contribute something if I find the the time and motivation (coding at work severely diminishes motivation for other coding). Do you happen to any sort of a roadmap one could look for a list of things to be done?
Neat! I think I might actually abscond with your map generator code and use it to make a Solar Jetman clone. That screenshot you posted is very reminiscent of what you'd see in that game.
Also, you can't say "Castletroid" without "castle", but these procedural maps don't seem like they'd be able to generate anything resembling man-made architecture. Any thoughts/plans on that?
Tourettesguy remix: I have freedom of speech
Really neat editing for the first half and toward the end. If not for the obnoxious intro and pointless interlude, and the fact that everything is duplicated four times, it wouldn't even be crappy!
I should probably mention that this video is pretty much non-stop swearing.
But I wouldn't call myself competent with C and with emulator in general.
Sorry to hear that... but maybe I can entice you anyway?
Or somebody?
I may have been overstating when I said "competent". Really, you probably wouldn't need more than a passing familiarity with C, especially if you're already a pro with C# or some other language.
By the looks of it, you'd need some memory addresses (which Antd probably has already) and a handful of emulator functions in order to carry out some naive bruteforcing, which is surely good enough for the purposes of TASing. mz posted an example earlier that had some of the functions one would need.
Assuming the "doframeadvance" and "dosendkey" functions exist in some reasonable form, it wouldn't be much more complicated than using Lua:
const int MAXENEMIES = I dunno... twelve?;
int enemystarthp[MAXENEMIES];
if(key = DOBRUTEFORCEKEY)
{
for(int attempts = 0; attempts < 8; ++attempts)
{
bool IHITAGUY = false;
for(int i = 0; i < 4*attempts; ++i)
doframeadvance();
//We did the manipulation (by waiting) so send the command to attack
dosendkey(CONFIRM_BUTTON);
//read all the enemy HP values
for(int i = 0; i < MAXENEMIES; ++i)
enemystarthp[i] = psxMs8(ENEMYHPADDR*(HPOFFSET*i));
//check enemy HP every frame; wait for an enemy to get hit
int frameswaited = 0;
while(!IHITAGUY) {
doframeadvance();
if(frameswaited++ > idunno500maybe?) break; //in case we miss
for(int i = 0; i < MAXENEMIES; ++i) {
if(enemystarthp[i] > psxMs8(ENEMYHPADDR*(HPOFFSET*i))) {
IHITAGUY = true;
break;
}
}
}
}
}
Of course, there'd have to be some more logic for things I didn't account for, like enemy HP being set to 0xFFFFFF on death, or whatever. Also, for the function to be useful, you'd need to track the greatest difference between initial and final enemy HP values, and finish the function by advancing the appropriate number of frames and sending the confirm key one more time. Setting the speedmode would be smart, too.
Also, 8 attempts (8*4 frames = 1/2 second) is a conservative amount of time to wait to manipulate a critical, compared to AxeMan's FF1 run DQ, etc.
Edit: Also, that code above is probably full of ridiculous mistakes.
Still, this seems pretty doable.
Indeed. I haven't been following progress on whatever the next run is going to be, but clearly there's going to be a lot more to it than just shaving a few frames here and there. Exciting!