Open hooptie45 opened 6 years ago
Current game log is useless. XMage show up only user friendly events, not all.
XMage have two different data source:
Yeah I've poked around that GameState object from the debugger, I suspected that that was what I was looking for. If I recall correctly, we'd need to map the UUID references to the game's permanents, but that should be strait forward.
I'm kind of a newbie Java developer, but could we get a REST interface for the server that would would expose an endpoint to get all the current games being played, and an endpoint that for a given game UUID, return a json serialized version of the GameState?
And from the GameState, is it possible to know the details of each turn that was played up till that point? The entire GameState object might be overkill for this use case, just the basic information would be a great start.
To avoid constantly hammering the xmage server, I think dumping this data to a log file, or kafka stream might be something worth considering. I'd be happy it provide that, via something like a webhook; which the xmage server could ping after each state change(like after each player interaction) with a JSON payload of the current game state. If that was in place, I could build the API to expose the data.
We shouldn't give access to GameState while a match is in progress. You could use it to see the opponent's hand and library.
You can't send GameState data to outside -- it's a cheat and users can't see full game data. It can be implemented by special server mode to process and save full game histories. Look at "testMode" as example.
GameStates
object can contain history. It's uses for rollback to previous states (by user request or by ability action). Can be found in GameImpl.java
.
By theory you can inject your code to void resume()
or void play(UUID nextPlayerId)
to save current state history, write json-logs or upstream data to outside (e.g. AI bot can access to that data at any time by API request).
Same code can be used to implement game's replay system (history of GameView objects).
@emerald000 I was thinking about this (for a somewhat different reason). Implementing something similar to https://github.com/magefree/mage/issues/3218 - but with extra information such as 'Player XYZ has priority' would be useful.
The more I think about it, dumping the GameState data to a file during the resume phase would be the way to go. Then we're not exposing anything to the outside during the game.
A similar hook can be added to the end game phase, which would flag that game log as ready for consumption. A separate worker process could be in charge of processing and cleaning up the finished game logs. The idea is to make this as lightweight as possible, so it doesn't effect the game servers performance.
Thoughts?
So the logs would only available for processing after the game is over?
@jdsiddon That is correct. We'd be capturing the data as the game is in progress, but we'd defer releasing the data until after the game is finished.
I think this would be a good idea.
I guess to create a JSON log on the client side would be possible and useful as AI data base also as a base to automatically analyse games. It would only inlude the data that the client can see. And it wouldn't burden the server.
Looking in the future and be aware that this would create a lot of work: The best way in my opinion would be to replace the current views that way too often transfer the complete state information (from the client view) by a serial protocol (e.g. JSON format) that only transfers the changes compared to the last transfered data or the action a player did. That would probably enormously reduce the transfered data and help to solve the network problems. For sure the client has to be able to request a complete state (e.g. for reconnecting or if something gets out of order).
JSONL is good one for streaming and storage.
I like Russian Sberbank Holdem Challenge for AI last year with good docs and materials (but russian only). It's use JSON for data and streaming for poker game with AI -- game states, replays, streaming and AI. Same as XMage. You can find git repository here.
JSON streaming file example: https://github.com/sberbank-ai/holdem-challenge/blob/master/simulator_stdin_example.jsonlines
@LevelX2 - regarding the client side Json logs, I think that would be a viable alternative; provided that we include a hook submit the this log back to a central service upon game completion; for mass analysis. I'd be happy to provide that service and expose the data for all who are interested. We might wanna make that opt Regarding the Json driven client; this is something we should absolutely do! I'd really love to see a web based interface to replace the Java client; and there is alot of good frameworks to make this possible (graphql subscriptions, or websockets). If you provide the API; I'd be very interested in helping build out the web-ui; and the GraphQL server. This should probably be a separate issue, as it will be a substantial amount of work; but I'd like to get the conversation started.
@JayDi85 - that is a great find, and exactly what I was thinking we could do with xmage!
MTGA example (current open beta saved full game logs and input-output json-messages):
There can be a wealth of knowledge derived from the game logs. Unfortunately it's not really in a form that is easily consumable. How much effort would it take to produce a log of all the game events as JSON? Also, would it be possible to have this log at both the client and server level?
My use case is applying this to machine learning, and using the past games as kind of a training set. But I'm sure there are other uses.