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. | |
|
|
Definition at line 452 of file Network.cpp. References NetworkData::addData(), and netData. Referenced by processIncomingMessages().
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
1.3-rc2