Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

NetworkSubsystem Namespace Reference


Functions

bool hasNetworkDataForCurrentTickBeenReceived (void)
 So we can "pause" the game if we have not received the current game tick data.

void processNetworkData (void)
 Processes the internal Queue of received data. Making the changes to game state needed for the current game tick.

void enQueueMsg (string s)
void receiveNetworkData (void)
 Receives data from Network stack and puts it on a Queue.

void loadNetworkData (ifstream &in)
 Loads a file of network data into the NetworkSubsystem. This allows you to watch replys of the game.


Function Documentation

void NetworkSubsystem::enQueueMsg string    s
 

Definition at line 452 of file Network.cpp.

References NetworkData::addData(), and netData.

Referenced by processIncomingMessages().

00453 {
00454         netData.addData(s);
00455 }

bool NetworkSubsystem::hasNetworkDataForCurrentTickBeenReceived void   
 

So we can "pause" the game if we have not received the current game tick data.

Definition at line 193 of file Network.cpp.

References Globals::currGameTick, NetworkData::hasDataForGameTickArrived(), netData, and Globals::NETWORK_GAME_TICK_LAG().

Referenced by Overhead::overhead_update().

00194 {
00195         if (currGameTick < NETWORK_GAME_TICK_LAG) return true;
00196         else return netData.hasDataForGameTickArrived(currGameTick);
00197 }

void NetworkSubsystem::loadNetworkData ifstream &    in
 

Loads a file of network data into the NetworkSubsystem. This allows you to watch replys of the game.

Definition at line 472 of file Network.cpp.

References NetworkData::addData(), netData, NetworkMessages::NETWORK_DATA(), and sys_console().

Referenced by main_init().

00473 {
00474         sys_console() << "Loading Network Data from a file" << endl;
00475         string line;
00476         do 
00477         {
00478                 getline(in,line);
00479                 if(line.find(NETWORK_DATA) != string::npos)
00480                 {
00481                         sys_console() << "loading data:" << line.substr(NETWORK_DATA.size()) << endl;
00482                         netData.addData(line.substr(NETWORK_DATA.size()));
00483                 }
00484         } while(in.good());
00485         sys_console() << "Done Loading Data" << endl;
00486 }

void NetworkSubsystem::processNetworkData void   
 

Processes the internal Queue of received data. Making the changes to game state needed for the current game tick.

Definition at line 199 of file Network.cpp.

References MilitaryUnit::armySize(), Player::bank(), NetworkData::clean(), MilitaryUnit::color(), NetworkMessages::COMMAND_ASK_FOR_RANDOM_NUMBER(), NetworkMessages::COMMAND_BATTLE_ID(), NetworkMessages::COMMAND_BATTLEMODE(), NetworkMessages::COMMAND_BEGINBATTLE(), NetworkMessages::COMMAND_BUILD_ARTILLERY(), NetworkMessages::COMMAND_BUILD_ECON(), NetworkMessages::COMMAND_BUILD_HEAVYTANK(), NetworkMessages::COMMAND_BUILD_JET(), NetworkMessages::COMMAND_BUILD_LIGHTTANK(), NetworkMessages::COMMAND_BUILD_ROCKET_LAUNCHER(), NetworkMessages::COMMAND_GOAL(), NetworkMessages::COMMAND_MORE_MONEY(), NetworkMessages::COMMAND_OVERHEAD(), NetworkMessages::COMMAND_PRINT_A_RANDOM_NUMBER_TO_THE_CONSOLE(), NetworkMessages::COMMAND_RANDOM_NUMBER_ANSWER(), NetworkMessages::COMMAND_SEND_JET_REINFORCEMENT(), NetworkMessages::COMMAND_SEND_MONEY(), NetworkMessages::COMMAND_SEND_UNIT_REINFORCEMENT(), NetworkMessages::COMMAND_SET_RALLY_POINT(), NetworkMessages::COMMAND_TEXT_MESSAGE(), NetworkMessages::COMMIT_TIME(), GameState::consolePlayer(), Globals::currGameTick, Overhead::deleteMilitaryUnit(), Bank::deposit(), BattleEntry::enQueueInput(), NetworkData::getData(), MilitaryUnit::goal(), GameState::messagesReceived(), net_amIServer(), net_getPlayerName(), net_send(), netData, Globals::NETWORK_GAME_TICK_LAG(), GameState::players(), randomNumberList, BattleEntry::sendAirReinforcement(), BattleEntry::sendGroundReinforcement(), City::setRallyPoint(), MilitaryUnit::shortcutKey(), sys_console(), sys_flushConsole(), sys_randInt(), Helper::toLower(), City::trainUnit(), uint, MilitaryUnit::unitType(), Helper::unserializeVec3D(), City::upgradeEcon(), VecString, VecStringIter, and Globals::WARNING().

Referenced by Overhead::overhead_update().

00200 {
00201         static internalGameTick = 0;
00202         assert(++internalGameTick == currGameTick && "processNetworkData is not getting called once for every game tick");
00203         VecString commands(netData.getData(currGameTick));
00204         for(VecStringIter iter = commands.begin(); iter != commands.end(); ++iter)
00205         {
00206                 //sys_console() << "processNetworkData:" << *iter << endl;
00207                 stringstream sstr(*iter);
00208                 string tmp;
00209                 sstr >> tmp;
00210                 if (tmp == COMMAND_OVERHEAD)
00211                 {
00212                         sstr >> tmp;
00213                         //if (tmp != COMMIT_TIME) throw Error("Invalid time in COMMAND_OVERHEAD");
00214                         int itmp;
00215                         sstr >> itmp;
00216                         //if (itmp != currGameTick) throw Error("Dealing with command that is not for currGameTick");
00217                         sstr >> tmp;
00218                         if (tmp == COMMAND_GOAL)
00219                         {
00220                                 uint uID;
00221                                 sstr >> uID;
00222                                 MilitaryUnit* unit(GameState::getMilitaryUnit(uID));
00223                                 if (unit == 0) 
00224                                 {
00225                                         stringstream sstr;
00226                                         sstr << "Network Warning: Unit with ID of " << uID << " not found";
00227                                         sys_console() << sstr.str() << endl;
00228                                 } else
00229                                 {
00230                                         unit->goal(unserializeVec3D(sstr));
00231                                 }
00232                         } else if (tmp == COMMAND_BUILD_LIGHTTANK)
00233                         {
00234                                 uint uID;
00235                                 sstr >> uID;
00236                                 City* city(GameState::getCity(uID));
00237                                 if (city == 0) 
00238                                 {
00239                                         stringstream sstr;
00240                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00241                                         throw Error(sstr.str());
00242                                 }
00243                                 city->trainUnit(UnitTypes::LIGHT_TANK);
00244                         } else if (tmp == COMMAND_BUILD_HEAVYTANK)
00245                         {
00246                                 uint uID;
00247                                 sstr >> uID;
00248                                 City* city(GameState::getCity(uID));
00249                                 if (city == 0) 
00250                                 {
00251                                         stringstream sstr;
00252                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00253                                         throw Error(sstr.str());
00254                                 }
00255                                 city->trainUnit(UnitTypes::HEAVY_TANK);
00256                         } else if (tmp == COMMAND_BUILD_ROCKET_LAUNCHER)
00257                         {
00258                                 uint uID;
00259                                 sstr >> uID;
00260                                 City* city(GameState::getCity(uID));
00261                                 if (city == 0) 
00262                                 {
00263                                         stringstream sstr;
00264                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00265                                         throw Error(sstr.str());
00266                                 }
00267                                 city->trainUnit(UnitTypes::LAUNCHER);
00268                         } else if (tmp == COMMAND_BUILD_ARTILLERY)
00269                         {
00270                                 uint uID;
00271                                 sstr >> uID;
00272                                 City* city(GameState::getCity(uID));
00273                                 if (city == 0) 
00274                                 {
00275                                         stringstream sstr;
00276                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00277                                         throw Error(sstr.str());
00278                                 }
00279                                 city->trainUnit(UnitTypes::ARTILLERY);
00280                         } else if (tmp == COMMAND_BUILD_JET)
00281                         {
00282                                 uint uID;
00283                                 sstr >> uID;
00284                                 City* city(GameState::getCity(uID));
00285                                 if (city == 0) 
00286                                 {
00287                                         stringstream sstr;
00288                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00289                                         throw Error(sstr.str());
00290                                 }
00291                                 city->trainUnit(UnitTypes::JET);
00292                         } else if( tmp == COMMAND_BUILD_ECON )
00293                         {
00294                                 uint uID;
00295                                 sstr >> uID;
00296                                 City* city(GameState::getCity(uID));
00297                                 if (city == 0) 
00298                                 {
00299                                         stringstream sstr;
00300                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00301                                         throw Error(sstr.str());
00302                                 }
00303                                 city->upgradeEcon();
00304                         } else if (tmp == COMMAND_SET_RALLY_POINT)
00305                         {
00306                                 uint uID;
00307                                 sstr >> uID;
00308                                 City* city(GameState::getCity(uID));
00309                                 if (city == 0) 
00310                                 {
00311                                         stringstream sstr;
00312                                         sstr << "Networking Error: City with ID of " << uID << " not found";
00313                                         throw Error(sstr.str());
00314                                 }
00315                                 city->setRallyPoint(unserializeVec3D(sstr));
00316                         } else 
00317                         {
00318                                 sys_console() << WARNING << "throw Error(\"Invalid COMMAND_OVERHEAD command\");" << endl;
00319                                 sys_flushConsole();
00320                         }
00321                 } else if (tmp == COMMAND_BATTLEMODE)
00322                 {
00323                         uint battleNumber;
00324                         sstr >> tmp; /*COMMIT_TIME*/
00325                         sstr >> tmp; /* dido */
00326                         sstr >> tmp;
00327                         if (tmp == COMMAND_BATTLE_ID)
00328                         {
00329                                 sstr >> battleNumber;
00330                                 BattleEntry* battle(GameState::getBattle(battleNumber));
00331                                 if (battle)
00332                                 {
00333                                         battle->enQueueInput(*iter);
00334                                 } else 
00335                                 {
00336                                         sys_console() << WARNING << COMMAND_BATTLEMODE << " received and there is no active battle with that ID" << endl;
00337                                 }
00338                         } else
00339                         {
00340                                 sys_console() << WARNING << "assert(tmp == COMMAND_BATTLE_ID);" << endl;
00341                                 sys_flushConsole();
00342                         }
00343                 } else if (tmp == COMMAND_BEGINBATTLE)
00344                 {
00345                         sys_console() << WARNING << "throw Error(COMMAND_BEGINBATTLE + \" received\");" << endl;
00346                 } else if (tmp == COMMAND_PRINT_A_RANDOM_NUMBER_TO_THE_CONSOLE)
00347                 {
00348                         sys_console() << "Random Number:" << rand() << endl;
00349                 } else if (tmp == COMMAND_TEXT_MESSAGE)
00350                 {
00351                         sstr >> tmp >> tmp; //COMMIT TIME
00352                         getline(sstr,tmp);
00353                         GameState::messagesReceived().addMessage(tmp);
00354                 } else if (tmp == COMMAND_MORE_MONEY)
00355                 {
00356                         const int moreMoneyAmount(10000);
00357                         for(vector<Player*>::iterator iter(GameState::players().begin()); iter != GameState::players().end(); ++iter)
00358                         {
00359                                 (*iter)->bank().deposit(moreMoneyAmount);
00360                         }
00361                 } else if (tmp == COMMAND_SEND_MONEY)
00362                 {
00363                         sstr >> tmp >> tmp; //COMMIT TIME
00364                         int amount;
00365                         sstr >> amount;
00366                         string player;
00367                         getline(sstr, player);
00368                         player = Helper::toLower(Helper::eatEarlyWhiteSpace(player));
00369                         if (player == Helper::toLower(net_getPlayerName())) 
00370                         {
00371                                 GameState::consolePlayer()->bank().deposit(amount);
00372                                 stringstream outMsg;
00373                                 outMsg << "You just received " << amount;
00374                                 GameState::messagesReceived().addMessage(outMsg.str());
00375                         }
00376                 } else if (tmp == COMMAND_ASK_FOR_RANDOM_NUMBER)
00377                 {
00378                         sstr >> tmp >> tmp; //COMMIT TIME
00379                         int number;
00380                         sstr >> number;
00381                         stringstream netOut;
00382                         int randomNumber(sys_randInt());
00383                         netOut << COMMAND_RANDOM_NUMBER_ANSWER << " " << COMMIT_TIME << " " << currGameTick + NETWORK_GAME_TICK_LAG
00384                                    << " " << randomNumber << " " << number;
00385                         net_send(netOut.str());
00386                 } else if (tmp == COMMAND_RANDOM_NUMBER_ANSWER)
00387                 {
00388                         if (net_amIServer())
00389                         {
00390                                 sstr >> tmp >> tmp; //COMMIT TIME
00391                                 int number;
00392                                 int randomNumber;
00393                                 sstr >> randomNumber >> number;
00394                                 hash_map<int,int>::iterator iter = randomNumberList.find(number);
00395                                 if (iter == randomNumberList.end())
00396                                 {
00397                                         randomNumberList.insert(pair<int,int>(number,randomNumber));
00398                                 } else if (iter->second != randomNumber)
00399                                 {
00400                                         stringstream msg;
00401                                         msg << COMMAND_TEXT_MESSAGE << " " << COMMIT_TIME << " " << currGameTick + NETWORK_GAME_TICK_LAG << " "
00402                                                 << "MAJOR ERROR! Games are out of sync at " << currGameTick;
00403                                         net_send(msg.str());
00404                                 }
00405                         }
00406                 } else if (tmp == COMMAND_SEND_JET_REINFORCEMENT)
00407                 {
00408                         sstr >> tmp >> tmp;
00409                         int battleNumber;
00410                         sstr >> battleNumber;
00411                         int unitNumber;
00412                         sstr >> unitNumber;
00413                         BattleEntry* entry(GameState::getBattle(battleNumber));
00414                         MilitaryUnit* unit(GameState::getMilitaryUnit(unitNumber));
00415                         if (entry != 0 && unit != 0)
00416                         {
00417                                 entry->sendAirReinforcement( unit->color(), unit->armySize(), dynamic_cast<Jet*>(unit)->getCityID() );
00418                                 Overhead::deleteMilitaryUnit(unit);
00419                         } else 
00420                         {
00421                                 sys_console() << WARNING << " entry or unit not found" << endl;
00422                         }
00423                 } else if (tmp == COMMAND_SEND_UNIT_REINFORCEMENT)
00424                 {
00425                         sstr >> tmp >> tmp;
00426                         int battleNumber;
00427                         sstr >> battleNumber;
00428                         int unitNumber;
00429                         sstr >> unitNumber;
00430                         BattleEntry* entry(GameState::getBattle(battleNumber));
00431                         MilitaryUnit* unit(GameState::getMilitaryUnit(unitNumber));
00432                         if (entry != 0 && unit != 0)
00433                         {
00434                                 entry->sendGroundReinforcement( unit->color(), unit->unitType(), unit->armySize(), unit->shortcutKey() );
00435                                 Overhead::deleteMilitaryUnit(unit);
00436                         } else
00437                         {
00438                                 sys_console() << WARNING << " entry or unit not found" << endl;
00439                         }
00440                 } else 
00441                 {
00442                         sys_console() << WARNING 
00443                                 << "throw Error(\"Don't know what to do with command received over the network.  Command received is:\" + *iter);" 
00444                                 << *iter << endl;
00445                         sys_flushConsole();
00446                 }
00447         }
00448         commands.clear();
00449         netData.clean(currGameTick);
00450 }

void NetworkSubsystem::receiveNetworkData void   
 

Receives data from Network stack and puts it on a Queue.

Definition at line 458 of file Network.cpp.

References NetworkData::addData(), net_recv(), netData, NetworkMessages::NETWORK_DATA(), sys_console(), and sys_flushConsole().

Referenced by Overhead::overhead_update().

00459 {
00460         string str;
00461         while((str = net_recv()).size() != 0) 
00462         {
00463                 istringstream strm( str.c_str() );
00464                 string cmd;
00465                 strm >> cmd;
00466                 if( cmd!="CommandSync" ) sys_console() << NETWORK_DATA << str << endl;          // don't print all sync messages
00467                 sys_flushConsole();
00468                 netData.addData(str);
00469         }
00470 }


Generated on Wed Apr 23 05:52:18 2003 for Modern Warfare by doxygen1.3-rc2