function __callback(bytes32 _queryId, string _result, bytes _proof) public {
        uint rollId = uint(keccak256(_queryId));
        address player = rollIdToGameAddress[rollId];
        require(msg.sender == oraclize_cbAddress());

        
        if (player == address(0)) {
            failedRolls[rollId] = rollId;
            return;
        }

        if (oraclize_randomDS_proofVerify__returnCode(_queryId, _result, _proof) != 0) {

            Game storage game = gamesInProgress[player];
            if (game.bet > 0) {
                game.player.transfer(game.bet);
            }

            delete gamesInProgress[player];
            delete rollIdToGameAddress[rollId];
            delete failedRolls[rollId];
            GameError(player, game.id, rollId);

        } else {
            uint8 randomNumber = uint8((uint(keccak256(_result)) % NUM_DICE_SIDES) + 1);
            processDiceRoll(player, randomNumber);

        }

        delete rollIdToGameAddress[rollId];
    }