Commit graph

22465 commits

Author SHA1 Message Date
Shaun Hannah
6aeb3c7c3a [WIP] Consumable JSON game logs
As discussed in https://github.com/magefree/mage/issues/4515

This exposes a JSON log of game interactions that can be analyzed.

This is just a first pass, to get up to speed with how the messaging works. It'd like to trim down the messages much
further so they don't include redundant information in each message. Also gson supports much more advances serialization
options; such as using the @Expose annotation. We should probably use that, but I ran into some issues (I'm not a java
developer, so still learning).

TODO:
  These currently only exist on the client side; ideally we'd submit this logs back up to a central server after the
  games completion; thinking this could be simple via an S3 file drop, and a Lambda function to process and expose the
  logs; maybe via a kafka stream.

Examples of log messages are below:

```
{
  "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254",
  "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4",
  "type": "GAME_SELECT",
  "value": {
    "gameView": {
      "priorityTime": 3000,
      "players": [
        {
          "name": "computer",
          "life": 20,
          "counters": {}
        },
        {
          "name": "hooptie",
          "life": 20,
          "counters": {}
        }
      ],
      "hand": {
        "425d774f-ee0c-4a9b-8516-c98f886943f0": {
          "name": "Springleaf Drum",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{1}"
          ],
          "convertedManaCost": 1,
          "type": 0,
          "paid": false,
          "id": "425d774f-ee0c-4a9b-8516-c98f886943f0"
        },
        "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff": {
          "name": "Blade of the Bloodchief",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{1}"
          ],
          "convertedManaCost": 1,
          "type": 0,
          "paid": false,
          "id": "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff"
        },
        "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806": {
          "name": "Ornithopter",
          "power": "0",
          "toughness": "2",
          "loyalty": "",
          "manaCost": [
            "{0}"
          ],
          "convertedManaCost": 0,
          "type": 0,
          "paid": false,
          "id": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
        },
        "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64": {
          "name": "Springleaf Drum",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{1}"
          ],
          "convertedManaCost": 1,
          "type": 0,
          "paid": false,
          "id": "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64"
        },
        "91239f4f-9003-4c48-8ca1-4c318f892489": {
          "name": "Cranial Plating",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{2}"
          ],
          "convertedManaCost": 2,
          "type": 0,
          "paid": false,
          "id": "91239f4f-9003-4c48-8ca1-4c318f892489"
        },
        "feb268d8-0535-4a9c-8915-83dd92a08c4c": {
          "name": "Arcbound Ravager",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{2}"
          ],
          "convertedManaCost": 2,
          "type": 0,
          "paid": false,
          "id": "feb268d8-0535-4a9c-8915-83dd92a08c4c"
        }
      },
      "canPlayInHand": [
        "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
      ],
      "stack": {},
      "combat": [],
      "phase": "PRECOMBAT_MAIN",
      "step": "PRECOMBAT_MAIN"
    },
    "message": "Play spells and abilities.",
    "options": {
      "queryType": "SELECT"
    }
  }
}
{
  "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254",
  "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4",
  "type": "SEND_PLAYER_UUID",
  "value": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
}
{
  "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254",
  "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4",
  "type": "GAME_CHOOSE_PILE",
  "value": {
    "choices": {
      "1ecf8671-be4c-4060-a76b-af614235a5b7": "Cast Ornithopter"
    }
  }
}
{
  "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254",
  "sessionId": "5c4o149-3v2cj2-je43178o-1-je43179f-4",
  "type": "GAME_INIT",
  "value": {
    "priorityTime": 3000,
    "players": [
      {
        "name": "computer",
        "life": 20,
        "counters": {}
      },
      {
        "name": "hooptie",
        "life": 20,
        "counters": {}
      }
    ],
    "hand": {
      "425d774f-ee0c-4a9b-8516-c98f886943f0": {
        "name": "Springleaf Drum",
        "power": "0",
        "toughness": "0",
        "loyalty": "",
        "manaCost": [
          "{1}"
        ],
        "convertedManaCost": 1,
        "type": 0,
        "paid": false,
        "id": "425d774f-ee0c-4a9b-8516-c98f886943f0"
      },
      "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff": {
        "name": "Blade of the Bloodchief",
        "power": "0",
        "toughness": "0",
        "loyalty": "",
        "manaCost": [
          "{1}"
        ],
        "convertedManaCost": 1,
        "type": 0,
        "paid": false,
        "id": "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff"
      },
      "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806": {
        "name": "Ornithopter",
        "power": "0",
        "toughness": "2",
        "loyalty": "",
        "manaCost": [
          "{0}"
        ],
        "convertedManaCost": 0,
        "type": 0,
        "paid": false,
        "id": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
      },
      "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64": {
        "name": "Springleaf Drum",
        "power": "0",
        "toughness": "0",
        "loyalty": "",
        "manaCost": [
          "{1}"
        ],
        "convertedManaCost": 1,
        "type": 0,
        "paid": false,
        "id": "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64"
      },
      "91239f4f-9003-4c48-8ca1-4c318f892489": {
        "name": "Cranial Plating",
        "power": "0",
        "toughness": "0",
        "loyalty": "",
        "manaCost": [
          "{2}"
        ],
        "convertedManaCost": 2,
        "type": 0,
        "paid": false,
        "id": "91239f4f-9003-4c48-8ca1-4c318f892489"
      },
      "feb268d8-0535-4a9c-8915-83dd92a08c4c": {
        "name": "Arcbound Ravager",
        "power": "0",
        "toughness": "0",
        "loyalty": "",
        "manaCost": [
          "{2}"
        ],
        "convertedManaCost": 2,
        "type": 0,
        "paid": false,
        "id": "feb268d8-0535-4a9c-8915-83dd92a08c4c"
      }
    },
    "canPlayInHand": [
      "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
    ],
    "stack": {},
    "combat": [],
    "phase": "PRECOMBAT_MAIN",
    "step": "PRECOMBAT_MAIN"
  }
}
{
  "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254",
  "sessionId": "5c4o149-3v2cj2-je43178o-1-je43179f-4",
  "type": "GAME_SELECT",
  "value": {
    "gameView": {
      "priorityTime": 3000,
      "players": [
        {
          "name": "computer",
          "life": 20,
          "counters": {}
        },
        {
          "name": "hooptie",
          "life": 20,
          "counters": {}
        }
      ],
      "hand": {
        "425d774f-ee0c-4a9b-8516-c98f886943f0": {
          "name": "Springleaf Drum",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{1}"
          ],
          "convertedManaCost": 1,
          "type": 0,
          "paid": false,
          "id": "425d774f-ee0c-4a9b-8516-c98f886943f0"
        },
        "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff": {
          "name": "Blade of the Bloodchief",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{1}"
          ],
          "convertedManaCost": 1,
          "type": 0,
          "paid": false,
          "id": "dd41bb4b-7fc3-4a3c-a69c-d18e281a1bff"
        },
        "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806": {
          "name": "Ornithopter",
          "power": "0",
          "toughness": "2",
          "loyalty": "",
          "manaCost": [
            "{0}"
          ],
          "convertedManaCost": 0,
          "type": 0,
          "paid": false,
          "id": "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
        },
        "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64": {
          "name": "Springleaf Drum",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{1}"
          ],
          "convertedManaCost": 1,
          "type": 0,
          "paid": false,
          "id": "a2f9cc13-e71a-4c9c-96aa-5424ea1a6b64"
        },
        "91239f4f-9003-4c48-8ca1-4c318f892489": {
          "name": "Cranial Plating",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{2}"
          ],
          "convertedManaCost": 2,
          "type": 0,
          "paid": false,
          "id": "91239f4f-9003-4c48-8ca1-4c318f892489"
        },
        "feb268d8-0535-4a9c-8915-83dd92a08c4c": {
          "name": "Arcbound Ravager",
          "power": "0",
          "toughness": "0",
          "loyalty": "",
          "manaCost": [
            "{2}"
          ],
          "convertedManaCost": 2,
          "type": 0,
          "paid": false,
          "id": "feb268d8-0535-4a9c-8915-83dd92a08c4c"
        }
      },
      "canPlayInHand": [
        "06eb0a6c-1e70-4dc0-bd1c-93b6ea444806"
      ],
      "stack": {},
      "combat": [],
      "phase": "PRECOMBAT_MAIN",
      "step": "PRECOMBAT_MAIN"
    },
    "message": "Play spells and abilities.",
    "options": {
      "queryType": "SELECT"
    }
  }
}
{
  "gameId": "2cede8c5-ff8e-4f8c-b9ac-66af53c0a254",
  "sessionId": "5c4o149-678483-je42ycva-1-je42ycw2-4",
  "type": "SEND_PLAYER_UUID",
  "value": "1ecf8671-be4c-4060-a76b-af614235a5b7"
}
```
2018-02-26 19:23:00 -05:00
spjspj
871b035bb4
Merge pull request #4551 from spjspj/master
Adding in way to render Zendikar full art lands.
2018-02-26 15:31:10 +11:00
spjspj
afeb1c16ac Adding in way to render Zendikar full art lands.
Things still to do:
1) Get everyone to download the full art Face images
2) Add in the collector number to the Face images (<ImageDirector>/FACE/ZEN/Island.<numberneeded>.jpg for example)
3) Add in the ability to draw say BFZ / HOU full art lands as well.
4) Maybe even add in an UST (Unstable) way of rendering lands (with the swoosh of opaque full art down the bottom).
2018-02-26 15:22:59 +11:00
spjspj
576c1aec57 Adding in way to render Zendikar full art lands.
Things still to do:
1) Get everyone to download the full art Face images
2) Add in the collector number to the Face images (<ImageDirector>/FACE/ZEN/Island.<numberneeded>.jpg for example)
3) Add in the ability to draw say BFZ / HOU full art lands as well.
4) Maybe even add in an UST (Unstable) way of rendering lands (with the swoosh of opaque full art down the bottom).
2018-02-26 12:47:18 +11:00
LevelX2
ba483dd87a * Added a test for the new Blood Moon rule (set to @Ignored) because new rule is not implemented. 2018-02-25 21:59:06 +01:00
LevelX2
2fceafda93 * Fixed a bug that mana in the mana pool could not be used to pay mana costs that could only be payed with "you may spend mana as thought" effects (fixes #2581). 2018-02-25 21:53:47 +01:00
L_J
2c28f64294
CantBeBlockedByCreaturesAllEffect duration bugfix 2018-02-25 14:26:02 +00:00
LevelX2
0d4082c7f3 Merge origin/master 2018-02-25 12:34:27 +01:00
LevelX2
7e5f4f580d * Fixed wrong user active check for table health. 2018-02-25 12:33:57 +01:00
Oleg Agafonov
d7b19a1866 Fixed random game ends from 89b6aeacd6 2018-02-25 14:20:42 +04:00
LevelX2
4c88b8e6e3 * Fixed a bug of AttackedThisStepWatcher (fixes #4549). 2018-02-25 10:39:33 +01:00
LevelX2
309d4685e8 * Cleaned up FixedTargets MageObjectReference handling. 2018-02-24 17:28:55 +01:00
LevelX2
f6ad6b37c2 Merge origin/master 2018-02-24 17:10:37 +01:00
LevelX2
800daff304 * Fixed Vodalian War Machine watcher handling related to MageObjectReferences. 2018-02-24 17:10:13 +01:00
Oleg Agafonov
3e9f5d6e3b Merge remote-tracking branch 'production/master' into production_master 2018-02-24 19:52:33 +04:00
Oleg Agafonov
8238139192 * UI: added SVG icons support on x64 linux systems (see #4421, must cleanup xmage\mage-client\lib folder); 2018-02-24 19:52:25 +04:00
LevelX2
a6e389bbaa
Merge pull request #4542 from Zzooouhh/Zzooouhh-vwm
Implemented Vodalian War Machine (Fallen Empires complete) & some Legends cards
2018-02-24 16:45:42 +01:00
L_J
c00b8ad136
Merge pull request #4546 from Zzooouhh/master
Implemented Legions cards (completed Legions set)
2018-02-24 15:05:46 +01:00
L_J
459b81c967
Implemented cards 2018-02-24 13:52:07 +00:00
L_J
d3b4bd8d32
Implemented Whipgrass Entangler 2018-02-24 13:50:42 +00:00
L_J
e00a43f3f0
Implemented Mistform Wakecaster 2018-02-24 13:49:15 +00:00
L_J
4f17ea18c3
Implemented Beacon of Destiny 2018-02-24 13:47:54 +00:00
L_J
fa783708fe
Implemented cards 2018-02-24 11:30:16 +00:00
L_J
22a49caf56
Implemented Honorable Passage 2018-02-24 11:29:43 +00:00
L_J
3c2acc407c
Implemented Foreshadow 2018-02-24 11:28:49 +00:00
L_J
41e156ed32
Implemented Wind Shear 2018-02-24 11:27:44 +00:00
L_J
735a7668a1
Implemented Honorable Passage 2018-02-24 11:26:32 +00:00
LevelX2
3d372e7100 * Fixed bug of Defiant Vanguard not destroying aby creatures from blocking. Added test. 2018-02-24 12:23:50 +01:00
LevelX2
dfb9446994 * Some minor mainly fixed target changes. 2018-02-24 10:26:11 +01:00
LevelX2
b33e863262 Merge origin/master 2018-02-24 01:00:56 +01:00
LevelX2
9a95e49ac9 * Fixed Stifle rule text and some other minor things related to TragetActivatedAbility. 2018-02-24 01:00:23 +01:00
Jeff
cdb2404bb6 - Added requested card Mercadia's Downfall 2018-02-23 17:12:38 -06:00
LevelX2
cdbe1b0ad9 * Dinosaur Hunter - Fixed that its ability also triggered for non combat damage. 2018-02-24 00:07:45 +01:00
Jeff
3a5924270d - Added requested card Protective Sphere 2018-02-23 11:41:57 -06:00
LevelX2
eb537712d6 Merge origin/master 2018-02-23 16:01:22 +01:00
LevelX2
ecf7ca0a5b * City of Solitude - added a specific message fo rthe rule changing effect. 2018-02-23 16:00:49 +01:00
L_J
6c2e66cd57
Typo 2018-02-23 14:48:08 +00:00
L_J
a98f0f03c7
Code cleanup 2018-02-23 14:46:40 +00:00
L_J
ac09be4b2b
Fixed Torment of Hailfire interaction with Sigarda (fixes #4452) 2018-02-23 14:45:01 +00:00
Oleg Agafonov
e5ef545d8f * UI: fixed wrong feedback panel color for non active turn; 2018-02-23 18:21:08 +04:00
L_J
ecb95db541
Eye for an Eye rewrite (fixes #4103) 2018-02-23 13:36:23 +00:00
Oleg Agafonov
5b0e71021d Fixed compile error on getFixedTarget and failed test on new lower names 2018-02-23 16:16:47 +04:00
Oleg Agafonov
a2b6f83a3e Fixed compile error 2018-02-23 13:02:22 +04:00
L_J
2a26ef24a5
Nameless Race edit 2018-02-23 08:41:27 +00:00
L_J
38930c7079
Minion of the Wastes 2018-02-23 08:41:10 +00:00
L_J
03454d3261
Wood Elemental edit 2018-02-23 08:40:12 +00:00
L_J
5cb1d75a1d
Some more changes
Now it catches even instances of being exiled from owner's GY while the ability is still on the stack
2018-02-23 07:10:19 +00:00
L_J
7bbe01b25a
Updated Vodalian War Machine watcher with MageObjectReference 2018-02-23 06:35:13 +00:00
LevelX2
c02c5a175b * Fixed some target pointer handling. 2018-02-22 17:46:23 +01:00
Jeff
88dd301f82 - Added Penance to the Exodus set 2018-02-22 08:09:44 -06:00