function sendPrize(uint _gasLimit)
        public
        returns (bool _success, uint _prizeSent)
    {
        
        if (!isEnded()) {
            emit SendPrizeError(now, "The game has not ended.");
            return (false, 0);
        }
        if (vars.isPaid) {
            emit SendPrizeError(now, "The prize has already been paid.");
            return (false, 0);
        }

        address _winner = vars.monarch;
        uint _prize = prize();
        bool _paySuccessful = false;

        
        vars.isPaid = true;
        if (_gasLimit == 0) {
            _paySuccessful = _winner.call.value(_prize)();
        } else {
            _paySuccessful = _winner.call.value(_prize).gas(_gasLimit)();
        }

        
        if (_paySuccessful) {
            emit SendPrizeSuccess({
                time: now,
                redeemer: msg.sender,
                recipient: _winner,
                amount: _prize,
                gasLimit: _gasLimit
            });
            return (true, _prize);
        } else {
            vars.isPaid = false;
            emit SendPrizeFailure({
                time: now,
                redeemer: msg.sender,
                recipient: _winner,
                amount: _prize,
                gasLimit: _gasLimit
            });
            return (false, 0);          
        }
    }