Stefan Schuermans commited on 2019-07-07 12:55:58
Showing 11 changed files, with 88 additions and 0 deletions.
| ... | ... |
@@ -89,6 +89,36 @@ |
| 89 | 89 |
No frames are sent when the game is inactive (i.e. no player has |
| 90 | 90 |
joined yet). |
| 91 | 91 |
</p> |
| 92 |
+ <h3>Sound Names</h3> |
|
| 93 |
+ <p> |
|
| 94 |
+ It is possible to request playing a sound on certain events occuring |
|
| 95 |
+ during the game. |
|
| 96 |
+ The names of the sounds to play are configurable via the following |
|
| 97 |
+ files: |
|
| 98 |
+ <table> |
|
| 99 |
+ <tr><td><b>file name</b></td> |
|
| 100 |
+ <td width="2em"></td> |
|
| 101 |
+ <td><b>play sound on event</b></td></tr> |
|
| 102 |
+ <tr><td><code>leftPlayerSound</code></td> |
|
| 103 |
+ <td></td> |
|
| 104 |
+ <td>player entered the game as left player</td></tr> |
|
| 105 |
+ <tr><td><code>rightPlayerSound</code></td> |
|
| 106 |
+ <td></td> |
|
| 107 |
+ <td>player entered the game as right player</td></tr> |
|
| 108 |
+ <tr><td><code>scoreSound</code></td> |
|
| 109 |
+ <td></td> |
|
| 110 |
+ <td>player scored a goal</td></tr> |
|
| 111 |
+ <tr><td><code>otherScoreSound</code></td> |
|
| 112 |
+ <td></td> |
|
| 113 |
+ <td>other player scored a goal</td></tr> |
|
| 114 |
+ <tr><td><code>winSound</code></td> |
|
| 115 |
+ <td></td> |
|
| 116 |
+ <td>player wins game</td></tr> |
|
| 117 |
+ <tr><td><code>looseSound</code></td> |
|
| 118 |
+ <td></td> |
|
| 119 |
+ <td>player looses game</td></tr> |
|
| 120 |
+ </table> |
|
| 121 |
+ </p> |
|
| 92 | 122 |
<h2>Operator Connection Interfaces</h2> |
| 93 | 123 |
<p> |
| 94 | 124 |
The name of the operator connection interfaces provided by this module |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+pongPlayerLeft |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+pongLose |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+pongOtherScore |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+pongPlayerRight |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+pongScore |
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+pongWin |
| ... | ... |
@@ -369,6 +369,14 @@ void Game::valueFromFile(UIntFile &valueFile, ValueDescr const &descr, |
| 369 | 369 |
} |
| 370 | 370 |
} |
| 371 | 371 |
|
| 372 |
+/// process update of sound name file |
|
| 373 |
+void Game::soundUpdate(NameFile &soundFile) |
|
| 374 |
+{
|
|
| 375 |
+ if (soundFile.checkModified()) {
|
|
| 376 |
+ soundFile.update(); |
|
| 377 |
+ } |
|
| 378 |
+} |
|
| 379 |
+ |
|
| 372 | 380 |
/// send current image buffer as frame to output stream |
| 373 | 381 |
void Game::sendFrame() |
| 374 | 382 |
{
|
| ... | ... |
@@ -186,6 +186,9 @@ protected: |
| 186 | 186 |
static void valueFromFile(UIntFile &valueFile, ValueDescr const &descr, |
| 187 | 187 |
unsigned int &value); |
| 188 | 188 |
|
| 189 |
+ /// process update of sound name file |
|
| 190 |
+ static void soundUpdate(NameFile &soundFile); |
|
| 191 |
+ |
|
| 189 | 192 |
/// send current image buffer as frame to output stream |
| 190 | 193 |
void sendFrame(); |
| 191 | 194 |
|
| ... | ... |
@@ -16,6 +16,7 @@ |
| 16 | 16 |
#include "Game.h" |
| 17 | 17 |
#include "Mgrs.h" |
| 18 | 18 |
#include "Module.h" |
| 19 |
+#include "NameFile.h" |
|
| 19 | 20 |
#include "OpConn.h" |
| 20 | 21 |
#include "OpConnIf.h" |
| 21 | 22 |
#include "OpReqIf.h" |
| ... | ... |
@@ -53,6 +54,12 @@ Pong::Pong(const std::string &name, Mgrs &mgrs, const Directory &dirBase): |
| 53 | 54 |
m_fileGoalColor(dirBase.getFile("goalColor")),
|
| 54 | 55 |
m_fileDelay(dirBase.getFile("delay")),
|
| 55 | 56 |
m_fileMaxScore(dirBase.getFile("maxScore")),
|
| 57 |
+ m_fileLeftPlayerSound(dirBase.getFile("leftPlayerSound")),
|
|
| 58 |
+ m_fileRightPlayerSound(dirBase.getFile("rightPlayerSound")),
|
|
| 59 |
+ m_fileScoreSound(dirBase.getFile("scoreSound")),
|
|
| 60 |
+ m_fileOtherScoreSound(dirBase.getFile("otherScoreSound")),
|
|
| 61 |
+ m_fileWinSound(dirBase.getFile("winSound")),
|
|
| 62 |
+ m_fileLoseSound(dirBase.getFile("loseSound")),
|
|
| 56 | 63 |
m_ballColor(), m_lineColor(), m_padColor(), m_computerColor(), |
| 57 | 64 |
m_scoreColor(), m_goalColor(), |
| 58 | 65 |
m_delay(c_delayDescr.default_), m_maxScore(c_maxScoreDescr.default_), |
| ... | ... |
@@ -101,6 +108,14 @@ bool Pong::updateConfigGame() |
| 101 | 108 |
ret = true; |
| 102 | 109 |
} |
| 103 | 110 |
|
| 111 |
+ // sound name file was modified -> re-read sound name, no other update needed |
|
| 112 |
+ soundUpdate(m_fileLeftPlayerSound); |
|
| 113 |
+ soundUpdate(m_fileRightPlayerSound); |
|
| 114 |
+ soundUpdate(m_fileScoreSound); |
|
| 115 |
+ soundUpdate(m_fileOtherScoreSound); |
|
| 116 |
+ soundUpdate(m_fileWinSound); |
|
| 117 |
+ soundUpdate(m_fileLoseSound); |
|
| 118 |
+ |
|
| 104 | 119 |
return ret; |
| 105 | 120 |
} |
| 106 | 121 |
|
| ... | ... |
@@ -135,10 +150,12 @@ void Pong::newOpConn(const std::string &name, OpConn *pConn) |
| 135 | 150 |
// left player joins if none there yet |
| 136 | 151 |
if (name == m_name + c_opConnSuffixLeft && ! m_pConnLeft) {
|
| 137 | 152 |
m_pConnLeft = pConn; |
| 153 |
+ requestOpConnSound(m_pConnLeft, m_fileLeftPlayerSound); |
|
| 138 | 154 |
} |
| 139 | 155 |
// right player joins if none there yet |
| 140 | 156 |
else if (name == m_name + c_opConnSuffixRight && ! m_pConnRight) {
|
| 141 | 157 |
m_pConnRight = pConn; |
| 158 |
+ requestOpConnSound(m_pConnRight, m_fileRightPlayerSound); |
|
| 142 | 159 |
} |
| 143 | 160 |
// close imcoming connection as soon as possible, nothing else happens |
| 144 | 161 |
else {
|
| ... | ... |
@@ -572,12 +589,28 @@ void Pong::detectGoal() |
| 572 | 589 |
if (m_ballPosX == 0) {
|
| 573 | 590 |
m_goalDelay = goalDelay; |
| 574 | 591 |
++m_scoreRight; |
| 592 |
+ // play sound - score or win |
|
| 593 |
+ if (m_scoreRight >= (int)m_maxScore) {
|
|
| 594 |
+ playOpConnSound(m_pConnRight, m_fileWinSound); |
|
| 595 |
+ playOpConnSound(m_pConnLeft, m_fileLoseSound); |
|
| 596 |
+ } else {
|
|
| 597 |
+ playOpConnSound(m_pConnRight, m_fileScoreSound); |
|
| 598 |
+ playOpConnSound(m_pConnLeft, m_fileOtherScoreSound); |
|
| 599 |
+ } |
|
| 575 | 600 |
} |
| 576 | 601 |
|
| 577 | 602 |
// ball at far right - goal for left player |
| 578 | 603 |
else if (m_ballPosX == m_width - 1) {
|
| 579 | 604 |
m_goalDelay = goalDelay; |
| 580 | 605 |
++m_scoreLeft; |
| 606 |
+ // play sound - score or win |
|
| 607 |
+ if (m_scoreLeft >= (int)m_maxScore) {
|
|
| 608 |
+ playOpConnSound(m_pConnLeft, m_fileWinSound); |
|
| 609 |
+ playOpConnSound(m_pConnRight, m_fileLoseSound); |
|
| 610 |
+ } else {
|
|
| 611 |
+ playOpConnSound(m_pConnLeft, m_fileScoreSound); |
|
| 612 |
+ playOpConnSound(m_pConnRight, m_fileOtherScoreSound); |
|
| 613 |
+ } |
|
| 581 | 614 |
} |
| 582 | 615 |
} |
| 583 | 616 |
|
| ... | ... |
@@ -19,6 +19,7 @@ |
| 19 | 19 |
#include "Game.h" |
| 20 | 20 |
#include "Mgrs.h" |
| 21 | 21 |
#include "Module.h" |
| 22 |
+#include "NameFile.h" |
|
| 22 | 23 |
#include "OpConn.h" |
| 23 | 24 |
#include "OpConnIf.h" |
| 24 | 25 |
#include "OpReqIf.h" |
| ... | ... |
@@ -186,6 +187,13 @@ protected: |
| 186 | 187 |
UIntFile m_fileDelay; ///< file for initial delay in ms per frame |
| 187 | 188 |
UIntFile m_fileMaxScore; ///< file for maximum score (end of game) |
| 188 | 189 |
|
| 190 |
+ NameFile m_fileLeftPlayerSound; ///< "left player" sound name file |
|
| 191 |
+ NameFile m_fileRightPlayerSound; ///< "right player" sound name file |
|
| 192 |
+ NameFile m_fileScoreSound; ///< "you scored" sound name file |
|
| 193 |
+ NameFile m_fileOtherScoreSound; ///< "other player scored" sound name file |
|
| 194 |
+ NameFile m_fileWinSound; ///< "you win" sound name file |
|
| 195 |
+ NameFile m_fileLoseSound; ///< "you lose" sound name file |
|
| 196 |
+ |
|
| 189 | 197 |
ColorData m_ballColor; ///< ball color |
| 190 | 198 |
ColorData m_lineColor; ///< center line color |
| 191 | 199 |
ColorData m_padColor; ///< phone player pad color |
| 192 | 200 |