Jump to content

[Tool] Amrykid's PokeMMO Tools


Recommended Posts

Hello everyone. A couple of weeks ago, I set off to develop some tools for PokeMMO that were rather simple but felt like they are included in-game. They aren't, but they get pretty darn close.
 
NOTE: All tools run only on Windows because they utilize the .NET framework. Mono (for OS X and *nix) does not support WPF at this time.

Please consider these to be alpha quality as they have yet to be extensively tested as normal software applications are.
 
Geeky stuff about the lib (for programmers)


First of all, I created a .NET library for simplifying the development of tools for PokeMMO in .NET languages (such as C# and VB.NET). All the tools in this (collection/on-going program) utilize this library to create the illusion of the tools being inside of the game, along with some other nifty features such as watching for when the game has started and exited. More capabilities are on the way!
 
Anyway, onto the tools themselves.


 
The tools

PokeMonitor

Spoiler

The first of the tools I would like to release is called PokeMonitor. It is a relatively simple application that waits for PokeMMO to start and will automatically start any tools you have set to be executed. For example, you can set an IV calculator app to run whenever you run PokeMMO instead of manually running it yourself. PokeMonitor runs in your system tray with a 'Pokeball' icon.
 
0z2tbb1.png
 
Simply right click on the icon to open the list of applications that will run when PokeMMO is executed.
5yeGJys.png

 
PokePad

Spoiler

The next tool I would like to introduce is PokePad. It doesn't get much simpler than this. PokePad is a bare-bones micro-notepad that runs inside of the PokeMMO window. Jot down anything you want and it will be automatically saved. Simple and easy.
 
This is what PokePad looks like running inside of PokeMMO.
QQd5e9P.png
 
And it wouldn't make sense to not be able to minimize it.
3uHgsfP.png

 
PokeReleaseNotes

Spoiler

Last but not least is PokeReleaseNotes. As you could probably guess, the intention of this little tool is to fetch the latest PokeMMO changelog from this forum and display it in a window for you inside of PokeMMO.
 
This tool works great with PokeMonitor because it will appear while you're on the login screen (if it was timed correctly).
 
O1K3GSV.png
 
Doesn't get any simpler than that.

 

System Requirements

  1. .NET Framework 4.0 - Client profile version, which is a scaled down version. Full 4.0 works too. Client profile version can be downloaded from here.
  2. PokeMMO
  3. Operating System: Windows XP or higher.

 
Download & Source Code
All of the tools (and future ones) are fully open source. You can view and download the source from from here.
 
 
Lastly, you can download the binaries (.exe files) in a zip from here: v0.1-Alpha.

If for any reason (in the future) that you want to download an older release, you can see all releases here.

 

Future/possible tools

  • In-game internet radio streaming application. Could probably stream PIRN: Pokémon Radio by default.
  • Tool for displaying what Pokemon appear on what route.
  • Etc?
Link to comment

seems interesting !

 

at first I was thinking you made a library to interact with PokeMMO, I was interested to be able to communicate with PokeMMO, but then I say it was "only" to add stuff in it !

this is quite awesome still !

That's all coming soon (to the library). I am also interested in communicating with PokeMMO. Lately I've been exploring ways to interact with it but at the moment, the only thing I have is a way to make the game window 'flash'.

 

Send/PostMessage, and Pipes have been considered, along with other unconventional methods which I will not use nor release code to do so. 

 

EDIT:

Censored.

Link to comment

Could you explain what exactly do you want? Track your Pokemon encounters?


I like shiny hunting, and I like counting how many Pokemon I see on the way. It sucks because I have this obnoxiously large spreadsheet sitting on my computer that shows down the process cuz I have to switch back and forth. I want something that will count them for me :L
Link to comment

I like shiny hunting, and I like counting how many Pokemon I see on the way. It sucks because I have this obnoxiously large spreadsheet sitting on my computer that shows down the process cuz I have to switch back and forth. I want something that will count them for me :L

The problem with that is I have no way of knowing when you run into a Pokémon. My pipes suggestion for the game would allow for something like this but there has been no sign of the devs acknowledging it's existence. 

 

I could try taking a screenshot of the game every X seconds and look for.... That wouldn't work either.

 

At this point, the only thing I could do is listen for a keyboard key and that would increment the counter. Unless, you or anyone else has a better idea.

Link to comment

I'm intrigued, why  would this not work ?

 

its fairly impractical.  I thought about trying to make something like that, and it would probably have to check very frequently, be able to identify both male/female and shiny pokemon, as well as differentiate between an NPC/PvP battle and a PvE battle. I was just hoping that the OP might have a better idea for how this could work.

Link to comment

I'm intrigued, why  would this not work ?

 

 

its fairly impractical.  I thought about trying to make something like that, and it would probably have to check very frequently, be able to identify both male/female and shiny pokemon, as well as differentiate between an NPC/PvP battle and a PvE battle. I was just hoping that the OP might have a better idea for how this could work.

 

Dannnno hit the nail on the head. It won't be easy trying to detect battle state. While I was away, I was thinking of the possibly of reading a pre-determined pixel and it's color would determine if there is a battle or not. I'll keep looking.

 

Other than that, I've tried playing with OCR to read in-game text (from dialogue text, not menus) and that didn't work very well either. 

 

Your guesses are as good as mine.

Link to comment

Dannnno hit the nail on the head. It won't be easy trying to detect battle state. While I was away, I was thinking of the possibly of reading a pre-determined pixel and it's color would determine if there is a battle or not. I'll keep looking.

 

Other than that, I've tried playing with OCR to read in-game text (from dialogue text, not menus) and that didn't work very well either. 

 

Your guesses are as good as mine.

 

Couldn't you make it detect the pixels in "A wild X has appeared!"? Seems easy enough to me.

Link to comment

Couldn't you make it detect the pixels in "A wild X has appeared!"? Seems easy enough to me.

 

I guess that would work, but it would require people to have their screens set up in a specific fashion (like a specifically placed chatbox at a certain size so it doesn't interfere with the image capture). That seems less than ideal to me, and would still require pretty constant scanning which increases CPU usage.

 

The only thing I can think of that might work is to have a hotkey you press every time you enter a wild encounter and it would check what pokemon it is and add it to the tally.  This would reduce how often the program has to check (reducing CPU load) and theoretically give you a more accurate count. It would also be less annoying than tallying by hand or switching tabs.  

 

To amrykid, would this sort of thing be doable/feasible from a programming perspective?  I don't have enough know how to really get an idea of how well it would work.

Link to comment

I guess that would work, but it would require people to have their screens set up in a specific fashion (like a specifically placed chatbox at a certain size so it doesn't interfere with the image capture). That seems less than ideal to me, and would still require pretty constant scanning which increases CPU usage.

 

The only thing I can think of that might work is to have a hotkey you press every time you enter a wild encounter and it would check what pokemon it is and add it to the tally.  This would reduce how often the program has to check (reducing CPU load) and theoretically give you a more accurate count. It would also be less annoying than tallying by hand or switching tabs.  

 

To amrykid, would this sort of thing be doable/feasible from a programming perspective?  I don't have enough know how to really get an idea of how well it would work.

 

Well, I don't think that it would b a problem to scan for encounters, with enough knowledge of the window screen, it could be calculated where this text appears ! and how tall it would be !

but, yes, it would require some CPU ! though I think, if it is done properly, it could be invisible to the player ! (capturing videos, can be almost invisible to the player, so checking 2 frames a sec,(I think it would be enough !) should not be too much !

 

the problem of hotkeys, is that many people don't like to have something to do at all (except looking at the results ^^), but it would be feasible, I think

 

the best way would obviously be that the dev team gives an "API" with events (like OnBattleStart() which have the pokemon infos, whether it is a wild encounter or not, and why not the place where the fight is taking place) sent that can be used in other programs (would be easier to make them in java then) 

I actually think this could be emulated by watching the data sent through the network !

Link to comment

Well, I don't think that it would b a problem to scan for encounters, with enough knowledge of the window screen, it could be calculated where this text appears ! and how tall it would be !

but, yes, it would require some CPU ! though I think, if it is done properly, it could be invisible to the player ! (capturing videos, can be almost invisible to the player, so checking 2 frames a sec,(I think it would be enough !) should not be too much !

Using OCR to scan for 'text' is harder than usual because of the size of the text and it's unusual typeface. Believe me, I've tried it out (yesterday, in fact).

rIyYVMK.png

 

the problem of hotkeys, is that many people don't like to have something to do at all (except looking at the results ^^), but it would be feasible, I think

That's the only thing I can think of... for now. Last night, I began experimenting with taking tiny screenshots of a small section of the screen and determine if it was darker than usual. If it is darker, the player is in a battle. I can't get it to work the way I want however.

 

 

the best way would obviously be that the dev team gives an "API" with events (like OnBattleStart() which have the pokemon infos, whether it is a wild encounter or not, and why not the place where the fight is taking place) sent that can be used in other programs (would be easier to make them in java then) 

I wish the developers would do that. I think it's kind of weird that they allow third party software but not have some sort of 'basic' API available. However, the game is still in Alpha. I would expect an API to be released in the Beta.

 

 

 

I actually think this could be emulated by watching the data sent through the network !

 

I'm going to look into that, and tell you all if this can be done !

 

(Yes I know, I'm replying to myself ! so what ?)

Prying the connection open and watching the data stream may be against the ToS. If it was possible, people could fake client actions and maybe even create bots that bypass the client itself. With that in mind, I don't see the developers ever allowing us to do that.  :( 

Link to comment

Prying the connection open and watching the data stream may be against the ToS. If it was possible, people could fake client actions and maybe even create bots that bypass the client itself. With that in mind, I don't see the developers ever allowing us to do that.  :( 

seeing how complicates it seems to be, I don't think will ever have someone trying something like that ! but, you're right, I'll take a look at it !

Link to comment

Prying the connection open and watching the data stream may be against the ToS. If it was possible, people could fake client actions and maybe even create bots that bypass the client itself. With that in mind, I don't see the developers ever allowing us to do that.  :( 

 

hummm... this is actually written in the code of conduct, though the code of conduct says (section 4 Paragraph D) :

 

  • c. You may not use any unauthorized third-party software that intercepts or otherwise collects information from or through the Game or Service, including without limitation any software that reads areas of RAM used by the game, any program which reads and attempts to manipulate network traffic between your Game Client and the Game Server

 

since what I want to do is just look at the traffic, and not manipulate it, I think it is not clear whether it is allowed or not ... (I guess it is not, but I'll send a request to have the permission !(it is said "unauthorized" so you can get an authorization right ?)

Link to comment

hummm... this is actually written in the code of conduct, though the code of conduct says (section 4 Paragraph D) :

 

since what I want to do is just look at the traffic, and not manipulate it, I think it is not clear whether it is allowed or not ... (I guess it is not, but I'll send a request to have the permission !(it is said "unauthorized" so you can get an authorization right ?)

The situation we're are in sucks: We can not break the rules while trying to provide tools that improve the user's experience. Let's say you do some how figure out how to look at the traffic, if the Code of Conduct states that you cannot do it, your software will not make it past the approval process (of getting it onto the forums). 

 

However, yes, if they do allow developers to go through some sort of authorization process, I would expect that our software will have to remain closed source for good reason.

 

If the developers do not plan on providing us with an API or some way to communicate with the game, at the very least, allow us to read the RAM (under moderation). However, I don't see this happening anytime soon.

 

In a hypothetical situation that they do allow us to read from the process' memory, we could:

  • Very easily read Pokemon stats
  • Know if the player is in a battle or not at any given time.
  • Know the location of the player and be able to determine if the player is moving and how many steps they have taken. Think of the "/loc" command in game.
  • Among other things

----

On the server note, if we could emulate the client or better yet, create a 'proxy' in between the client and the service, then we would be able to have access so when some of the 'events' above occur. That would take some reverse-engineering and time to figure out and isn't worth it.

 

I won't go into my Pipes idea in this thread but it is still on the table.

 

Probably the cleanest way of doing an API would be to implement some sort of REST api with a mix of Twitter's user streams feature.

 

The REST API could be JSON based with several endpoints such as:

  • /getplayer?name=Amrykid - Returns my name, how many badges acquired, what Pokémon I have with me (optional), and whether I'm online or not (could follow /dnd).
  • /getpc - Requires authentication (OAuth?) - Gets every single Pokémon in your PC. Returns the name, nickname, level and a unique ID for retrieving detailed information.
  • /getpokemon?id=blablabla - Requires authentication - Gets detailed information on whatever Pokémon corresponds to that ID in my PC. Returns stats, moves, EVs... everything in the summary screen in the game.
  • /getfriends | /getblocklist - Requires auth. - Self explanatory.

The 'user streams' idea would be connecting to the server directly (on another port) where a service that handles communicating with the actual game server is running. After some authentication, the application will be ready for data to be pushed to it.

 

Things that can be 'pushed':

  • Player (the one we care about) catches a Pokémon.
  • Player location (or amount of steps taken since last 'push') - again, think "/loc". This can be sent at intervals of every 5 minutes as long as the player is online.
  • Player accesses and closes their PC (if something has changed such as they changed their team).
  • Friend comes online/offline.
  • Someone whispers the player.

----

 

I think I spent a little too much time writing all that and lost my train of thought.

Link to comment
  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.