예제 #1
0
void interface::do_login()
{
    connect(&connection, SIGNAL(on_changephase(QJsonObject)), w_gameplay, SLOT(do_changephase(QJsonObject)));
    connect(&connection, SIGNAL(on_get_clients()), w_gameplay, SLOT(do_populate_players()));
    connect(&conn_client, SIGNAL(on_accept_prepare_proposal(QJsonObject, QHostAddress, quint16)), w_gameplay, SLOT(do_proposal_prepare(QJsonObject,QHostAddress,quint16)));
    connect(&conn_client, SIGNAL(on_accept_accept_proposal(QJsonObject, QHostAddress, quint16)), w_gameplay, SLOT(do_proposal_accept(QJsonObject,QHostAddress,quint16)));
    connect(&connection, SIGNAL(on_kpu_is_selected()), w_gameplay, SLOT(do_set_kpu_selected()));
    connect(&connection, SIGNAL(on_game_over(QJsonObject)), w_gameplay, SLOT(do_game_over(QJsonObject)));
    connect(&connection, SIGNAL(on_vote_now()), w_gameplay, SLOT(do_vote_now()));
    w_login->hide();
    w_gameplay->show();
}
예제 #2
0
void handler_client::readMessage() {
    while (socket->hasPendingDatagrams()) {
        QByteArray message;
        message.resize(socket->pendingDatagramSize());

        QHostAddress sender_ip;
        quint16 sender_port;
        socket->readDatagram(message.data(), message.size(), &sender_ip, &sender_port);

        qDebug() << "reading...";

        QList<QByteArray> message_list = message.split('\n');
        qDebug() << message_list;

        QJsonDocument json_document;
        QJsonObject json_object;
        QJsonValue method, status, description;
        json_document = QJsonDocument::fromJson(message_list.at(0));
        json_object = json_document.object();

        if (json_object.contains("status")) {
            /* Response Proposer->Acceptor */
            status = json_object.value("status");

            if (status == "fail" || status == "error"){
                description = json_object.value("description");
                emit on_fail_or_error(description.toString());

            } else if (last_sent_method == "prepare_proposal" && status == "ok") {
                counter_prepare++;
                qDebug() << "Prepare Counter Sekarang = " << counter_prepare;
                if (counter_prepare == connection_server.getClients().size()-1) {
                    accept_proposal();
                }
            }

        } else if (json_object.contains("method")) {
            /* Request Acceptor->Proposer */
            method = json_object.value("method");
            // Cek dia nerima method apa
            if (method == "prepare_proposal"){
                emit on_accept_prepare_proposal(json_object,sender_ip,sender_port);
            } else if (method == "accept_proposal"){
                emit on_accept_accept_proposal(json_object,sender_ip,sender_port);
            } else if (method == "vote_werewolf") {
                int player_id_ = json_object.value("player_id").toInt();
                vote_map[player_id_]++;

                counter_vote++;

                sendResponse(sender_ip.toString(),sender_port,"ok","");

                if ( counter_vote == ((hardcode_player/3) - connection_server.getDeadWerewolf()) ) {

                    QJsonArray json_array;
                    QJsonArray final_array;
                    for (int i = 0; i < connection_server.getClients().size(); i++) {
                        json_array.insert(0, i);
                        json_array.insert(1, vote_map[i]);
                        final_array.insert(i, QJsonValue::fromVariant(json_array));
                        json_array.removeFirst();
                        json_array.removeFirst();
                    }

                    QJsonObject message;
                    message.insert("method", "vote_result_werewolf");
                    int pk = getVoteResult();
                    if ( pk != -1 ) {
                        message.insert("vote_status", 1);
                        message.insert("player_killed", pk);
                    } else {
                        message.insert("vote_status", -1);
                    }
                    message.insert("vote_result", final_array);

                    connection_server.sendMessageJSON(message);

                    counter_vote = 0;
                }
            } else if (method == "vote_civilian") {
                int player_id_ = json_object.value("player_id").toInt();
                vote_map[player_id_]++;

                counter_vote++;

                sendResponse(sender_ip.toString(),sender_port,"ok","");

                if ( counter_vote == (hardcode_player - connection_server.getDeadPlayer()) ) {

                    QJsonArray json_array;
                    QJsonArray final_array;
                    for (int i = 0; i < connection_server.getClients().size(); i++) {
                        json_array.insert(0, i);
                        json_array.insert(1, vote_map[i]);
                        final_array.insert(i, QJsonValue::fromVariant(json_array));
                        json_array.removeFirst();
                        json_array.removeFirst();
                    }

                    QJsonObject message;
                    message.insert("method", "vote_result_civilian");
                    int pk = getVoteResult();
                    if ( pk != -1 ) {
                        message.insert("vote_status", 1);
                        message.insert("player_killed", pk);
                    } else {
                        message.insert("vote_status", -1);
                    }
                    message.insert("vote_result", final_array);

                    connection_server.sendMessageJSON(message);

                    counter_vote = 0;
                }
            }
        }
    }
}