Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Donald Haase
Cockatrice
Commits
564ae4db
Commit
564ae4db
authored
Dec 15, 2009
by
Max-Wilhelm Bruker
Browse files
some cleanups and fixes
parent
6ba2e983
Changes
27
Hide whitespace changes
Inline
Side-by-side
common/server.cpp
View file @
564ae4db
...
...
@@ -22,7 +22,7 @@
#include
"server_counter.h"
#include
"server_chatchannel.h"
#include
"server_protocolhandler.h"
#include
<QDebug>
Server
::
Server
(
QObject
*
parent
)
:
QObject
(
parent
),
nextGameId
(
0
)
{
...
...
@@ -56,17 +56,14 @@ void Server::removeClient(Server_ProtocolHandler *client)
void
Server
::
closeOldSession
(
const
QString
&
playerName
)
{
qDebug
()
<<
"closing old"
;
Server_ProtocolHandler
*
session
=
0
;
for
(
int
i
=
0
;
i
<
clients
.
size
();
++
i
)
if
(
clients
[
i
]
->
getPlayerName
()
==
playerName
)
{
session
=
clients
[
i
];
break
;
}
if
(
session
)
{
qDebug
()
<<
"found"
;
if
(
session
)
delete
session
;
// ~Server_ProtocolHandler() will call Server::removeClient
}
}
Server_Game
*
Server
::
getGame
(
int
gameId
)
const
...
...
common/server_game.cpp
View file @
564ae4db
...
...
@@ -25,11 +25,16 @@
#include
"server_cardzone.h"
#include
"server_counter.h"
#include
<QSqlQuery>
#include
<QTimer>
Server_Game
::
Server_Game
(
Server_ProtocolHandler
*
_creator
,
int
_gameId
,
const
QString
&
_description
,
const
QString
&
_password
,
int
_maxPlayers
,
bool
_spectatorsAllowed
,
QObject
*
parent
)
:
QObject
(
parent
),
gameStarted
(
false
),
gameId
(
_gameId
),
description
(
_description
),
password
(
_password
),
maxPlayers
(
_maxPlayers
),
spectatorsAllowed
(
_spectatorsAllowed
)
:
QObject
(
parent
),
gameStarted
(
false
),
gameId
(
_gameId
),
description
(
_description
),
password
(
_password
),
maxPlayers
(
_maxPlayers
),
activePlayer
(
-
1
),
activePhase
(
-
1
),
spectatorsAllowed
(
_spectatorsAllowed
)
{
creator
=
addPlayer
(
_creator
,
false
,
false
);
pingClock
=
new
QTimer
(
this
);
connect
(
pingClock
,
SIGNAL
(
timeout
()),
this
,
SLOT
(
pingClockTimeout
()));
pingClock
->
start
(
1000
);
}
Server_Game
::~
Server_Game
()
...
...
@@ -40,25 +45,60 @@ Server_Game::~Server_Game()
while
(
playerIterator
.
hasNext
())
delete
playerIterator
.
next
().
value
();
players
.
clear
();
for
(
int
i
=
0
;
i
<
spectators
.
size
();
++
i
)
delete
spectators
[
i
];
spectators
.
clear
();
emit
gameClosing
();
qDebug
(
"Server_Game destructor"
);
}
void
Server_Game
::
pingClockTimeout
()
{
QDateTime
now
=
QDateTime
::
currentDateTime
();
QList
<
ServerInfo_PlayerPing
*>
pingList
;
QMapIterator
<
int
,
Server_Player
*>
playerIterator
(
players
);
while
(
playerIterator
.
hasNext
())
{
Server_Player
*
player
=
playerIterator
.
next
().
value
();
int
pingTime
=
player
->
getProtocolHandler
()
?
player
->
getProtocolHandler
()
->
getLastCommandTime
().
secsTo
(
now
)
:
-
1
;
pingList
.
append
(
new
ServerInfo_PlayerPing
(
player
->
getPlayerId
(),
pingTime
));
}
sendGameEvent
(
new
Event_Ping
(
-
1
,
pingList
));
}
int
Server_Game
::
getPlayerCount
()
const
{
QMapIterator
<
int
,
Server_Player
*>
playerIterator
(
players
);
int
result
=
0
;
while
(
playerIterator
.
hasNext
())
if
(
!
playerIterator
.
next
().
value
()
->
getSpectator
())
++
result
;
return
result
;
}
int
Server_Game
::
getSpectatorCount
()
const
{
QMapIterator
<
int
,
Server_Player
*>
playerIterator
(
players
);
int
result
=
0
;
while
(
playerIterator
.
hasNext
())
if
(
playerIterator
.
next
().
value
()
->
getSpectator
())
++
result
;
return
result
;
}
void
Server_Game
::
startGameIfReady
()
{
if
(
p
layer
s
.
size
()
<
maxPlayers
)
if
(
getP
layer
Count
()
<
maxPlayers
)
return
;
QMapIterator
<
int
,
Server_Player
*>
playerIterator
(
players
);
while
(
playerIterator
.
hasNext
())
if
(
!
playerIterator
.
next
().
value
()
->
getReadyStart
())
while
(
playerIterator
.
hasNext
())
{
Server_Player
*
p
=
playerIterator
.
next
().
value
();
if
(
!
p
->
getReadyStart
()
&&
!
p
->
getSpectator
())
return
;
}
playerIterator
.
toFront
();
while
(
playerIterator
.
hasNext
())
playerIterator
.
next
().
value
()
->
setupZones
();
while
(
playerIterator
.
hasNext
())
{
Server_Player
*
p
=
playerIterator
.
next
().
value
();
if
(
!
p
->
getSpectator
())
p
->
setupZones
();
}
gameStarted
=
true
;
playerIterator
.
toFront
();
...
...
@@ -85,7 +125,6 @@ void Server_Game::startGameIfReady()
query.exec();
}
*/
sendGameEvent
(
new
Event_GameStart
);
setActivePlayer
(
0
);
}
...
...
@@ -125,27 +164,13 @@ ResponseCode Server_Game::checkJoin(const QString &_password, bool spectator)
Server_Player
*
Server_Game
::
addPlayer
(
Server_ProtocolHandler
*
handler
,
bool
spectator
,
bool
broadcastUpdate
)
{
int
playerId
;
if
(
!
spectator
)
{
int
max
=
-
1
;
QMapIterator
<
int
,
Server_Player
*>
i
(
players
);
while
(
i
.
hasNext
())
{
int
tmp
=
i
.
next
().
value
()
->
getPlayerId
();
if
(
tmp
>
max
)
max
=
tmp
;
}
playerId
=
max
+
1
;
}
else
playerId
=
-
1
;
const
QList
<
int
>
&
keyList
=
players
.
keys
();
int
playerId
=
keyList
.
isEmpty
()
?
0
:
(
keyList
.
last
()
+
1
);
Server_Player
*
newPlayer
=
new
Server_Player
(
this
,
playerId
,
handler
->
getPlayerName
(),
spectator
,
handler
);
sendGameEvent
(
new
Event_Join
(
-
1
,
new
ServerInfo_Player
(
playerId
,
handler
->
getPlayerName
(),
spectator
)));
if
(
spectator
)
spectators
<<
newPlayer
;
else
players
.
insert
(
playerId
,
newPlayer
);
players
.
insert
(
playerId
,
newPlayer
);
if
(
broadcastUpdate
)
qobject_cast
<
Server
*>
(
parent
())
->
broadcastGameListUpdate
(
this
);
...
...
@@ -154,14 +179,11 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec
void
Server_Game
::
removePlayer
(
Server_Player
*
player
)
{
if
(
player
->
getSpectator
())
spectators
.
removeAt
(
spectators
.
indexOf
(
player
));
else
players
.
remove
(
player
->
getPlayerId
());
players
.
remove
(
player
->
getPlayerId
());
sendGameEvent
(
new
Event_Leave
(
-
1
,
player
->
getPlayerId
()));
delete
player
;
if
(
!
p
layer
s
.
size
())
if
(
!
getP
layer
Count
())
deleteLater
();
qobject_cast
<
Server
*>
(
parent
())
->
broadcastGameListUpdate
(
this
);
}
...
...
@@ -246,11 +268,12 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs
void
Server_Game
::
sendGameEvent
(
GameEvent
*
event
,
Server_Player
*
exclude
)
{
event
->
setGameId
(
gameId
);
QList
<
Server_Player
*>
receivers
=
QList
<
Server_Player
*>
()
<<
players
.
values
()
<<
spectators
;
for
(
int
i
=
0
;
i
<
receivers
.
size
();
++
i
)
if
(
receivers
[
i
]
!=
exclude
)
receivers
[
i
]
->
sendProtocolItem
(
event
,
false
);
QMapIterator
<
int
,
Server_Player
*>
playerIterator
(
players
);
while
(
playerIterator
.
hasNext
())
{
Server_Player
*
p
=
playerIterator
.
next
().
value
();
if
(
p
!=
exclude
)
p
->
sendProtocolItem
(
event
,
false
);
}
delete
event
;
}
common/server_game.h
View file @
564ae4db
...
...
@@ -26,12 +26,13 @@
#include
"server_player.h"
#include
"protocol.h"
class
QTimer
;
class
Server_Game
:
public
QObject
{
Q_OBJECT
private:
QPointer
<
Server_Player
>
creator
;
QMap
<
int
,
Server_Player
*>
players
;
QList
<
Server_Player
*>
spectators
;
bool
gameStarted
;
int
gameId
;
QString
description
;
...
...
@@ -39,16 +40,19 @@ private:
int
maxPlayers
;
int
activePlayer
,
activePhase
;
bool
spectatorsAllowed
;
QTimer
*
pingClock
;
signals:
void
gameClosing
();
private
slots
:
void
pingClockTimeout
();
public:
Server_Game
(
Server_ProtocolHandler
*
_creator
,
int
_gameId
,
const
QString
&
_description
,
const
QString
&
_password
,
int
_maxPlayers
,
bool
_spectatorsAllowed
,
QObject
*
parent
=
0
);
~
Server_Game
();
Server_Player
*
getCreator
()
const
{
return
creator
;
}
QString
getCreatorName
()
const
{
return
creator
?
creator
->
getPlayerName
()
:
QString
();
}
bool
getGameStarted
()
const
{
return
gameStarted
;
}
int
getPlayerCount
()
const
{
return
players
.
size
();
}
int
getSpectatorCount
()
const
{
return
spectators
.
size
();
}
int
getPlayerCount
()
const
;
int
getSpectatorCount
()
const
;
QList
<
Server_Player
*>
getPlayers
()
const
{
return
players
.
values
();
}
Server_Player
*
getPlayer
(
int
playerId
)
const
{
return
players
.
value
(
playerId
,
0
);
}
int
getGameId
()
const
{
return
gameId
;
}
...
...
common/server_player.cpp
View file @
564ae4db
...
...
@@ -66,6 +66,17 @@ void Server_Player::setupZones()
addZone
(
new
Server_CardZone
(
this
,
"grave"
,
false
,
PublicZone
));
addZone
(
new
Server_CardZone
(
this
,
"rfg"
,
false
,
PublicZone
));
addCounter
(
new
Server_Counter
(
0
,
"life"
,
Qt
::
white
,
25
,
20
));
addCounter
(
new
Server_Counter
(
1
,
"w"
,
QColor
(
255
,
255
,
150
),
20
,
0
));
addCounter
(
new
Server_Counter
(
2
,
"u"
,
QColor
(
150
,
150
,
255
),
20
,
0
));
addCounter
(
new
Server_Counter
(
3
,
"b"
,
QColor
(
150
,
150
,
150
),
20
,
0
));
addCounter
(
new
Server_Counter
(
4
,
"r"
,
QColor
(
250
,
150
,
150
),
20
,
0
));
addCounter
(
new
Server_Counter
(
5
,
"g"
,
QColor
(
150
,
255
,
150
),
20
,
0
));
addCounter
(
new
Server_Counter
(
6
,
"x"
,
QColor
(
255
,
255
,
255
),
20
,
0
));
addCounter
(
new
Server_Counter
(
7
,
"storm"
,
QColor
(
255
,
255
,
255
),
20
,
0
));
initialCards
=
7
;
// ------------------------------------------------------------------
// Assign card ids and create deck from decklist
...
...
common/server_player.h
View file @
564ae4db
...
...
@@ -26,6 +26,7 @@ private:
int
playerId
;
QString
playerName
;
bool
spectator
;
int
initialCards
;
int
nextCardId
;
void
clearZones
();
bool
readyStart
;
...
...
@@ -33,9 +34,12 @@ private:
public:
Server_Player
(
Server_Game
*
_game
,
int
_playerId
,
const
QString
&
_playerName
,
bool
_spectator
,
Server_ProtocolHandler
*
_handler
);
~
Server_Player
();
Server_ProtocolHandler
*
getProtocolHandler
()
const
{
return
handler
;
}
void
setProtocolHandler
(
Server_ProtocolHandler
*
_handler
)
{
handler
=
_handler
;
}
void
setPlayerId
(
int
_id
)
{
playerId
=
_id
;
}
int
getInitialCards
()
const
{
return
initialCards
;
}
void
setInitialCards
(
int
_initialCards
)
{
initialCards
=
_initialCards
;
}
bool
getReadyStart
()
const
{
return
readyStart
;
}
void
setReadyStart
(
bool
_readyStart
)
{
readyStart
=
_readyStart
;
}
int
getPlayerId
()
const
{
return
playerId
;
}
...
...
common/server_protocolhandler.cpp
View file @
564ae4db
...
...
@@ -11,10 +11,15 @@
#include
"server_game.h"
#include
"server_player.h"
#include
"decklist.h"
#include
<QDateTime>
#include
<QTimer>
Server_ProtocolHandler
::
Server_ProtocolHandler
(
Server
*
_server
,
QObject
*
parent
)
:
QObject
(
parent
),
server
(
_server
),
authState
(
PasswordWrong
),
acceptsGameListChanges
(
false
)
:
QObject
(
parent
),
server
(
_server
),
authState
(
PasswordWrong
),
acceptsGameListChanges
(
false
)
,
lastCommandTime
(
QDateTime
::
currentDateTime
())
{
pingClock
=
new
QTimer
(
this
);
connect
(
pingClock
,
SIGNAL
(
timeout
()),
this
,
SLOT
(
pingClockTimeout
()));
pingClock
->
start
(
1000
);
}
Server_ProtocolHandler
::~
Server_ProtocolHandler
()
...
...
@@ -42,6 +47,8 @@ Server_ProtocolHandler::~Server_ProtocolHandler()
void
Server_ProtocolHandler
::
processCommand
(
Command
*
command
)
{
lastCommandTime
=
QDateTime
::
currentDateTime
();
ResponseCode
response
=
RespInvalidCommand
;
ChatCommand
*
chatCommand
=
qobject_cast
<
ChatCommand
*>
(
command
);
...
...
@@ -84,6 +91,7 @@ void Server_ProtocolHandler::processCommand(Command *command)
case
ItemId_Command_Concede
:
response
=
cmdConcede
(
qobject_cast
<
Command_Concede
*>
(
command
),
game
,
player
);
break
;
case
ItemId_Command_Say
:
response
=
cmdSay
(
qobject_cast
<
Command_Say
*>
(
command
),
game
,
player
);
break
;
case
ItemId_Command_Shuffle
:
response
=
cmdShuffle
(
qobject_cast
<
Command_Shuffle
*>
(
command
),
game
,
player
);
break
;
case
ItemId_Command_Mulligan
:
response
=
cmdMulligan
(
qobject_cast
<
Command_Mulligan
*>
(
command
),
game
,
player
);
break
;
case
ItemId_Command_RollDie
:
response
=
cmdRollDie
(
qobject_cast
<
Command_RollDie
*>
(
command
),
game
,
player
);
break
;
case
ItemId_Command_DrawCards
:
response
=
cmdDrawCards
(
qobject_cast
<
Command_DrawCards
*>
(
command
),
game
,
player
);
break
;
case
ItemId_Command_MoveCard
:
response
=
cmdMoveCard
(
qobject_cast
<
Command_MoveCard
*>
(
command
),
game
,
player
);
break
;
...
...
@@ -127,9 +135,15 @@ void Server_ProtocolHandler::processCommand(Command *command)
sendProtocolItem
(
itemQueue
.
takeFirst
());
}
void
Server_ProtocolHandler
::
pingClockTimeout
()
{
if
(
lastCommandTime
.
secsTo
(
QDateTime
::
currentDateTime
())
>
10
)
deleteLater
();
}
void
Server_ProtocolHandler
::
enqueueProtocolItem
(
ProtocolItem
*
item
)
{
itemQueue
<<
item
;
itemQueue
.
append
(
item
)
;
}
QPair
<
Server_Game
*
,
Server_Player
*>
Server_ProtocolHandler
::
getGame
(
int
gameId
)
const
...
...
@@ -156,17 +170,19 @@ ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd)
playerName
=
userName
;
enqueueProtocolItem
(
new
Event_ServerMessage
(
server
->
getLoginMessage
()));
// This might not scale very well. Use an extra QMap if it becomes a problem.
const
QList
<
Server_Game
*>
&
serverGames
=
server
->
getGames
();
for
(
int
i
=
0
;
i
<
serverGames
.
size
();
++
i
)
{
const
QList
<
Server_Player
*>
&
gamePlayers
=
serverGames
[
i
]
->
getPlayers
();
for
(
int
j
=
0
;
j
<
gamePlayers
.
size
();
++
j
)
if
(
gamePlayers
[
j
]
->
getPlayerName
()
==
playerName
)
{
gamePlayers
[
j
]
->
setProtocolHandler
(
this
);
games
.
insert
(
serverGames
[
i
]
->
getGameId
(),
QPair
<
Server_Game
*
,
Server_Player
*>
(
serverGames
[
i
],
gamePlayers
[
j
]));
enqueueProtocolItem
(
new
Event_GameJoined
(
serverGames
[
i
]
->
getGameId
(),
gamePlayers
[
j
]
->
getPlayerId
(),
gamePlayers
[
j
]
->
getSpectator
()));
enqueueProtocolItem
(
new
Event_GameStateChanged
(
serverGames
[
i
]
->
getGameId
(),
serverGames
[
i
]
->
getGameStarted
(),
serverGames
[
i
]
->
getActivePlayer
(),
serverGames
[
i
]
->
getActivePhase
(),
serverGames
[
i
]
->
getGameState
(
gamePlayers
[
j
])));
}
if
(
authState
==
PasswordRight
)
{
// This might not scale very well. Use an extra QMap if it becomes a problem.
const
QList
<
Server_Game
*>
&
serverGames
=
server
->
getGames
();
for
(
int
i
=
0
;
i
<
serverGames
.
size
();
++
i
)
{
const
QList
<
Server_Player
*>
&
gamePlayers
=
serverGames
[
i
]
->
getPlayers
();
for
(
int
j
=
0
;
j
<
gamePlayers
.
size
();
++
j
)
if
(
gamePlayers
[
j
]
->
getPlayerName
()
==
playerName
)
{
gamePlayers
[
j
]
->
setProtocolHandler
(
this
);
games
.
insert
(
serverGames
[
i
]
->
getGameId
(),
QPair
<
Server_Game
*
,
Server_Player
*>
(
serverGames
[
i
],
gamePlayers
[
j
]));
enqueueProtocolItem
(
new
Event_GameJoined
(
serverGames
[
i
]
->
getGameId
(),
gamePlayers
[
j
]
->
getPlayerId
(),
gamePlayers
[
j
]
->
getSpectator
(),
true
));
enqueueProtocolItem
(
new
Event_GameStateChanged
(
serverGames
[
i
]
->
getGameId
(),
serverGames
[
i
]
->
getGameStarted
(),
serverGames
[
i
]
->
getActivePlayer
(),
serverGames
[
i
]
->
getActivePhase
(),
serverGames
[
i
]
->
getGameState
(
gamePlayers
[
j
])));
}
}
}
return
RespOk
;
...
...
@@ -249,7 +265,7 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd)
Server_Player
*
creator
=
game
->
getCreator
();
games
.
insert
(
game
->
getGameId
(),
QPair
<
Server_Game
*
,
Server_Player
*>
(
game
,
creator
));
enqueueProtocolItem
(
new
Event_GameJoined
(
game
->
getGameId
(),
creator
->
getPlayerId
(),
false
));
enqueueProtocolItem
(
new
Event_GameJoined
(
game
->
getGameId
(),
creator
->
getPlayerId
(),
false
,
false
));
enqueueProtocolItem
(
new
Event_GameStateChanged
(
game
->
getGameId
(),
game
->
getGameStarted
(),
game
->
getActivePlayer
(),
game
->
getActivePhase
(),
game
->
getGameState
(
creator
)));
return
RespOk
;
}
...
...
@@ -264,7 +280,7 @@ ResponseCode Server_ProtocolHandler::cmdJoinGame(Command_JoinGame *cmd)
if
(
result
==
RespOk
)
{
Server_Player
*
player
=
g
->
addPlayer
(
this
,
cmd
->
getSpectator
());
games
.
insert
(
cmd
->
getGameId
(),
QPair
<
Server_Game
*
,
Server_Player
*>
(
g
,
player
));
enqueueProtocolItem
(
new
Event_GameJoined
(
cmd
->
getGameId
(),
player
->
getPlayerId
(),
cmd
->
getSpectator
()));
enqueueProtocolItem
(
new
Event_GameJoined
(
cmd
->
getGameId
(),
player
->
getPlayerId
(),
cmd
->
getSpectator
()
,
false
));
enqueueProtocolItem
(
new
Event_GameStateChanged
(
cmd
->
getGameId
(),
g
->
getGameStarted
(),
g
->
getActivePlayer
(),
g
->
getActivePhase
(),
g
->
getGameState
(
player
)));
}
return
result
;
...
...
@@ -272,6 +288,7 @@ ResponseCode Server_ProtocolHandler::cmdJoinGame(Command_JoinGame *cmd)
ResponseCode
Server_ProtocolHandler
::
cmdLeaveGame
(
Command_LeaveGame
*
/*cmd*/
,
Server_Game
*
game
,
Server_Player
*
player
)
{
games
.
remove
(
game
->
getGameId
());
game
->
removePlayer
(
player
);
return
RespOk
;
}
...
...
@@ -330,17 +347,35 @@ ResponseCode Server_ProtocolHandler::cmdShuffle(Command_Shuffle * /*cmd*/, Serve
return
RespOk
;
}
ResponseCode
Server_ProtocolHandler
::
cmdMulligan
(
Command_Mulligan
*
/*cmd*/
,
Server_Game
*
game
,
Server_Player
*
player
)
{
int
number
=
player
->
getInitialCards
();
if
(
!
number
)
return
RespContextError
;
Server_CardZone
*
hand
=
player
->
getZones
().
value
(
"hand"
);
while
(
!
hand
->
cards
.
isEmpty
())
moveCard
(
game
,
player
,
"hand"
,
hand
->
cards
.
first
()
->
getId
(),
"deck"
,
0
,
0
,
false
);
player
->
getZones
().
value
(
"deck"
)
->
shuffle
();
game
->
sendGameEvent
(
new
Event_Shuffle
(
-
1
,
player
->
getPlayerId
()));
drawCards
(
game
,
player
,
number
);
player
->
setInitialCards
(
number
-
1
);
return
RespOk
;
}
ResponseCode
Server_ProtocolHandler
::
cmdRollDie
(
Command_RollDie
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
)
{
game
->
sendGameEvent
(
new
Event_RollDie
(
-
1
,
player
->
getPlayerId
(),
cmd
->
getSides
(),
rng
->
getNumber
(
1
,
cmd
->
getSides
())));
return
RespOk
;
}
ResponseCode
Server_ProtocolHandler
::
cmdD
rawCards
(
Command_DrawCards
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
)
ResponseCode
Server_ProtocolHandler
::
d
rawCards
(
Server_Game
*
game
,
Server_Player
*
player
,
int
number
)
{
Server_CardZone
*
deck
=
player
->
getZones
().
value
(
"deck"
);
Server_CardZone
*
hand
=
player
->
getZones
().
value
(
"hand"
);
int
number
=
cmd
->
getNumber
();
if
(
deck
->
cards
.
size
()
<
number
)
number
=
deck
->
cards
.
size
();
...
...
@@ -350,53 +385,55 @@ ResponseCode Server_ProtocolHandler::cmdDrawCards(Command_DrawCards *cmd, Server
hand
->
cards
.
append
(
card
);
cardList
.
append
(
new
ServerInfo_Card
(
card
->
getId
(),
card
->
getName
()));
}
player
->
sendProtocolItem
(
new
Event_DrawCards
(
game
->
getGameId
(),
player
->
getPlayerId
(),
cardList
.
size
(),
cardList
));
game
->
sendGameEvent
(
new
Event_DrawCards
(
-
1
,
player
->
getPlayerId
(),
cardList
.
size
()),
player
);
return
RespOk
;
}
ResponseCode
Server_ProtocolHandler
::
cmdMoveCard
(
Command_MoveCard
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
)
ResponseCode
Server_ProtocolHandler
::
cmdDrawCards
(
Command_DrawCards
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
)
{
return
drawCards
(
game
,
player
,
cmd
->
getNumber
());
}
ResponseCode
Server_ProtocolHandler
::
moveCard
(
Server_Game
*
game
,
Server_Player
*
player
,
const
QString
&
_startZone
,
int
_cardId
,
const
QString
&
_targetZone
,
int
x
,
int
y
,
bool
faceDown
)
{
// ID Karte, Startzone, Zielzone, Koordinaten X, Y, Facedown
Server_CardZone
*
startzone
=
player
->
getZones
().
value
(
cmd
->
getStartZone
());
Server_CardZone
*
targetzone
=
player
->
getZones
().
value
(
cmd
->
getTargetZone
());
Server_CardZone
*
startzone
=
player
->
getZones
().
value
(
_startZone
);
Server_CardZone
*
targetzone
=
player
->
getZones
().
value
(
_targetZone
);
if
((
!
startzone
)
||
(
!
targetzone
))
return
RespNameNotFound
;
int
position
=
-
1
;
Server_Card
*
card
=
startzone
->
getCard
(
c
md
->
getC
ardId
()
,
true
,
&
position
);
Server_Card
*
card
=
startzone
->
getCard
(
_
cardId
,
true
,
&
position
);
if
(
!
card
)
return
RespNameNotFound
;
int
x
=
cmd
->
getX
();
if
(
x
==
-
1
)
x
=
targetzone
->
cards
.
size
();
int
y
=
0
;
if
(
targetzone
->
hasCoords
())
y
=
cmd
->
getY
();
bool
facedown
=
cmd
->
getFaceDown
();
if
(
!
targetzone
->
hasCoords
())
y
=
0
;
targetzone
->
insertCard
(
card
,
x
,
y
);
bool
targetBeingLookedAt
=
(
targetzone
->
getType
()
!=
HiddenZone
)
||
(
targetzone
->
getCardsBeingLookedAt
()
>
x
)
||
(
targetzone
->
getCardsBeingLookedAt
()
==
-
1
);
bool
sourceBeingLookedAt
=
(
startzone
->
getType
()
!=
HiddenZone
)
||
(
startzone
->
getCardsBeingLookedAt
()
>
position
)
||
(
startzone
->
getCardsBeingLookedAt
()
==
-
1
);
bool
targetHiddenToPlayer
=
face
d
own
||
!
targetBeingLookedAt
;
bool
targetHiddenToOthers
=
face
d
own
||
(
targetzone
->
getType
()
!=
PublicZone
);
bool
targetHiddenToPlayer
=
face
D
own
||
!
targetBeingLookedAt
;
bool
targetHiddenToOthers
=
face
D
own
||
(
targetzone
->
getType
()
!=
PublicZone
);
bool
sourceHiddenToPlayer
=
card
->
getFaceDown
()
||
!
sourceBeingLookedAt
;
bool
sourceHiddenToOthers
=
card
->
getFaceDown
()
||
(
startzone
->
getType
()
!=
PublicZone
);
QString
privateCardName
,
publicCardName
;
if
(
!
(
sourceHiddenToPlayer
&&
targetHiddenToPlayer
))
privateCardName
=
card
->
getName
();
if
(
!
(
sourceHiddenToOthers
&&
targetHiddenToOthers
))
publicCardName
=
card
->
getName
();
if
(
face
d
own
)
if
(
face
D
own
)
card
->
setId
(
player
->
newCardId
());
card
->
setFaceDown
(
face
d
own
);
card
->
setFaceDown
(
face
D
own
);
// The player does not get to see which card he moved if it moves between two parts of hidden zones which
// are not being looked at.
int
privateCardId
=
card
->
getId
();
...
...
@@ -407,7 +444,7 @@ ResponseCode Server_ProtocolHandler::cmdMoveCard(Command_MoveCard *cmd, Server_G
int
privatePosition
=
-
1
;
if
(
startzone
->
getType
()
==
HiddenZone
)
privatePosition
=
position
;
player
->
sendProtocolItem
(
new
Event_MoveCard
(
game
->
getGameId
(),
player
->
getPlayerId
(),
privateCardId
,
privateCardName
,
startzone
->
getName
(),
privatePosition
,
targetzone
->
getName
(),
x
,
y
,
face
d
own
));
player
->
sendProtocolItem
(
new
Event_MoveCard
(
game
->
getGameId
(),
player
->
getPlayerId
(),
privateCardId
,
privateCardName
,
startzone
->
getName
(),
privatePosition
,
targetzone
->
getName
(),
x
,
y
,
face
D
own
));
// Other players do not get to see the start and/or target position of the card if the respective
// part of the zone is being looked at. The information is not needed anyway because in hidden zones,
...
...
@@ -416,9 +453,9 @@ ResponseCode Server_ProtocolHandler::cmdMoveCard(Command_MoveCard *cmd, Server_G
position
=
-
1
;
if
((
targetzone
->
getType
()
==
HiddenZone
)
&&
((
targetzone
->
getCardsBeingLookedAt
()
>
x
)
||
(
targetzone
->
getCardsBeingLookedAt
()
==
-
1
)))
x
=
-
1
;
if
((
startzone
->
getType
()
==
PublicZone
)
||
(
targetzone
->
getType
()
==
PublicZone
))
game
->
sendGameEvent
(
new
Event_MoveCard
(
-
1
,
player
->
getPlayerId
(),
card
->
getId
(),
publicCardName
,
startzone
->
getName
(),
position
,
targetzone
->
getName
(),
x
,
y
,
face
d
own
),
player
);
game
->
sendGameEvent
(
new
Event_MoveCard
(
-
1
,
player
->
getPlayerId
(),
card
->
getId
(),
publicCardName
,
startzone
->
getName
(),
position
,
targetzone
->
getName
(),
x
,
y
,
face
D
own
),
player
);
else
game
->
sendGameEvent
(
new
Event_MoveCard
(
-
1
,
player
->
getPlayerId
(),
-
1
,
QString
(),
startzone
->
getName
(),
position
,
targetzone
->
getName
(),
x
,
y
,
false
),
player
);
...
...
@@ -441,6 +478,11 @@ ResponseCode Server_ProtocolHandler::cmdMoveCard(Command_MoveCard *cmd, Server_G
return
RespOk
;
}
ResponseCode
Server_ProtocolHandler
::
cmdMoveCard
(
Command_MoveCard
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
)
{
return
moveCard
(
game
,
player
,
cmd
->
getStartZone
(),
cmd
->
getCardId
(),
cmd
->
getTargetZone
(),
cmd
->
getX
(),
cmd
->
getY
(),
cmd
->
getFaceDown
());
}
ResponseCode
Server_ProtocolHandler
::
cmdCreateToken
(
Command_CreateToken
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
)
{
// powtough wird erst mal ignoriert
...
...
common/server_protocolhandler.h
View file @
564ae4db
...
...
@@ -8,6 +8,7 @@
#include
"protocol_items.h"
class
Server_Player
;
class
QTimer
;
class
Server_ProtocolHandler
:
public
QObject
{
Q_OBJECT
...
...
@@ -16,7 +17,7 @@ protected:
QMap
<
int
,
QPair
<
Server_Game
*
,
Server_Player
*>
>
games
;
QMap
<
QString
,
Server_ChatChannel
*>
chatChannels
;
QString
playerName
;
Server
*
getServer
()
const
{
return
server
;
}
QPair
<
Server_Game
*
,
Server_Player
*>
getGame
(
int
gameId
)
const
;
...
...
@@ -26,7 +27,9 @@ protected:
private:
QList
<
ProtocolItem
*>
itemQueue
;
QDateTime
lastCommandTime
;
QTimer
*
pingClock
;
virtual
DeckList
*
getDeckFromDatabase
(
int
deckId
)
=
0
;
ResponseCode
cmdPing
(
Command_Ping
*
cmd
);
...
...
@@ -50,8 +53,12 @@ private:
ResponseCode
cmdDeckSelect
(
Command_DeckSelect
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdSay
(
Command_Say
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdShuffle
(
Command_Shuffle
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdMulligan
(
Command_Mulligan
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdRollDie
(
Command_RollDie
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
// XXX Maybe the following function and others belong into Server_Player
ResponseCode
drawCards
(
Server_Game
*
game
,
Server_Player
*
player
,
int
number
);
ResponseCode
cmdDrawCards
(
Command_DrawCards
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
moveCard
(
Server_Game
*
game
,
Server_Player
*
player
,
const
QString
&
_startZone
,
int
_cardId
,
const
QString
&
_targetZone
,
int
_x
,
int
_y
,
bool
_faceDown
);
ResponseCode
cmdMoveCard
(
Command_MoveCard
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdCreateToken
(
Command_CreateToken
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdCreateArrow
(
Command_CreateArrow
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
...
...
@@ -65,6 +72,8 @@ private:
ResponseCode
cmdSetActivePhase
(
Command_SetActivePhase
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdDumpZone
(
Command_DumpZone
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
ResponseCode
cmdStopDumpZone
(
Command_StopDumpZone
*
cmd
,
Server_Game
*
game
,
Server_Player
*
player
);
private
slots
:
void
pingClockTimeout
();
public:
Server_ProtocolHandler
(
Server
*
_server
,
QObject
*
parent
=
0
);
~
Server_ProtocolHandler
();
...
...
@@ -72,7 +81,8 @@ public:
bool
getAcceptsGameListChanges
()
const
{
return
acceptsGameListChanges
;
}
bool
getAcceptsChatChannelListChanges
()
const
{
return
acceptsChatChannelListChanges
;
}
const
QString
&
getPlayerName
()
const
{
return
playerName
;
}
const
QDateTime
&
getLastCommandTime
()
const
{
return
lastCommandTime
;
}
void
processCommand
(
Command
*
command
);
virtual
void
sendProtocolItem
(
ProtocolItem
*
item
,
bool
deleteItem
=
true
)
=
0
;
void
enqueueProtocolItem
(
ProtocolItem
*
item
);
...
...
Prev
1
2
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment