Page 1 of 1

I analyzed 2,150 doubles games to find my best partner

Posted: Thu Oct 01, 2026 7:57 pm
by CBlake
Its no secret that I love a good team game.

For me the victory is better shared and its more fun that way. I've been on this site since 2006 and played with a number of different people. I thought it'd be fun to do a look back at who I had the best (and least) success with.

This is just for fun ultimately because this user base is dwindling and I love playing with everyone that i've played with

I'll keep the old school players on the leaderboard but the commentary will be for more recent players as they are still here :-)

This summary was analyzed and generated by Claude but i'll also add my own thoughts here and there:

KJ Hunter is the undisputed GOAT - I appreciate our games my friend. KKlemen is not too far behind!

Greatwhite, Middleton, PROFITS - we win alot but at what cost :-). Losses can be very expensive these days

Bluefalchion - I need to stop making you play CCU hehe


2007spaceodyssey, Natascha, Khayam, Tazyoglu - stop joining my games ;) kidding but I have some work to do!




__________________________________________________________________________
THE HEADLINE NUMBERS
  • Overall: 1,333-817 (62% wins), +2,488 net points, 271 different partners, 2006-2026
  • Since 2024: 1,139 games, 668-471 (59%), only +337 (+0.3 per game, vs +2.1 per game before 2024). The modern era is a much tougher points environment.
  • Multi-team games are brutal: 2x3 and bigger win just 40% of the time, vs 64% in standard 2v2 (pure chance in a 3-team game is 33%)
______________________________________________________________________

ALL-TIME PARTNER LEADERBOARD
Top 30 by net points, minimum 10 games together

Code: Select all

 #  Partner          Games  Record  Win%   Net  Pts/G  Years
--  ---------------  -----  ------  ----  ----  -----  ---------
 1  KJHunter           168  102-66   61%  +658   +3.9  2025-2026
 2  UCAbears           111   72-39   65%  +556   +5.0  2006-2015
 3  alster              61   44-17   72%  +244   +4.0  2006-2018
 4  KKlemen             68   47-21   69%  +237   +3.5  2026
 5  eddymush            58   39-19   67%  +209   +3.6  2006-2013
 6  phishn80            43   31-12   72%  +204   +4.7  2006-2018
 7  cmeb4udie           58   48-10   83%  +180   +3.1  2006-2007
 8  KidTwist            38   27-11   71%  +169   +4.4  2006-2007
 9  Rynn                20    16-4   80%  +135   +6.8  2006-2007
10  jaydog              31    22-9   71%  +129   +4.2  2006-2013
11  Master Chief        18    13-5   72%  +109   +6.1  2006-2013
12  beardbuster         41   25-16   61%  +103   +2.5  2025-2026
13  reverend_kyle       35   25-10   71%  +103   +2.9  2006-2007
14  eye84free           27    19-8   70%   +89   +3.3  2006-2013
15  Darkended Blade     69   37-32   54%   +75   +1.1  2025-2026
16  ptlowe              14    11-3   79%   +68   +4.9  2006-2012
17  Marie LaVeaux       11     6-5   55%   +63   +5.7  2017-2026
18  Greatwhite          67   48-19   72%   +59   +0.9  2017-2026
19  FUUF                65   39-26   60%   +58   +0.9  2025-2026
20  shoop76             31   21-10   68%   +54   +1.7  2008-2026
21  SC MAN              32   17-15   53%   +51   +1.6  2008-2026
22  mchs35              11     7-4   64%   +47   +4.3  2013
23  Jones888            23   12-11   52%   +42   +1.8  2025-2026
24  Yellow Peril        26   16-10   62%   +31   +1.2  2013
25  Paul906             32   17-15   53%   +29   +0.9  2025-2026
26  middleton          128   85-43   66%   +24   +0.2  2025-2026
27  owenshooter         20    11-9   55%   +21   +1.1  2025-2026
28  subjekt             19    13-6   68%   +11   +0.6  2007
29  Mike Doherty        15    10-5   67%    +0   +0.0  2006-2007
30  riverj              14     8-6   57%    -3   -0.2  2026
______________________________________________________________________

TOP 8 ACTIVE PARTNERS
Played together in 2024 or later (all-time stats together)

1. KJHunter - +658, 102-66 (61%) The GOAT
  • Multi-team games are the whole story. In 2x3 through 2x6 we went 20-16 (56%) for +411, which is 62% of our total net from 21% of our games.
  • Everyone else I've partnered combined for -739 in multi-team games. Nobody else makes that format pay.
  • Our 2v2 record (82-50, 62%, +247) is about my average. The multi-team games drag the win % down and push the points way up. Worth the risk. Play more.
  • Skip fog: no fog 82-44 (+637), fog 20-22 (+21)
  • 30-round limit is the sweet spot: 25-10, +12.9 per game. No round limit: 17-17, -102
  • Best maps: Europa (11-4, +172), USA (9-4, +116), Doodle Earth (21-9, +102). Worst: Classic (8-7, -48)
  • Trouble teams: Natascha & 2007spaceodyssey (3-5, -59)
2. KKlemen - +237, 47-21 (69%) The hottest new partnership
  • No round limit or 30 rounds: 15-1, +212
  • 20-round limit: 32-20, just +25. Change that one setting and this team is elite.
  • USA: 7-0, +105. Europe: 8-2
  • Can't crack: Khayam & Tazyoglu (0-3, -56)
3. beardbuster - +103, 25-16 (61%)
  • Strong 2v2 team: 25-13, +187. Multi-team was 0-3, -84
  • Fog is a disaster: 0-5, -92. No fog: 25-11, +195
  • 20-round limit works here: 9-2, +10 per game. No round limit: 5-7, -61
  • Best: Germany 4-0, USA 5-1. Avoid: Portugal 0-3
4. Darkended Blade - +75, 37-32 (54%)
  • Settings decide this one: No Spoils 15-8 (+144) vs Escalating 9-12 (-71)
  • Unlimited reinforcements +126, Parachute -77
  • Australia 4-0 and Balkan 3-0. Europa 2-4 (-59)
  • AR & IceAR own us: 1-5
5. Greatwhite - +59, 48-19 (72%)
  • 62 of our 67 games were on British Isles
  • Winning a lot, but cheaply: average win +12.5, average loss -28
  • Great record, thin points
6. FUUF - +58, 39-26 (60%)
  • 30-round limit: 22-6, +216. No round limit: 8-13, -157. Enormous swing.
  • Flat Rate +139. No Spoils 4-8 (-101)
  • Europa 9-2. 4-1 vs bigstevie36 & timrs2001
7. shoop76 - +54, 21-10 (68%)
  • 30-round limit: 7-0, +91. Parachute: 6-1
  • Chaka015 & Tarzanchuck: 6-0, +81
  • Unlimited reinforcements is the leak (-29)
8. SC MAN - +51, 17-15 (53%)
  • Unlimited +111. Chained 4-5 (-72)
  • 20-round limit: 7-2, +91
  • Philippines and Brazil both 3-0. USA 1-3
One to watch: Marie LaVeaux has +5.7 per game, the best active rate, but only 11 games.
  • Top active partners by win % (20+ games): Greatwhite 72% (48-19), KKlemen 69% (47-21), shoop76 68% (21-10), middleton 66% (85-43), PROFITS 62% (40-25). KJHunter is down at 61%, because our multi-team games drag the win rate down while piling up the points.
______________________________________________________________________

OLD-SCHOOL LEGENDS
  • UCAbears (+556, 72-39): the original #1. +5.0 per game over 111 games is the best sustained rate in my history. USA 10-1.
  • alster (+244, 44-17): 77% in 2v2, and a perfect 12-0 vs Chaka015 & Tarzanchuck
  • eddymush (+209, 39-19): Classic specialist, 30-10 (+255) on Classic
  • phishn80 (+204, 31-12): Flat Rate was the key, 22-6 at +8.0 per game. USA 6-0
  • cmeb4udie (48-10, 83%): my best win rate ever, 36-6 on USA alone
  • Rynn (16-4): +6.8 per game, the best rate of anyone with 20+ games
______________________________________________________________________

Neg EV PARTNERSHIPS (that i still love playing with <3)
  • Bluefalchion (-203, 24-24): all the damage came in 20-round games (8-15, -233). CCU 2-6 (-126). Natascha & 2007spaceodyssey: 1-11, -246
  • JLiverwurst (-104 in just 15 games): 20-round limit 1-5, at -22 per game
  • PROFITS (-108 despite going 40-25): Chained -161, Parachute 15-6 (+79). Europa 11-1 (+118). Parachute on Europa flips this positive.
  • middleton (85-43, only +24 over 128 games): wins average +15, losses -29. Over half our games were vs bigstevie36 or timrs2001: 38-16, but -48 points. And when he plays against me, he's 10-4 (-157).
______________________________________________________________________

NEMESIS REPORT: WHO BEATS ME
Active since 2024

Hardest Teams (2v2, 5+ games, ranked by points lost)

Code: Select all

 #  Team                         Games  My Record   Net
--  ---------------------------  -----  ---------  ----
 1  2007spaceodyssey & Natascha     43      19-24  -217
 2  Khayam & Tazyoglu               18       3-15  -205
 3  FriendlyMe & kwall5             37      22-15  -107
 4  Angettes Boy & fritsyyy          6        2-4  -105
 5  Monkeymagic07 & huskerdu        33      19-14  -105
 6  BeN5487 & flipperskipper        26      14-12   -92
 7  Grysbaek & rgry                  6        1-5   -77
 8  Mussar & snusleppa               5        1-4   -76
 9  Dabar & dhx1301                 12        4-8   -74
10  AR & IceAR                      12       2-10   -72
Hardest Individual Players (10+ games, all formats)

Code: Select all

 #  Player            Games  My Record   Net  Partners Tried
--  ----------------  -----  ---------  ----  --------------
 1  Natascha             50      23-27  -252              18
 2  2007spaceodyssey     44      20-24  -194              19
 3  Chilic               14        7-7  -165               9
 4  middleton            14       4-10  -157               7
 5  kwall5               38      22-16  -129               7
 6  flipperskipper       54      32-22  -108              14
 7  Tazyoglu             19       4-15  -106               9
 8  Khayam               19       4-15  -106               9
 9  farinelli            12        5-7  -105               6
10  juke                 11        2-9  -105               8
  • Natascha & 2007spaceodyssey are public enemy #1. I've thrown 18 different partners at them and lost points with nearly all of them.
  • Khayam & Tazyoglu are the toughest per game: 3-15, about -11 every time we play them.
  • Winning record, losing points: kwall5, flipperskipper and FriendlyMe. I beat them more often than not, but they outrank me, so each loss costs more than each win pays.
  • AR & IceAR (2-10) are the hardest team I've played 10+ times.
Favorite Opponents
  • bigstevie36 & timrs2001: 49-16, +221. My most-played matchup
  • ConfederateSS: 77-25 across 102 games, +423, the most points I've taken from any single player
  • Pirlo & lokisgal: 6-0, +105
______________________________________________________________________

MY SETTINGS
All doubles games, any partner

Code: Select all

Setting     All-Time Pts/G  Since 2024 Pts/G  Since 2024 Record  Since 2024 Net
----------  --------------  ----------------  -----------------  --------------
Flat Rate             +0.9              +1.1            442-272            +817
Escalating            +1.0              -1.6              64-65            -204
No Spoils             +1.6              -0.8            161-131            -229
Parachute             +0.7              +0.7            182-118            +208
Chained               +0.3              +0.3            440-300            +253
Unlimited             +2.0              -0.5              44-48             -47
No Fog                +1.4              +0.5            571-392            +526
Fog                   -1.2              -1.1              97-79            -189
  • Flat Rate is the only spoils setting that still makes me points. Escalating and No Spoils both turned negative after 2024.
  • Fog has been net negative in every era.
  • My ideal game: 2v2, Flat Rate, no fog, Chained or Parachute reinforcements, sequential play
______________________________________________________________________

MAP PERFORMANCE
Maps with 15+ doubles games, ranked by net points

Code: Select all

Map                 Games   Record  Win%    Net  Pts/G
------------------  -----  -------  ----  -----  -----
Classic               515  345-170   67%  +1289   +2.5
USA                   237   169-68   71%   +998   +4.2
CCU                    84    57-27   68%   +300   +3.6
Europe                147    97-50   66%   +271   +1.8
Balkan Peninsula       20     16-4   80%   +185   +9.2
Iberia                 31    21-10   68%   +182   +5.9
Canada                 47    29-18   62%   +143   +3.0
Europa                128    79-49   62%   +134   +1.0
Tamriel                38    23-15   61%   +114   +3.0
Doodle Earth           32    22-10   69%    +81   +2.5
Discworld              66    40-26   61%    +76   +1.2
Hong Kong              22     13-9   59%    +65   +3.0
Alexander's Empire     21     15-6   71%    +59   +2.8
Philippines            44    24-20   55%    +31   +0.7
Japan                  18     12-6   67%    +30   +1.7
Montreal               26    16-10   62%    +22   +0.8
Midgard                20     12-8   60%    +20   +1.0
France                 33    20-13   61%    +10   +0.3
Germany                51    31-20   61%     -7   -0.1
Vancouver              25    15-10   60%    -38   -1.5
Australia              44    24-20   55%    -41   -0.9
Arctic                 24    13-11   54%    -53   -2.2
British Isles         118    73-45   62%    -99   -0.8
Portugal               22     7-15   32%   -249  -11.3
Brazil                 48    20-28   42%   -344   -7.2
Europe is the modern-era money map: 81–36 for +413. That's more than your entire net since 2024 (+337), so every other map combined is slightly negative.
Balkan Peninsula is the best per game: 15–3, at +10.1 every time you play it.
Brazil and Portugal together cost 542 points. Drop just those two maps and your since-2024 net jumps from +337 to +879.
British Isles is the trap: a 60–38 winning record that still nets −95.
  • Best map: USA, +4.2 per game over 237 games. Hidden gem: Balkan Peninsula, +9.2 per game, and 15-3 since 2024.
  • Since 2024, Europe is my top earner: 81-36, +413
  • Never again: Brazil and Portugal. Since 2024 I'm 8-20 (-321) on Brazil and 6-13 (-221) on Portugal. Those two maps cost more than half of everything I've earned this era.
  • British Isles looks good and isn't: 62% wins, still net negative
______________________________________________________________________

Method: partners need 10+ games for the leaderboard. "Active" means we played together in 2024 or later; their stats include all our games together. Points count scored games only. Partner splits need 3+ games, opposing teams 5+, individual players 10+.

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Thu Oct 01, 2026 8:56 pm
by Paul906
Interesting. I'm glad I made the list even if down. LOL

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Thu Oct 01, 2026 10:10 pm
by fritsyyy
AHHHH YESSSS... I DO RECALL PULLING YOUR PANTS DOWN SEVERAL TIMES.... BIG FRITSYYYYY

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Fri Oct 02, 2026 8:38 am
by Darkended Blade
I made the cut! Huzzah!

And yea avoid AR at all costs 🤣

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Fri Oct 02, 2026 1:39 pm
by KKlemen
Glad to have made it to 2nd position in this year alone ;)

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 03, 2026 12:04 am
by ConfederateSS
-------------------You are one of The Great Players on the site......CBlake :roll: =D> =D> =D> ..........I have enjoyed all our games......I just like playing R.I.S.K....Winning, rank, I don't worry about that........It's meeting people from around the world...The fun in games, chat, events......Is what I look forward to....... O:) ConfederateSS.out!(The Blue and Silver Rebellion)... O:)

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 03, 2026 6:18 am
by CBlake
Paul906 wrote: Thu Oct 01, 2026 8:56 pm Interesting. I'm glad I made the list even if down. LOL
Old school legends!!

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 03, 2026 6:19 am
by CBlake
fritsyyy wrote: Thu Oct 01, 2026 10:10 pm AHHHH YESSSS... I DO RECALL PULLING YOUR PANTS DOWN SEVERAL TIMES.... BIG FRITSYYYYY
LOL

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 03, 2026 6:32 am
by CBlake
Darkended Blade wrote: Fri Oct 02, 2026 8:38 am I made the cut! Huzzah!

And yea avoid AR at all costs 🤣
Lets goooo - more to come!

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 03, 2026 6:33 am
by CBlake
KKlemen wrote: Fri Oct 02, 2026 1:39 pm Glad to have made it to 2nd position in this year alone ;)
=D> =D> let's keep it rollin!

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 03, 2026 6:34 am
by CBlake
ConfederateSS wrote: Sat Oct 03, 2026 12:04 am -------------------You are one of The Great Players on the site......CBlake :roll: =D> =D> =D> ..........I have enjoyed all our games......I just like playing R.I.S.K....Winning, rank, I don't worry about that........It's meeting people from around the world...The fun in games, chat, events......Is what I look forward to....... O:) ConfederateSS.out!(The Blue and Silver Rebellion)... O:)
Likewise Confed. Agreed - its a great way to pass time. I'll never forget you beating me in that Europe monthly challenge though :cry: im going to get you one of these times!

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Tue Oct 06, 2026 12:09 am
by owenshooter
The only thing that was able to stop us was TWILL and those entrenched in power, during that period of our reign of terror!!! I still laugh when I think back on our public "hearing" in which we were openly accused of cheating!! "No two youths can be this damn good."



Send me some games, let's rock the house!!!



The black jesus has spoken...-Jesus noir

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Tue Oct 06, 2026 3:06 am
by IceAR
Darkended Blade wrote: Fri Oct 02, 2026 8:38 am And yea avoid AR at all costs 🤣
Is this why it takes so long for people to join our games :roll:

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Fri Oct 09, 2026 12:41 pm
by aad0906
I'll happily beat Natascha & 2007spaceodyssey together with you.

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Fri Oct 09, 2026 6:45 pm
by Dukasaur
Pretty cool analysis!

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Fri Oct 09, 2026 10:54 pm
by zen330
Nice analysis, any chance you think of you giving/selling the program to the site so that they could let players use it for themselves (maybe as a paid feature)?

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Fri Oct 09, 2026 10:55 pm
by zen330
zen330 wrote: Fri Oct 09, 2026 10:54 pm Nice analysis, any chance you think of you giving/selling the program to the site so that they could let players use it for themselves (maybe as a paid membership feature)?

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 10, 2026 7:20 am
by CBlake
zen330 wrote: Fri Oct 09, 2026 10:55 pm
zen330 wrote: Fri Oct 09, 2026 10:54 pm Nice analysis, any chance you think of you giving/selling the program to the site so that they could let players use it for themselves (maybe as a paid membership feature)?
No gatekeeping here.. I'll have Claude summarize how to do it below:



DISCLAIMER:

Please be considerate with this:
  • Run it occasionally to refresh your stats. Not every day.
  • Don't remove the built-in pause between requests. It's there so the script doesn't flood the server.
  • Pull your own history only. Please don't edit it to loop through lots of other players or the whole site.
  • If it errors out, wait a few minutes before trying again. Don't run it over and over.

This uses Conquer Club's public API, the same one stats tools use. A run is about the same load as clicking through your own game history. If lots of people ran it constantly, though, it could slow the site down. Let's keep it light.


How to pull your own game history and analyze it

A few people asked how I did my doubles analysis, so here's the full process. You don't need to know how to code. Total time is about 10 minutes plus however long the analysis takes.

______________________________________________________________________

Step 1: Export your games to a CSV file

This uses Conquer Club's own public game API. It only reads finished game data and saves a file to your computer. It doesn't touch your account, and it doesn't send your data anywhere.
  1. Open Google Chrome and go to any conquerclub.com page while logged in.
  2. Open the browser console:
    • Mac: Cmd + Option + J
    • Windows: Ctrl + Shift + J
    • Or right-click anywhere on the page, choose Inspect, then click the Console tab.
  3. Copy the whole script at the bottom of this post.
  4. Before running it, change one line: near the top, replace YOUR_USERNAME_HERE with your Conquer Club name, exactly as it's spelled (keep the quote marks).
  5. Click in the console, paste, and press Enter.
    • If Chrome won't let you paste, type allow pasting, press Enter, then paste again.
  6. You'll see lines like "Page 3 of 25 done." Leave the tab open until it finishes (usually under a minute).
  7. A file called conquer_club_games.csv downloads automatically. That's your full game history: every finished game, with your partner(s), opponents, map, every setting, and your net points for each game.
______________________________________________________________________

Step 2 (optional): Open it in Google Sheets
  1. Go to sheets.google.com and create a blank spreadsheet.
  2. File → Import → Upload, then choose the CSV file.
  3. Pick "Replace spreadsheet" and click Import.
Now you can sort and filter by partner, map, settings and so on. The CSV works fine on its own if you skip this step.

______________________________________________________________________

Step 3: Analyze it with an AI assistant

I used Claude, but any AI assistant that can read uploaded files and run code will work.
  1. Upload the CSV file into the chat.
  2. Ask your question in plain English. Some prompts to start with:
    • "This is my Conquer Club game history. Rank my doubles partners by net points, minimum 10 games together."
    • "What are my best and worst maps in doubles?"
    • "Which opponents and teams have taken the most points off me?"
    • "Which settings (spoils, reinforcements, fog) work best with my top partner?"
    • "How do I do in doubles vs triples vs quads vs 1v1s?"
  3. Ask follow-ups. That's where the interesting stuff comes out.
______________________________________________________________________

Tips so the results mean something
  • Set a minimum number of games. Otherwise a partner you went 3-0 with lands at #1.
  • Look at net points, not just win %. Beating lower-ranked players racks up wins but very few points.
  • Use only scored games for points. There's a "Scored" column; filter to "Yes".
  • Be skeptical of round-limit results. Very few games ever reach the round limit, so any pattern there is probably a coincidence.
  • Watch for clusters. A great record on one map might just be one hot month, or a site event where everyone was playing that map.
______________________________________________________________________

What's in the file
Game number, date, map, player count, game type, team game yes/no, team size, number of teams, format (2x2, 2x3...), every setting (spoils, reinforcements, fog, trench, round limit, round length, initial troops, play order), result, finish place, your net points, your team's net points, rounds played, tournament, private, up to 3 teammates, up to 11 opponents (grouped by team), who beat you, a game link, and whether the game was scored.

Games with more than 12 players are skipped.

______________________________________________________________________

The script
Remember to change YOUR_USERNAME_HERE first.

Code: Select all

// Conquer Club -> CSV export (run in your browser console while on conquerclub.com)
// Downloads conquer_club_games.csv when done.
(async () => {
  const USERNAME = 'YOUR_USERNAME_HERE';   // <-- change this to your Conquer Club name
  const MAX_PLAYERS = 12, MAX_TEAMMATES = 3, MAX_OPPONENTS = 11;

  const GAME_TYPES = { S: 'Standard', C: 'Terminator', A: 'Assassin', P: 'Polymorphic', D: 'Doubles', T: 'Triples', Q: 'Quadruples' };
  const TEAM_SIZE = { D: 2, T: 3, Q: 4 };
  const INITIAL_TROOPS = { E: 'Automatic', M: 'Manual' };
  const PLAY_ORDER = { S: 'Sequential', F: 'Freestyle' };
  const SPOILS = { '1': 'No Spoils', '2': 'Escalating', '3': 'Flat Rate', '4': 'Nuclear', '5': 'Zombie' };
  const REINFORCEMENTS = { C: 'Chained', O: 'Adjacent', M: 'Unlimited', P: 'Parachute', N: 'None' };

  const user = USERNAME.toLowerCase();
  const pad2 = x => String(x).padStart(2, '0');
  const fmtDate = d => d ? `${pad2(d.getMonth() + 1)}/${pad2(d.getDate())}/${String(d.getFullYear()).slice(2)}` : '';
  const fmtMonth = d => d ? `${d.getFullYear()}-${pad2(d.getMonth() + 1)}` : '';
  const padArr = (arr, len) => arr.slice(0, len).concat(Array(Math.max(0, len - arr.length)).fill(''));
  const childText = (el, name) => {
    const c = [...el.children].find(x => x.tagName === name);
    return c ? c.textContent.trim() : '';
  };

  const headers = ['Game #', 'Date', 'Started', 'Month', 'Map', 'Players', 'Game Type', 'Team Game', 'Team Size', 'Teams',
    'Format', 'Multi-Team', 'Slots Per Player', 'Initial Troops', 'Play Order', 'Spoils', 'Reinforcements',
    'Fog of War', 'Trench Warfare', 'Round Limit', 'Round Length', 'Result', 'Finish Place', 'My Net Points',
    'Team Net Points', 'Rounds Played', 'Tournament', 'Private'];
  for (let i = 1; i <= MAX_TEAMMATES; i++) headers.push('Teammate ' + i);
  headers.push('Teammates (all)');
  for (let i = 1; i <= MAX_OPPONENTS; i++) headers.push('Opponent ' + i);
  headers.push('Opposing Teams', 'Beaten By', 'Link', 'Points Logged', 'Scored');

  const rows = [];
  const log = { apiTotal: '', fetched: 0, kept: 0, tooMany: 0, noUser: 0, noPoints: 0, scored: {}, types: {} };

  function parseGame(g) {
    const t = name => childText(g, name);
    const playersEl = [...g.children].find(x => x.tagName === 'players');
    const pEls = playersEl ? [...playersEl.children] : [];

    // Seats (a polymorphic player holds several seats under the same name)
    const seatNames = pEls.map(p => p.textContent.trim());
    const seatStates = pEls.map(p => p.getAttribute('state') || '');
    const nSeats = seatNames.length;

    // People, in first-seat order
    const people = [];
    seatNames.forEach(nm => { if (!people.includes(nm)) people.push(nm); });
    const nPeople = people.length;
    if (nPeople > MAX_PLAYERS) return 'TOO_MANY';

    const meName = people.find(x => x.toLowerCase() === user);
    if (!meName) return 'NO_USER';
    const mySeats = seatNames.map((nm, i) => nm === meName ? i : -1).filter(i => i >= 0);
    const personWon = nm => seatNames.some((x, i) => x === nm && seatStates[i] === 'Won');

    const typeCode = t('game_type');
    const teamSize = TEAM_SIZE[typeCode] || 1;
    const isTeam = teamSize > 1;
    const numTeams = isTeam ? Math.round(nSeats / teamSize) : nPeople;
    const teamOf = i => Math.floor(i / teamSize);
    const myTeam = teamOf(mySeats[0]);

    const teammates = [], oppTeams = [];
    if (isTeam) {
      for (let k = 0; k < numTeams; k++) {
        const members = [];
        for (let i = k * teamSize; i < Math.min((k + 1) * teamSize, nSeats); i++) {
          if (seatNames[i] !== meName && !members.includes(seatNames[i])) members.push(seatNames[i]);
        }
        if (k === myTeam) teammates.push(...members); else oppTeams.push(members);
      }
    } else {
      people.forEach(nm => { if (nm !== meName) oppTeams.push([nm]); });
    }
    const opponents = [].concat(...oppTeams);

    // Event log: points per seat, dates, seat elimination order
    const seatPts = Array(nSeats).fill(0), seatElim = [];
    let start = null, end = null, pointsLogged = false, eventCount = 0;
    const eventsEl = [...g.children].find(x => x.tagName === 'events');
    if (eventsEl) {
      [...eventsEl.children].forEach(e => {
        eventCount++;
        const ts = Number(e.getAttribute('timestamp')) || null;
        if (ts) { if (start === null || ts < start) start = ts; if (end === null || ts > end) end = ts; }
        const txt = e.textContent.trim();
        let m = txt.match(/^(\d+) (gains|loses) (\d+) points?$/);
        if (m) {
          pointsLogged = true;
          const s = +m[1] - 1;
          if (s >= 0 && s < nSeats) seatPts[s] += (m[2] === 'gains' ? 1 : -1) * +m[3];
          return;
        }
        m = txt.match(/^\d+ eliminated (\d+) from the game$/) || txt.match(/^(\d+) was kicked out/);
        if (m) { const s = +m[1] - 1; if (s >= 0 && s < nSeats && !seatElim.includes(s)) seatElim.push(s); }
      });
    }
    if (!pointsLogged) log.noPoints++;

    // Scored: use an explicit tag if the API ever adds one, otherwise infer from the event log
    const scoredTag = t('scored') || t('ranked');
    let scored;
    if (scoredTag) scored = /^(y|yes|1)$/i.test(scoredTag) ? 'Yes' : 'No';
    else if (pointsLogged) scored = 'Yes';
    else if (eventCount > 0) scored = 'No';
    else scored = 'Unknown';
    log.scored[scored] = (log.scored[scored] || 0) + 1;

    const myNet = mySeats.reduce((sum, i) => sum + seatPts[i], 0);
    let teamNet = myNet;
    if (isTeam) { teamNet = 0; for (let i = 0; i < nSeats; i++) if (teamOf(i) === myTeam) teamNet += seatPts[i]; }

    // A person is out once all their seats are out
    const personElim = [];
    seatElim.forEach((s, idx) => {
      const nm = seatNames[s];
      if (personElim.includes(nm)) return;
      const outSoFar = new Set(seatElim.slice(0, idx + 1));
      if (seatNames.every((x, i) => x !== nm || outSoFar.has(i))) personElim.push(nm);
    });

    const iWon = personWon(meName);
    let place = '';
    if (!isTeam) {
      if (iWon) place = 1;
      else { const ei = personElim.indexOf(meName); if (ei !== -1) place = nPeople - ei; }
    }

    const myTeamNames = isTeam ? seatNames.filter((x, i) => teamOf(i) === myTeam) : [meName];
    const winners = people.filter(nm => personWon(nm) && !myTeamNames.includes(nm));
    const endDate = end ? new Date(end * 1000) : null;
    const startDate = start ? new Date(start * 1000) : null;
    const speed = t('speed_game'), roundLimit = t('round_limit'), gameNum = t('game_number');

    return [
      +gameNum, fmtDate(endDate), fmtDate(startDate), fmtMonth(endDate), t('map'), nPeople,
      GAME_TYPES[typeCode] || typeCode, isTeam ? 'Yes' : 'No', teamSize, numTeams, `${teamSize}x${numTeams}`,
      isTeam && numTeams > 2 ? 'Yes' : 'No',
      typeCode === 'P' ? t('poly_slots') : '',
      INITIAL_TROOPS[t('initial_troops')] || t('initial_troops'),
      PLAY_ORDER[t('play_order')] || t('play_order'),
      SPOILS[t('bonus_cards')] || t('bonus_cards'),
      REINFORCEMENTS[t('fortifications')] || t('fortifications'),
      t('war_fog') === 'Y' ? 'Yes' : 'No',
      t('trench_warfare') === 'Y' ? 'Yes' : 'No',
      roundLimit === '0' || roundLimit === '' ? 'None' : roundLimit,
      speed === 'N' ? '24 Hours' : (/^\d+$/.test(speed) ? speed + ' Min' : speed),
      iWon ? 'Won' : 'Lost', place, myNet, teamNet, t('round'),
      t('tournament'), t('private') === 'Y' ? 'Yes' : 'No',
      ...padArr(teammates, MAX_TEAMMATES), teammates.join(', '),
      ...padArr(opponents, MAX_OPPONENTS),
      oppTeams.map(tm => tm.join(' & ')).join(' | '),
      winners.join(', '),
      'https://www.conquerclub.com/game.php?game=' + gameNum,
      pointsLogged ? 'Yes' : 'No',
      scored,
    ];
  }

  let page = 1, totalPages = 1;
  while (page <= totalPages) {
    const res = await fetch(`/api.php?mode=gamelist&gs=F&events=Y&names=Y&un=${encodeURIComponent(USERNAME)}&page=${page}`);
    const doc = new DOMParser().parseFromString(await res.text(), 'application/xml');
    const root = doc.documentElement;
    totalPages = parseInt((childText(root, 'page') || '1 of 1').split(' of ')[1], 10) || 1;
    const gamesEl = [...root.children].find(x => x.tagName === 'games');
    if (!gamesEl) break;
    log.apiTotal = gamesEl.getAttribute('total');
    const games = [...gamesEl.children].filter(x => x.tagName === 'game');
    if (!games.length) break;
    games.forEach(g => {
      log.fetched++;
      const r = parseGame(g);
      if (r === 'TOO_MANY') { log.tooMany++; return; }
      if (r === 'NO_USER') { log.noUser++; return; }
      rows.push(r); log.kept++;
      log.types[r[6]] = (log.types[r[6]] || 0) + 1;
    });
    console.log(`Page ${page} of ${totalPages} done (${log.kept} games kept so far)`);
    page++;
    await new Promise(r => setTimeout(r, 300));
  }

  rows.sort((a, b) => b[0] - a[0]);
  const esc = v => { const s = String(v ?? ''); return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; };
  const csv = [headers, ...rows].map(r => r.map(esc).join(',')).join('\n');
  const a = document.createElement('a');
  a.href = URL.createObjectURL(new Blob([csv], { type: 'text/csv' }));
  a.download = 'conquer_club_games.csv';
  document.body.appendChild(a); a.click(); a.remove();

  console.log('DONE', {
    'API reported total': log.apiTotal, 'Games fetched': log.fetched, 'Games kept': log.kept,
    'Skipped >12 players': log.tooMany, 'Skipped (username not found)': log.noUser,
    'Kept games with no points in log': log.noPoints, 'Scored': log.scored, 'Kept by type': log.types,
  });
})();

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 10, 2026 8:12 am
by CBlake
Dukasaur wrote: Fri Oct 09, 2026 6:45 pm Pretty cool analysis!
cheers!

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 10, 2026 8:12 am
by CBlake
aad0906 wrote: Fri Oct 09, 2026 12:41 pm I'll happily beat Natascha & 2007spaceodyssey together with you.
lets do it!!! Always down to give it a go

Re: I analyzed 2,150 doubles games to find my best partner

Posted: Sat Oct 10, 2026 8:13 am
by CBlake
owenshooter wrote: Tue Oct 06, 2026 12:09 am The only thing that was able to stop us was TWILL and those entrenched in power, during that period of our reign of terror!!! I still laugh when I think back on our public "hearing" in which we were openly accused of cheating!! "No two youths can be this damn good."



Send me some games, let's rock the house!!!



The black jesus has spoken...-Jesus noir
ready to roll whenever!