mirror of
https://github.com/Qsgs-Fans/FreeKill.git
synced 2024-11-16 03:32:34 +08:00
Trust ai (#13)
* add 'Robot' to Player::State * add definition to Room::addRobot * addRobot * modify room abandon * robot will wait for 1 second(not 1000) * tell lua and js someone run Co-authored-by: Notify-ctrl <notify-ctrl@qq.com>
This commit is contained in:
parent
927c5f479b
commit
4c93c897b2
|
@ -256,6 +256,31 @@ fk.room_callback["QuitRoom"] = function(jsonData)
|
|||
end
|
||||
end
|
||||
|
||||
fk.room_callback["AddRobot"] = function(jsonData)
|
||||
-- jsonData: [ int uid ]
|
||||
local data = json.decode(jsonData)
|
||||
local player = fk.ServerInstance:findPlayer(tonumber(data[1]))
|
||||
local room = player:getRoom()
|
||||
|
||||
if not room:isLobby() then
|
||||
room:addRobot(player)
|
||||
end
|
||||
end
|
||||
|
||||
fk.room_callback["PlayerRunned"] = function(jsonData)
|
||||
-- jsonData: [ int runner_id, int robot_id ]
|
||||
-- note: this function is not called by Router.
|
||||
-- note: when this function is called, the room must be started
|
||||
local data = json.decode(jsonData)
|
||||
local runner = data[1]
|
||||
local robot = data[2]
|
||||
for _, p in ipairs(RoomInstance.players) do
|
||||
if p:getId() == runner then
|
||||
p.serverplayer = RoomInstance:findPlayerById(robot)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
fk.room_callback["PlayerStateChanged"] = function(jsonData)
|
||||
-- jsonData: [ int uid, string stateString ]
|
||||
-- note: this function is not called by Router.
|
||||
|
|
|
@ -27,9 +27,12 @@ Item {
|
|||
}
|
||||
}
|
||||
Button {
|
||||
text: "start game"
|
||||
text: "add robot"
|
||||
visible: dashboardModel.isOwner && !isStarted
|
||||
anchors.centerIn: parent
|
||||
onClicked: {
|
||||
ClientInstance.notifyServer("AddRobot", "[]");
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
|
|
|
@ -187,6 +187,21 @@ callbacks["MoveFocus"] = function(jsonData) {
|
|||
}
|
||||
}
|
||||
|
||||
callbacks["PlayerRunned"] = function(jsonData) {
|
||||
// jsonData: int runner, int robot
|
||||
let data = JSON.parse(jsonData);
|
||||
let runner = data[0];
|
||||
let robot = data[1];
|
||||
|
||||
let model;
|
||||
for (let i = 0; i < playerNum - 1; i++) {
|
||||
model = photoModel.get(i);
|
||||
if (model.id === runner) {
|
||||
model.id = robot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
callbacks["AskForGeneral"] = function(jsonData) {
|
||||
// jsonData: string[] Generals
|
||||
// TODO: choose multiple generals
|
||||
|
|
|
@ -56,6 +56,8 @@ QString Player::getStateString() const
|
|||
return QStringLiteral("online");
|
||||
case Trust:
|
||||
return QStringLiteral("trust");
|
||||
case Robot:
|
||||
return QStringLiteral("robot");
|
||||
case Offline:
|
||||
return QStringLiteral("offline");
|
||||
default:
|
||||
|
@ -75,6 +77,8 @@ void Player::setStateString(const QString &state)
|
|||
setState(Online);
|
||||
else if (state == QStringLiteral("trust"))
|
||||
setState(Trust);
|
||||
else if (state == QStringLiteral("robot"))
|
||||
setState(Robot);
|
||||
else if (state == QStringLiteral("offline"))
|
||||
setState(Offline);
|
||||
else
|
||||
|
|
|
@ -10,7 +10,8 @@ public:
|
|||
enum State{
|
||||
Invalid,
|
||||
Online,
|
||||
Trust,
|
||||
Trust, // Trust or run
|
||||
Robot, // only for real robot
|
||||
Offline
|
||||
};
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ Room::Room(Server* server)
|
|||
setParent(server);
|
||||
owner = nullptr;
|
||||
gameStarted = false;
|
||||
robot_id = -1;
|
||||
timeout = 15;
|
||||
if (!isLobby()) {
|
||||
connect(this, &Room::playerAdded, server->lobby(), &Room::removePlayer);
|
||||
|
@ -80,7 +81,14 @@ bool Room::isFull() const
|
|||
|
||||
bool Room::isAbandoned() const
|
||||
{
|
||||
return players.isEmpty();
|
||||
if (players.isEmpty())
|
||||
return true;
|
||||
|
||||
foreach (ServerPlayer *p, players) {
|
||||
if (p->getState() == Player::Online)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
ServerPlayer *Room::getOwner() const
|
||||
|
@ -149,6 +157,20 @@ void Room::addPlayer(ServerPlayer *player)
|
|||
emit playerAdded(player);
|
||||
}
|
||||
|
||||
void Room::addRobot(ServerPlayer *player)
|
||||
{
|
||||
if (player != owner || isFull()) return;
|
||||
|
||||
ServerPlayer *robot = new ServerPlayer(this);
|
||||
robot->setState(Player::Robot);
|
||||
robot->setId(robot_id);
|
||||
robot->setAvatar("guanyu");
|
||||
robot->setScreenName(QString("COMP-%1").arg(robot_id));
|
||||
robot_id--;
|
||||
|
||||
addPlayer(robot);
|
||||
}
|
||||
|
||||
void Room::removePlayer(ServerPlayer *player)
|
||||
{
|
||||
players.removeOne(player);
|
||||
|
@ -157,12 +179,22 @@ void Room::removePlayer(ServerPlayer *player)
|
|||
if (isLobby()) return;
|
||||
|
||||
if (gameStarted) {
|
||||
// TODO: if the player is died..
|
||||
// create robot first
|
||||
ServerPlayer *robot = new ServerPlayer(this);
|
||||
robot->setState(Player::Robot);
|
||||
robot->setId(robot_id);
|
||||
robot->setAvatar(player->getAvatar());
|
||||
robot->setScreenName(QString("COMP-%1").arg(robot_id));
|
||||
robot_id--;
|
||||
|
||||
// tell lua & clients
|
||||
QJsonArray jsonData;
|
||||
jsonData << player->getId();
|
||||
jsonData << robot->getId();
|
||||
callLua("PlayerRunned", QJsonDocument(jsonData).toJson());
|
||||
doBroadcastNotify(getPlayers(), "PlayerRunned", QJsonDocument(jsonData).toJson());
|
||||
runned_players << player->getId();
|
||||
|
||||
// TODO: create a robot for runned player.
|
||||
} else {
|
||||
QJsonArray jsonData;
|
||||
jsonData << player->getId();
|
||||
|
@ -190,7 +222,11 @@ QList<ServerPlayer *> Room::getOtherPlayers(ServerPlayer* expect) const
|
|||
|
||||
ServerPlayer *Room::findPlayer(int id) const
|
||||
{
|
||||
return server->findPlayer(id);
|
||||
foreach (ServerPlayer *p, players) {
|
||||
if (p->getId() == id)
|
||||
return p;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int Room::getTimeout() const
|
||||
|
@ -230,9 +266,9 @@ void Room::gameOver()
|
|||
{
|
||||
gameStarted = false;
|
||||
runned_players.clear();
|
||||
// clean offline players
|
||||
// clean not online players
|
||||
foreach (ServerPlayer *p, players) {
|
||||
if (p->getState() == Player::Offline) {
|
||||
if (p->getState() != Player::Online) {
|
||||
p->deleteLater();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ public:
|
|||
void setOwner(ServerPlayer *owner);
|
||||
|
||||
void addPlayer(ServerPlayer *player);
|
||||
void addRobot(ServerPlayer *player);
|
||||
void removePlayer(ServerPlayer *player);
|
||||
QList<ServerPlayer*> getPlayers() const;
|
||||
QList<ServerPlayer *> getOtherPlayers(ServerPlayer *expect) const;
|
||||
|
@ -76,6 +77,7 @@ private:
|
|||
ServerPlayer *owner; // who created this room?
|
||||
QList<ServerPlayer *> players;
|
||||
QList<int> runned_players;
|
||||
int robot_id;
|
||||
bool gameStarted;
|
||||
|
||||
int timeout;
|
||||
|
|
|
@ -232,6 +232,7 @@ void Server::handleNameAndPassword(ClientSocket *client, const QString& name, co
|
|||
void Server::onRoomAbandoned()
|
||||
{
|
||||
Room *room = qobject_cast<Room *>(sender());
|
||||
room->gameOver();
|
||||
rooms.remove(room->getId());
|
||||
updateRoomList();
|
||||
room->deleteLater();
|
||||
|
|
|
@ -64,22 +64,32 @@ void ServerPlayer::speak(const QString& message)
|
|||
|
||||
void ServerPlayer::doRequest(const QString& command, const QString& jsonData, int timeout)
|
||||
{
|
||||
if (getState() != Player::Online) return;
|
||||
int type = Router::TYPE_REQUEST | Router::SRC_SERVER | Router::DEST_CLIENT;
|
||||
router->request(type, command, jsonData, timeout);
|
||||
}
|
||||
|
||||
QString ServerPlayer::waitForReply()
|
||||
{
|
||||
if (getState() != Player::Online) {
|
||||
QThread::sleep(1);
|
||||
return "";
|
||||
}
|
||||
return router->waitForReply();
|
||||
}
|
||||
|
||||
QString ServerPlayer::waitForReply(int timeout)
|
||||
{
|
||||
if (getState() != Player::Online) {
|
||||
QThread::sleep(1);
|
||||
return "";
|
||||
}
|
||||
return router->waitForReply(timeout);
|
||||
}
|
||||
|
||||
void ServerPlayer::doNotify(const QString& command, const QString& jsonData)
|
||||
{
|
||||
if (getState() != Player::Online) return;
|
||||
int type = Router::TYPE_NOTIFICATION | Router::SRC_SERVER | Router::DEST_CLIENT;
|
||||
router->notify(type, command, jsonData);
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ public:
|
|||
void setOwner(ServerPlayer *owner);
|
||||
|
||||
void addPlayer(ServerPlayer *player);
|
||||
void addRobot(ServerPlayer *player);
|
||||
void removePlayer(ServerPlayer *player);
|
||||
QList<ServerPlayer *> getPlayers() const;
|
||||
ServerPlayer *findPlayer(int id) const;
|
||||
|
|
Loading…
Reference in New Issue
Block a user