Coding AJAX-compatible GM scripts

Archival storage to keep things organized and uncluttered. Can't find what you need? Search for old topics here.

Moderators: Tech Team, Global Moderators

Forum rules
Please read the Community Guidelines before posting.

Postby Aerial Attack on Mon Oct 08, 2007 9:42 am

Not that you don't already have enough on your hands getting BOB to work with AJAX ...

But, You'll also need to update the way it reads XML. Right now - for maps that use partial bonuses, BOB does not handle "non-explicit" partial pairings.

I'll use Italy as my example map.

New XML
Code: Select all
(you need to talk to whoever wrote the XML for the Italy Map OR Pearl Harbor Map for the new XML)


Old (Explicit Partial Pairings) XML
Code: Select all
(this is only an approximation - not the exact code)
<bonuses>
  <bonus:+1>
    <territory:Napoli>
    <territory:Palermo>
  </bonus>
  <bonus:+1>
    <territory:Napoli>
    <territory:Roma>
  </bonus>
  <bonus:+1>
    <territory:Napoli>
    <territory:Torino>
  </bonus>
  <bonus:+1>
    <territory:Napoli>
    <territory:Venezia>
  </bonus>
  <bonus:+1>
    <territory:Palermo>
    <territory:Roma>
  </bonus>
  <bonus:+1>
    <territory:Palermo>
    <territory:Torino>
  </bonus>
  <bonus:+1>
    <territory:Palermo>
    <territory:Venezia>
  </bonus>
  <bonus:+1>
    <territory:Roma>
    <territory:Torino>
  </bonus>
  <bonus:+1>
    <territory:Roma>
    <territory:Venezia>
  </bonus>
  <bonus:+1>
    <territory:Torino>
    <territory:Venezia>
  </bonus>
// negative because of overlap with 3 terrs
  <bonus:-1>
    <territory:Napoli>
    <territory:Palermo>
    <territory:Roma>
  </bonus>
  <bonus:-1>
    <territory:Napoli>
    <territory:Palermo>
    <territory:Torino>
  </bonus>
  <bonus:-1>
    <territory:Napoli>
    <territory:Palermo>
    <territory:Venezia>
  </bonus>
  <bonus:-1>
    <territory:Napoli>
    <territory:Roma>
    <territory:Torino>
  </bonus>
  <bonus:-1>
    <territory:Napoli>
    <territory:Roma>
    <territory:Venezia>
  </bonus>
  <bonus:-1>
    <territory:Napoli>
    <territory:Torino>
    <territory:Venezia>
  </bonus>
  <bonus:-1>
    <territory:Palermo>
    <territory:Roma>
    <territory:Torino>
  </bonus>
  <bonus:-1>
    <territory:Palermo>
    <territory:Roma>
    <territory:Venezia>
  </bonus>
  <bonus:-1>
    <territory:Palermo>
    <territory:Torino>
    <territory:Venezia>
  </bonus>
  <bonus:-1>
    <territory:Roma>
    <territory:Torino>
    <territory:Venezia>
  </bonus>
// back to positive because of dual overlap with 4 or 5 terrs
  <bonus:+1>
    <territory:Napoli>
    <territory:Palermo>
    <territory:Roma>
    <territory:Torino>
  </bonus>
  <bonus:+1>
    <territory:Napoli>
    <territory:Palermo>
    <territory:Roma>
    <territory:Venezia>
  </bonus>
  <bonus:+1>
    <territory:Napoli>
    <territory:Palermo>
    <territory:Torino>
    <territory:Venezia>
  </bonus>
  <bonus:+1>
    <territory:Palermo>
    <territory:Roma>
    <territory:Torino>
    <territory:Venezia>
  </bonus>


For the Italy map the number of bonus lines are the same, but for Age of Merchants - I know that the new XML would require fewer lines and therefore less processing time.
User avatar
Sergeant Aerial Attack
 
Posts: 1132
Joined: Mon Jun 04, 2007 7:59 pm
Location: Generation One: The Clan
Medals: 4
Tournament Achievement (2) Tournament Contribution (1) General Contribution (1)

Postby yeti_c on Tue Oct 09, 2007 4:32 am

I was looking into this...

I can get the handleResponse() back but I can't manage to override it with a new version - without copy and pasting the contents of the function from the source file...

Code: Select all
//function dave()
//{
//   alert("dave");
//}
//
//var newHandleResponse = unsafeWindow.handleResponse;
//var contents = ""+newHandleResponse;
//alert(newHandleResponse);
//start = contents.substring(0,28);
//middle = "dave();";
//end = contents.substring(28, contents.length);
//alert(start);
//alert(middle);
//alert(end);


This creates a new String that holds the entirety of the function - with my new function in it... (dave();) but I can't override the existing function easily... any ideas?

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Tue Oct 09, 2007 6:08 am

In actual fact - what would be better LACK... is if you coded a dummy function...

i.e. refreshGMScript()

which was called from handleResponse() by you...

and then we could override refreshGMScript easily without having to merge your code into it...

Is this something that you could do?

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby Ishiro on Tue Oct 09, 2007 7:41 am

A dummy function would be great, especially if lack coded it to always be called last as a clean up once he's done all his stuff.

If you want to override lack's handleResponse, you can either:
a) copy his entire function and make the changes you need to it (this is what I'm currently working on).
pros: lets you place new code exactly where it is needed.
cons: it replaces lack's function and so if he makes changes to that function you will be ignoring it until you update your script.

b) make a copy of his function and throw in your own code like this:
Code: Select all
var newhandleResponse = unsafeWindow.handleResponse;
unsafeWindow.handleResponse = function() {
   //put all your new code here
   return newhandleResponse();
}

pros: doesn't replace lack's code, so when he makes changes you won't be ignoring his new code.
cons: as I've mentioned before, the handleResponse function is called 4 or 5 times per action, so BOB executes 4 or 5 times making it slow and actually breaking the map (it "freezes", stops updating with the AJAX).
Image
User avatar
Corporal 1st Class Ishiro
 
Posts: 324
Joined: Mon Jul 17, 2006 5:53 pm
Location: Under the Rainbow
Medals: 10
Standard Achievement (2) Doubles Achievement (1) Triples Achievement (1) Terminator Achievement (1) Assassin Achievement (1)
Cross-Map Achievement (1) Ratings Achievement (1) General Contribution (2)

Postby yeti_c on Tue Oct 09, 2007 8:07 am

Ishiro wrote:A dummy function would be great, especially if lack coded it to always be called last as a clean up once he's done all his stuff.

If you want to override lack's handleResponse, you can either:
a) copy his entire function and make the changes you need to it (this is what I'm currently working on).
pros: lets you place new code exactly where it is needed.
cons: it replaces lack's function and so if he makes changes to that function you will be ignoring it until you update your script.

b) make a copy of his function and throw in your own code like this:
Code: Select all
var newhandleResponse = unsafeWindow.handleResponse;
unsafeWindow.handleResponse = function() {
   //put all your new code here
   return newhandleResponse();
}

pros: doesn't replace lack's code, so when he makes changes you won't be ignoring his new code.
cons: as I've mentioned before, the handleResponse function is called 4 or 5 times per action, so BOB executes 4 or 5 times making it slow and actually breaking the map (it "freezes", stops updating with the AJAX).


Ah yes - that's a nice way of doing it - nice work Ishiro...

With regards to the 5 times calling...

I think you need to examine the parameters that are being called upon it... that way you could pick and choose which ones update your data...

--------------

I was thinking the best way for BOB to run is to hold all the data in arrays - and then only modify the data based on this turns action (Frist time init will be slow (as per) but each auto-refresh will be quicker... (You can hold the index of this)... this way you'll not have to do so much work... what do you reckon? (If a proper F5 is done though then a slow re-init will be run but that could be mentioned in the docs?)

n.b. for freestyle - will have to be this round... for sequential can be limited to the players turn.

The time consuming stuff of BOB is the Log parsing.

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby Twill on Tue Oct 09, 2007 8:28 am

You guys amaze me :)

Thanks for working so hard to get the monkey back up and running!
User avatar
Corporal 1st Class Twill
Retired Administrator
 
Posts: 3677
Joined: Fri Jan 20, 2006 10:54 pm
Medals: 11
Standard Achievement (3) Freestyle Achievement (2) Fog of War Achievement (1) Speed Achievement (1) Random Map Achievement (1)
Cross-Map Achievement (1) General Achievement (1) General Contribution (1)

Postby RiskTycoon on Tue Oct 09, 2007 10:56 am

I second that Twill...just wish I was smart enough to help lol but alas I am not......so I thank you code savvy people from the bottom of my CC heart!
Image
"How do you like that? Even among misfits you're a misfit!"
User avatar
Major RiskTycoon
 
Posts: 976
Joined: Wed Nov 29, 2006 3:29 pm
Location: Massachusetts, USA
Medals: 32
Standard Achievement (1) Doubles Achievement (3) Triples Achievement (4) Quadruples Achievement (2) Freestyle Achievement (1)
Nuclear Spoils Achievement (1) Fog of War Achievement (2) Teammate Achievement (2) Random Map Achievement (1) Cross-Map Achievement (3)
Ratings Achievement (2) Tournament Achievement (1) Clan Achievement (9)

Postby lackattack on Tue Oct 09, 2007 11:55 am

yeti_c wrote:In actual fact - what would be better LACK... is if you coded a dummy function...

i.e. refreshGMScript()

which was called from handleResponse() by you...

and then we could override refreshGMScript easily without having to merge your code into it...

Is this something that you could do?

C.


Done. Hope it helps..
User avatar
Private 1st Class lackattack
Retired Administrator
 
Posts: 6112
Joined: Sun Jan 01, 2006 10:34 pm
Location: Montreal, QC
Medals: 9
Standard Achievement (1) Doubles Achievement (1) Triples Achievement (1) Freestyle Achievement (1) Speed Achievement (1)
Teammate Achievement (1) Cross-Map Achievement (1) General Achievement (2)

Postby yeti_c on Wed Oct 10, 2007 3:02 am

Perfect... this should help the coding effort a great deal...

Ta,

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Wed Oct 10, 2007 9:58 am

Righto - here's an update for now...

My new BOB is working quite well... all the stats update themselves per turn... and that all works really well...

The only problem that I have is that my BOB script breaks the Map updates from AJAX!!

I will work on this Friday and see if I can stop that from happening... then will try and reintegrate the map inspectors and so forth...

Also I need to improve the parsing of the XML to read <required> tags and <bombardments>

But we're making good progress I think.

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby gimil on Wed Oct 10, 2007 10:40 am

keep it up yeti_C buddy your commitment outstands me :D
What do you know about map making, bitch?

natty_dread wrote:I was wrong


Top Score:2403
User avatar
Corporal 1st Class gimil
 
Posts: 8605
Joined: Sat Mar 03, 2007 12:42 pm
Location: United Kingdom (Scotland)
Medals: 39
Standard Achievement (3) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (2) Terminator Achievement (2)
Assassin Achievement (1) Freestyle Achievement (3) Fog of War Achievement (2) Speed Achievement (3) Teammate Achievement (2)
Cross-Map Achievement (2) Ratings Achievement (2) Map Contribution (7) Tournament Contribution (1) General Contribution (5)

Postby lackattack on Wed Oct 10, 2007 11:47 am

Keep in mind that with AJAX, you need to fetch updated maps with a url like this:

map.php?key=map24a3e7d1310463a58e66e4be29d9b943

The old way of passing armies to map.php is going the way of the dodo.
User avatar
Private 1st Class lackattack
Retired Administrator
 
Posts: 6112
Joined: Sun Jan 01, 2006 10:34 pm
Location: Montreal, QC
Medals: 9
Standard Achievement (1) Doubles Achievement (1) Triples Achievement (1) Freestyle Achievement (1) Speed Achievement (1)
Teammate Achievement (1) Cross-Map Achievement (1) General Achievement (2)

Postby yeti_c on Fri Oct 12, 2007 2:34 am

lackattack wrote:Keep in mind that with AJAX, you need to fetch updated maps with a url like this:

map.php?key=map24a3e7d1310463a58e66e4be29d9b943

The old way of passing armies to map.php is going the way of the dodo.


Yeah I worked that one out - I piggybacked your variable gameArmies -> which you update for me...

I think the map's not updating cos I've got a script error which is stopping the process from running...

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Fri Oct 12, 2007 7:24 am

Hmmm - still can't get the map updates to work...

Ishiro? Does your script stop the map from updating?

Drop me a PM if you like and we can discuss the merits of our 2 approaches and perhaps can merge the 2 into 1 working script?!

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby Ishiro on Fri Oct 12, 2007 7:35 am

Yep, it stops the map, and I have no idea why.

It does work if I strip the colors out of the map inspect and just have it load once to show attack paths but don't update it for changes. I think the browser may just not like the slew of updates and either kills it or is just really slow... I've never tried waiting to see if it catches up.
Image
User avatar
Corporal 1st Class Ishiro
 
Posts: 324
Joined: Mon Jul 17, 2006 5:53 pm
Location: Under the Rainbow
Medals: 10
Standard Achievement (2) Doubles Achievement (1) Triples Achievement (1) Terminator Achievement (1) Assassin Achievement (1)
Cross-Map Achievement (1) Ratings Achievement (1) General Contribution (2)

Postby yeti_c on Fri Oct 12, 2007 7:45 am

Ishiro wrote:Yep, it stops the map, and I have no idea why.

It does work if I strip the colors out of the map inspect and just have it load once to show attack paths but don't update it for changes. I think the browser may just not like the slew of updates and either kills it or is just really slow... I've never tried waiting to see if it catches up.


Bugger!!

The colours eh?! which bit?

The initialisation bit?

Or all the magicmap stuff?

At the mo my "magicmap" div can't be found - so I've commented it all out...

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby Ishiro on Fri Oct 12, 2007 8:08 am

The main thing you have to change in the script is that "inner-map" used to be a DIV, its not anymore, so most of the code that uses "inner-map" is broken.
Image
User avatar
Corporal 1st Class Ishiro
 
Posts: 324
Joined: Mon Jul 17, 2006 5:53 pm
Location: Under the Rainbow
Medals: 10
Standard Achievement (2) Doubles Achievement (1) Triples Achievement (1) Terminator Achievement (1) Assassin Achievement (1)
Cross-Map Achievement (1) Ratings Achievement (1) General Contribution (2)

Postby yeti_c on Fri Oct 12, 2007 8:19 am

Ishiro wrote:The main thing you have to change in the script is that "inner-map" used to be a DIV, its not anymore, so most of the code that uses "inner-map" is broken.


Yeah - at the mo I've dropped any innermap stuff... but I'll have a check!!

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Fri Oct 12, 2007 8:38 am

Right - I've disabled anything running on the refresh and it still doesn't work...

I reckon it must be the inital script that kills the map then...

Like you say - no div stuff now... I wonder if the div's added for the stats and map inspect etc stop the AJAX from working!?

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby Ishiro on Fri Oct 12, 2007 12:01 pm

It shouldn't... lack is referring to everything by name. But I know some of the stuff in BOB was doing things by type and counting them, I had to redo a bunch of that. I'd give you a copy but that PC is currently dead and I haven't had time to work on it.
Image
User avatar
Corporal 1st Class Ishiro
 
Posts: 324
Joined: Mon Jul 17, 2006 5:53 pm
Location: Under the Rainbow
Medals: 10
Standard Achievement (2) Doubles Achievement (1) Triples Achievement (1) Terminator Achievement (1) Assassin Achievement (1)
Cross-Map Achievement (1) Ratings Achievement (1) General Contribution (2)

Postby yeti_c on Mon Oct 15, 2007 3:01 am

I've had a thought - I suspect that this problem is security based...

The browser might be stopping the script from reaccessing the objects that are in the main page correctly...

I will run a couple of tests to see if this is truly the case...

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Mon Oct 15, 2007 3:06 am

I was wrong...

It's definitely something in the initialisation of the script that breaks the map...

To test this
I first stopped my refreshGMScript() doing anything... map still broken...
Then I stopped my refreshGMScript() function redefining itself - and the map is still broken...

So this can't be any security issue... their must be something that stops the map from refreshing in the init... I'll continue to work on this...

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Mon Oct 15, 2007 9:55 am

Righto - I've narrowed it down to the Card Redemption DIV...

I will attempt to recode this bit into something that doesn't break the map!!

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby yeti_c on Mon Oct 15, 2007 10:15 am

Righto...

I think I have an AJAX compatible BOB...

Not all of the features are in yet...

and things like <required> for continents aren't finished yet...

BUT it's a start...

I will send latest to LACK and get him to host for now... expect updates throughout this week to get it working...

Also feel free to post any errors/bugs in it into this thread...

C.
Image
Highest score : 2297
User avatar
Lieutenant yeti_c
 
Posts: 9670
Joined: Thu Jan 04, 2007 9:02 am
Medals: 46
Standard Achievement (2) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (3) Terminator Achievement (1)
Assassin Achievement (1) Freestyle Achievement (1) Fog of War Achievement (3) Cross-Map Achievement (3) Ratings Achievement (3)
General Achievement (1) Map Contribution (13) Tournament Contribution (1) General Contribution (10)

Postby Rocketry on Mon Oct 15, 2007 10:18 am

good work so far lol. If i had a clue how to help, i would....

Rocketry
User avatar
Lieutenant Rocketry
 
Posts: 1468
Joined: Wed May 16, 2007 5:33 pm
Location: Westminster
Medals: 23
Standard Achievement (3) Doubles Achievement (2) Triples Achievement (2) Quadruples Achievement (2) Freestyle Achievement (1)
Fog of War Achievement (2) Speed Achievement (2) Cross-Map Achievement (1) Ratings Achievement (3) Tournament Achievement (1)
General Achievement (1) Clan Achievement (3)

PreviousNext

Return to Tool Archives

Who is online

Users browsing this forum: No registered users

cron
Login