Stefan Schuermans commited on 2019-07-07 12:49:43
Showing 3 changed files, with 49 additions and 3 deletions.
| ... | ... |
@@ -3,6 +3,7 @@ |
| 3 | 3 |
Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html |
| 4 | 4 |
a blinkenarea.org project */ |
| 5 | 5 |
|
| 6 |
+#include <set> |
|
| 6 | 7 |
#include <sstream> |
| 7 | 8 |
#include <string> |
| 8 | 9 |
#include <vector> |
| ... | ... |
@@ -32,7 +33,7 @@ Game::Game(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
| 32 | 33 |
m_fileBackgroundColor(dirBase.getFile("backgroundColor")),
|
| 33 | 34 |
m_fileOutStream(dirBase.getFile("outstream"), mgrs.m_streamMgr),
|
| 34 | 35 |
m_height(0), m_width(0), m_channels(0), m_imgBuf(), m_backgroundColor(), |
| 35 |
- m_haveTimeStep(false), m_timeStepTime() |
|
| 36 |
+ m_haveTimeStep(false), m_timeStepTime(), m_opConnsClose() |
|
| 36 | 37 |
{
|
| 37 | 38 |
} |
| 38 | 39 |
|
| ... | ... |
@@ -87,7 +88,11 @@ void Game::updateConfig() |
| 87 | 88 |
/// callback when requested time reached |
| 88 | 89 |
void Game::timeCall() |
| 89 | 90 |
{
|
| 90 |
- // TODO: internal stuff |
|
| 91 |
+ // close operator connections |
|
| 92 |
+ for (OpConn *pConn : m_opConnsClose) {
|
|
| 93 |
+ pConn->close(); |
|
| 94 |
+ } |
|
| 95 |
+ m_opConnsClose.clear(); |
|
| 91 | 96 |
|
| 92 | 97 |
// time step of game has been reached -> call game |
| 93 | 98 |
if (m_haveTimeStep && Time::now() >= m_timeStepTime) {
|
| ... | ... |
@@ -390,6 +395,22 @@ void Game::unsetTimeStep() |
| 390 | 395 |
planTimeCall(); |
| 391 | 396 |
} |
| 392 | 397 |
|
| 398 |
+/// request closing operator connection (NULL ok) (closed via time call) |
|
| 399 |
+void Game::requestOpConnClose(OpConn *pConn) |
|
| 400 |
+{
|
|
| 401 |
+ if (pConn) {
|
|
| 402 |
+ m_opConnsClose.insert(pConn); |
|
| 403 |
+ planTimeCall(); |
|
| 404 |
+ } |
|
| 405 |
+} |
|
| 406 |
+ |
|
| 407 |
+/// remove operator connection from requests (call when op conn is closed) |
|
| 408 |
+void Game::forgetOpConn(OpConn *pConn) |
|
| 409 |
+{
|
|
| 410 |
+ m_opConnsClose.erase(pConn); |
|
| 411 |
+ planTimeCall(); |
|
| 412 |
+} |
|
| 413 |
+ |
|
| 393 | 414 |
/// (re-)create image buffer |
| 394 | 415 |
void Game::createImgBuf() |
| 395 | 416 |
{
|
| ... | ... |
@@ -428,6 +449,12 @@ void Game::destroyImgBuf() |
| 428 | 449 |
/// request next time call - or cancel request if not needed |
| 429 | 450 |
void Game::planTimeCall() |
| 430 | 451 |
{
|
| 452 |
+ // request immediate time call if there are internal time-based actions |
|
| 453 |
+ if (! m_opConnsClose.empty()) {
|
|
| 454 |
+ m_mgrs.m_callMgr.requestTimeCall(this, Time::now()); |
|
| 455 |
+ return; |
|
| 456 |
+ } |
|
| 457 |
+ |
|
| 431 | 458 |
// no time step requested by game |
| 432 | 459 |
if (! m_haveTimeStep) {
|
| 433 | 460 |
m_mgrs.m_callMgr.cancelTimeCall(this); |
| ... | ... |
@@ -6,6 +6,7 @@ |
| 6 | 6 |
#ifndef BLINKER_GAME_H |
| 7 | 7 |
#define BLINKER_GAME_H |
| 8 | 8 |
|
| 9 |
+#include <set> |
|
| 9 | 10 |
#include <string> |
| 10 | 11 |
#include <vector> |
| 11 | 12 |
|
| ... | ... |
@@ -18,6 +19,7 @@ |
| 18 | 19 |
#include "FormatFile.h" |
| 19 | 20 |
#include "Mgrs.h" |
| 20 | 21 |
#include "Module.h" |
| 22 |
+#include "OpConn.h" |
|
| 21 | 23 |
#include "OutStreamFile.h" |
| 22 | 24 |
#include "Time.h" |
| 23 | 25 |
#include "TimeCallee.h" |
| ... | ... |
@@ -39,6 +41,10 @@ protected: |
| 39 | 41 |
unsigned int maximum; |
| 40 | 42 |
}; |
| 41 | 43 |
|
| 44 |
+private: |
|
| 45 |
+ /// set of operator connections |
|
| 46 |
+ typedef std::set<OpConn *> OpConnSet; |
|
| 47 |
+ |
|
| 42 | 48 |
public: |
| 43 | 49 |
/** |
| 44 | 50 |
* @brief constructor |
| ... | ... |
@@ -184,6 +190,12 @@ protected: |
| 184 | 190 |
/// unset game time step - do timed action for game |
| 185 | 191 |
void unsetTimeStep(); |
| 186 | 192 |
|
| 193 |
+ /// request closing operator connection (NULL ok) (closed via time call) |
|
| 194 |
+ void requestOpConnClose(OpConn *pConn); |
|
| 195 |
+ |
|
| 196 |
+ /// remove operator connection from requests (call when op conn is closed) |
|
| 197 |
+ void forgetOpConn(OpConn *pConn); |
|
| 198 |
+ |
|
| 187 | 199 |
private: |
| 188 | 200 |
/// (re-)create image buffer |
| 189 | 201 |
void createImgBuf(); |
| ... | ... |
@@ -207,6 +219,7 @@ protected: |
| 207 | 219 |
private: |
| 208 | 220 |
bool m_haveTimeStep; ///< if a time step is pending |
| 209 | 221 |
Time m_timeStepTime; ///< time of next time step |
| 222 |
+ OpConnSet m_opConnsClose; ///< operator connections to be closed |
|
| 210 | 223 |
}; // class Canvas |
| 211 | 224 |
|
| 212 | 225 |
} // namespace Blinker |
| ... | ... |
@@ -140,8 +140,9 @@ void Pong::newOpConn(const std::string &name, OpConn *pConn) |
| 140 | 140 |
else if (name == m_name + c_opConnSuffixRight && ! m_pConnRight) {
|
| 141 | 141 |
m_pConnRight = pConn; |
| 142 | 142 |
} |
| 143 |
- // nothing happens |
|
| 143 |
+ // close imcoming connection as soon as possible, nothing else happens |
|
| 144 | 144 |
else {
|
| 145 |
+ requestOpConnClose(pConn); |
|
| 145 | 146 |
return; |
| 146 | 147 |
} |
| 147 | 148 |
|
| ... | ... |
@@ -191,6 +192,9 @@ void Pong::opConnRecvPlay(OpConn *pConn, const std::string &sound) |
| 191 | 192 |
*/ |
| 192 | 193 |
void Pong::opConnClose(OpConn *pConn) |
| 193 | 194 |
{
|
| 195 |
+ // remove coperator connection from requests (if it was in) |
|
| 196 |
+ forgetOpConn(pConn); |
|
| 197 |
+ |
|
| 194 | 198 |
// left player leaves |
| 195 | 199 |
if (pConn == m_pConnLeft) {
|
| 196 | 200 |
m_pConnLeft = NULL; |
| ... | ... |
@@ -634,10 +638,12 @@ void Pong::gameOver() |
| 634 | 638 |
{
|
| 635 | 639 |
// close open operator connections |
| 636 | 640 |
if (m_pConnLeft) {
|
| 641 |
+ forgetOpConn(m_pConnLeft); // remove from requests (if it was in) |
|
| 637 | 642 |
m_pConnLeft->close(); |
| 638 | 643 |
m_pConnLeft = NULL; |
| 639 | 644 |
} |
| 640 | 645 |
if (m_pConnRight) {
|
| 646 |
+ forgetOpConn(m_pConnRight); // remove from requests (if it was in) |
|
| 641 | 647 |
m_pConnRight->close(); |
| 642 | 648 |
m_pConnRight = NULL; |
| 643 | 649 |
} |
| 644 | 650 |