Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List

Message.cpp

00001 /*
00002 Copyright 2003 - 2005 Elliott Kleinrock, Dan Neely, Kurt W. Over, Damon Domjan
00003 
00004 This file is part of FreeStars, a free clone of the Stars! game.
00005 
00006 FreeStars is free software; you can redistribute it and/or modify
00007 it under the terms of the GNU General Public License as published by
00008 the Free Software Foundation; either version 2 of the License, or
00009 (at your option) any later version.
00010 
00011 FreeStars is distributed in the hope that it will be useful,
00012 but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 GNU General Public License for more details.
00015 
00016 You should have received a copy of the GNU General Public License
00017 along with FreeStars; if not, write to the Free Software
00018 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 The full GPL Copyright notice should be in the file COPYING.txt
00021 
00022 Contact:
00023 Email Elliott at 9jm0tjj02@sneakemail.com
00024 */
00025 
00026 #include "FSServer.h"
00027 
00028 #include "Packet.h"
00029 
00030 #ifdef _DEBUG
00031 #define new DEBUG_NEW
00032 #endif
00033 
00034 /*
00035       - Some messages need to be generated by the client - like the "this planet is green", "that planet is owned by so-and-so", etc. messages because the turn file doesn't have access to the information in the history file.  Actually...most of this information should go in the history file and not here.  But it's useful to get the ideas down - and I'll need to create the appropriate information for them.
00036       VictoryMsg
00037       TieMsg
00038       LossMsg
00039       EmptyQueue
00040       TechIncrease
00041       TechNewPart
00042       MTPart
00043       MTTech
00044       MTShips
00045       MTErrorCargo  <!-- <MT>  I DEMAND 5000 KILOTONS OF IRONIUM! STOP GIVING ME BORANIUM ALREADY! -->
00046       MTErrorPart  <!-- You already have that part. -->
00047       MTErrorShips  <!-- Maybe lump this in under the generic "not enough slots" error. -->
00048       MTArrived  <!-- A new MT is advertising -->
00049       MTChangedDirection <!-- The MT has changed course and speed -->
00050       BattleThisTurn  <!-- You have been in 12 battles this turn... -->
00051       BattleWin
00052       BattleLoss
00053       BattleTie
00054       BattleComplex  <!-- I can't explain it.  Watch it in the battle viewer instead.  -->
00055       MineHitEnemy  <!-- An enemy has struck one of this player's minefields. -->
00056       MineHitFriendly  <!-- If the player has hit a mine. -->
00057       MineSweptEnemy  <!-- An enemy swept one of this player's minefields. -->
00058       MineSweptFriendly  <!-- The player has swept a minefield. -->
00059       MineLayed <!-- [Verify] You've deployed a minefield.  Are mines added to a minefield another message? -->
00060       FleetDone  <!-- The fleet has completed its orders.  -->
00061       FleetFuelGenerate <!-- Fleet x has generated y mg of fuel from its ramscoops. -->
00062       FleetFuelOut <!-- Fleet x has run out of gas.  Call AAA.  -->
00063       FleetBombed <!-- Your fleet has slaughtered 129800 innocent civilians.  -->
00064       FleetMerge
00065       FleetRoute <!-- [Verify] Fleet x has been routed to y. -->
00066       FleetSend <!-- You've sent a fleet to someone.  -->
00067         <!-- other player "out of slots" error -->
00068       FleetReceive <!-- Someone has transferred a fleet to you. -->
00069         <!-- Generic "out of slots" error -->
00070       FleetCargo <!-- Fleet w has transferred x ktons/mg of y to z, where z is another fleet or planet. -->
00071       PlanetBombed <!-- x people have died, y installations, and z defenses -->
00072       PlanetPacketed <!-- You've been hit by a big rock that did this much damage.  -->
00073       PacketInbound <!-- A packet you can't catch is boring in fast! -->
00074       PlayerMsg  <!-- Ignore other players transmissions.  -->
00075       PopLossPlanetVal <!-- You've lost colonists because it's a communist...err...red planet. -->
00076       PopLossCrowding <!-- Time to renovate the slums on that planet - you've got too many people for its value.  -->
00077       PlanetColonized  <!-- You've put your flag on this planet. -->
00078       EventTech  <!-- You've discovered an artifact.  -->
00079       EventTerra <!-- Fundamental changes have changed a random variable some amount.  Hm.  If fundamental changes have merely cancelled production, maybe don't include the variable changed and have the amount be -1 or something. -->
00080       EventMineralIncrease <!-- You've gotten lucky and discovered more minerals -->
00081       EventComet <!-- You've been smacked by a comet.  Seperate entries for all possible sizes? E.g. EventCometHuge, EventCometSmall? -->
00082       BuiltFactory
00083       BuiltMine
00084       BuiltDefense
00085       BuiltShip
00086       BuiltAlchemy
00087       BuiltPlanetaryScanner
00088       TerraInsta <!-- AKA Instaforming.  For the CAs in the house.  -->
00089       TerraBuilt <!-- Terra completed by building it in the queue.  -->
00090       TerraRemote <!-- From Orbital Adjusters (and maybe terra bombs?  Verify the latter) -->
00091       TerraPermanent <!-- Permanent terraforming for the CAs.  -->
00092       TerraPacket <!-- "Normal" terraforming from packeting a planet. -->
00093       TerraPacketPermanent <!-- "Deep" terraforming from packeting a planet. -->
00094         <!-- Double check messages given when packet terra occurs.  -->
00095 */
00096 
00097 Message::~Message()
00098 {
00099         for (unsigned int i = 0; i < mItems.size(); ++i) {
00100                 delete mItems[i];
00101         }
00102 
00103         mItems.erase(mItems.begin(), mItems.end());
00104 }
00105 
00106 MessItem::~MessItem()
00107 {
00108 }
00109 
00110 void MessItem::AddDesc(TiXmlElement * node) const
00111 {
00112         if (node != NULL && !mDesc.empty())
00113                 node->SetAttribute("Description", mDesc.c_str());
00114 }
00115 
00116 string MessItem::ToString() const
00117 {
00118         string m;
00119         if (!mDesc.empty()) {
00120                 m = "Desc: ";
00121                 m += mDesc;
00122                 m += " ";
00123         }
00124 
00125         return m;
00126 }
00127 
00128 MessItem * MessItem::ParseNode(const TiXmlNode * node)
00129 {
00130         if (node == NULL)
00131                 return NULL;
00132 
00133         MessItem * mi;
00134         if (stricmp(node->Value(), "Player") == 0)
00135                 mi = MessPlayer::ParseNode(node);
00136         else if (stricmp(node->Value(), "Number") == 0)
00137                 mi = MessNumber::ParseNode(node);
00138         else if (stricmp(node->Value(), "Float") == 0)
00139                 mi = MessFloat::ParseNode(node);
00140         else if (stricmp(node->Value(), "String") == 0)
00141                 mi = MessString::ParseNode(node);
00142         else
00143                 mi = MessLoc::ParseNode(node);
00144 
00145         if (mi != NULL) {
00146                 const TiXmlElement * tie = node->ToElement();
00147                 if (tie != NULL && tie->Attribute("Description"))
00148                         mi->mDesc = tie->Attribute("Description");
00149         }
00150 
00151         return mi;
00152 }
00153 
00154 MessLoc::~MessLoc()
00155 {
00156         if (mDWD)
00157                 delete mLoc;
00158 }
00159 
00160 void MessLoc::WriteNode(TiXmlNode * node) const
00161 {
00162         const Planet * planet = dynamic_cast<const Planet *>(mLoc);
00163         if (planet != NULL) {
00164                 TiXmlElement * pNode = new TiXmlElement("Planet");
00165                 AddDesc(pNode);
00166                 pNode->SetAttribute("IDNumber", planet->GetID());
00167                 AddString(pNode, "Name", planet->GetName().c_str());
00168                 node->LinkEndChild(pNode);
00169                 return;
00170         }
00171 
00172         const Fleet * fleet = dynamic_cast<const Fleet *>(mLoc);
00173         if (fleet != NULL) {
00174                 TiXmlElement * fNode = new TiXmlElement("Fleet");
00175                 AddDesc(fNode);
00176                 fNode->SetAttribute("IDNumber", fleet->GetID());
00177                 AddLong(fNode, "Owner", fleet->GetOwner()->GetID());
00178                 if (fleet->IsEmpty())
00179                         fleet->WriteLocation(fNode);
00180                 node->LinkEndChild(fNode);
00181                 return;
00182         }
00183 
00184         const Packet * packet = dynamic_cast<const Packet *>(mLoc);
00185         if (packet != NULL) {
00186                 TiXmlElement * pNode = new TiXmlElement("Packet");
00187                 AddDesc(pNode);
00188                 pNode->SetAttribute("IDNumber", packet->GetID());
00189                 if (packet->IsEmpty())
00190                         packet->WriteLocation(pNode);
00191                 node->LinkEndChild(pNode);
00192                 return;
00193         }
00194 
00195         const MineField * minef = dynamic_cast<const MineField *>(mLoc);
00196         if (minef != NULL) {
00197                 TiXmlElement * mNode = new TiXmlElement("MineField");
00198                 AddDesc(mNode);
00199                 mNode->SetAttribute("IDNumber", minef->GetID());
00200                 if (minef->IsEmpty())
00201                         minef->WriteLocation(mNode);
00202                 node->LinkEndChild(mNode);
00203                 return;
00204         }
00205 
00206         const Salvage * scrap = dynamic_cast<const Salvage *>(mLoc);
00207         if (scrap != NULL) {
00208                 TiXmlElement * sNode = new TiXmlElement("Salvage");
00209                 AddDesc(sNode);
00210                 sNode->SetAttribute("IDNumber", scrap->GetID());
00211                 if (scrap->IsEmpty())
00212                         scrap->WriteLocation(sNode);
00213                 node->LinkEndChild(sNode);
00214                 return;
00215         }
00216 
00217         TiXmlNode * lNode = mLoc->WriteLocation(node);
00218         AddDesc(lNode->ToElement());
00219 }
00220 
00221 MessLoc * MessLoc::ParseNode(const TiXmlNode * node)
00222 {
00223         MessLoc * mi = NULL;
00224         const TiXmlElement * tie;
00225         if (stricmp(node->Value(), "Planet") == 0) {
00226                 tie = node->ToElement();
00227                 if (tie != NULL) {
00228                         int pnum;
00229                         tie->Attribute("IDNumber", &pnum);
00230                         const Planet * p = TheGalaxy->GetPlanet(pnum);
00231                         if (p != NULL)
00232                                 mi = new MessLoc("", p);
00233                 }
00234         } else if (stricmp(node->Value(), "Fleet") == 0) {
00235                 const Player * p = TheGame->GetPlayer(GetLong(node->FirstChild("Owner")));
00236                 if (p != NULL) {
00237                         int fNum;
00238                         tie = node->ToElement();
00239                         if (tie != NULL) {
00240                                 tie->Attribute("IDNumber", &fNum);
00241                                 const Fleet * f = p->GetFleet(fNum);
00242                                 if (f != NULL)
00243                                         mi = new MessLoc("", f);
00244                         }
00245                 }
00246         } else if (stricmp(node->Value(), "Packet") == 0) {
00247         } else if (stricmp(node->Value(), "MineField") == 0) {
00248         } else if (stricmp(node->Value(), "Salvage") == 0) {
00249         } else if (stricmp(node->Value(), "Location") == 0) {
00250                 Location * loc = new Location();
00251                 loc->ParseNode(node);
00252                 mi = new MessLoc("", loc, true);
00253         }
00254 
00255         return mi;
00256 }
00257 
00258 bool MessLoc::StoreMessageLocation(const Location * loc)
00259 {
00260         if (mLoc != loc)
00261                 return false;
00262 
00263         assert(mDWD == false);
00264         mLoc = new Location(*loc);
00265         mDWD = true;
00266         return true;
00267 }
00268 
00269 string MessLoc::ToString() const
00270 {
00271         string m = MessItem::ToString() + "Location(";
00272         m += Long2String(mLoc->GetPosX());
00273         m += ", ";
00274         m += Long2String(mLoc->GetPosY());
00275         m += ") : ";
00276         
00277         const Planet * planet = dynamic_cast<const Planet *>(mLoc);
00278         if (planet != NULL)
00279         {
00280                 m += "Planet-> " + planet->GetName();
00281                 return m;
00282         }
00283                 
00284         const Fleet * fleet = dynamic_cast<const Fleet *>(mLoc);
00285         if (fleet != NULL)
00286         {
00287                 m += "Fleet-> Owner(";
00288                 m += Long2String(fleet->GetOwner()->GetID());
00289                 m += ") IDNumber(";
00290                 m += Long2String(fleet->GetID());
00291                 m += ")";
00292                 return m;
00293         }
00294 
00295         const Packet * packet = dynamic_cast<const Packet *>(mLoc);
00296         if (packet != NULL)
00297         {
00298                 m += "Packet-> IDNumber(" ;
00299                 m += Long2String(packet->GetID());
00300                 m += ")";
00301                 return m;
00302         }
00303                 
00304         const MineField * minef = dynamic_cast<const MineField *>(mLoc);
00305         if (minef != NULL)
00306         {
00307                 m += "MneField->";
00308 //              AddLong(mNode, "IDNumber", minef->GetID());
00309                 return m;
00310         }
00311 
00312         const Salvage * scrap = dynamic_cast<const Salvage *>(mLoc);
00313         if (scrap != NULL) {
00314                 m += "Salvage-> IDNumber(";
00315                 m += Long2String(scrap->GetID());
00316                 m += ")";
00317                 return m;
00318         }
00319         
00320         return m;
00321 }
00322 
00323 MessPlayer::~MessPlayer()
00324 {
00325 }
00326 
00327 void MessPlayer::WriteNode(TiXmlNode * node) const
00328 {
00329         AddDesc(AddLong(node, "Player", mPlayer->GetID()));
00330 }
00331 
00332 MessPlayer * MessPlayer::ParseNode(const TiXmlNode * node)
00333 {
00334         const Player * p = TheGame->GetPlayer(GetLong(node));
00335         if (p != NULL)
00336                 return new MessPlayer("", p);
00337         else
00338                 return NULL;
00339 }
00340 
00341 string MessPlayer::ToString() const
00342 {
00343         return MessItem::ToString() + string("Player: ") + Long2String(mPlayer->GetID());
00344 }
00345 
00346 MessNumber::~MessNumber()
00347 {
00348 }
00349 
00350 void MessNumber::WriteNode(TiXmlNode * node) const
00351 {
00352         AddDesc(AddLong(node, "Number", mNumber));
00353 }
00354 
00355 MessNumber * MessNumber::ParseNode(const TiXmlNode * node)
00356 {
00357         return new MessNumber("", GetLong(node));
00358 }
00359 
00360 string MessNumber::ToString() const
00361 {
00362         return MessItem::ToString() + string("Number: ") + Long2String(mNumber);
00363 }
00364 
00365 MessFloat::~MessFloat()
00366 {
00367 }
00368 
00369 void MessFloat::WriteNode(TiXmlNode * node) const
00370 {
00371         AddDesc(AddDouble(node, "Float", mNumber));
00372 }
00373 
00374 MessFloat * MessFloat::ParseNode(const TiXmlNode * node)
00375 {
00376         return new MessFloat("", GetDouble(node));
00377 }
00378 
00379 string MessFloat::ToString() const
00380 {
00381         return MessItem::ToString() + string("Number: ") + Float2String(mNumber);
00382 }
00383 
00384 MessString::~MessString()
00385 {
00386 }
00387 
00388 void MessString::WriteNode(TiXmlNode * node) const
00389 {
00390         AddDesc(AddString(node, "String", mStr.c_str()));
00391 }
00392 
00393 MessString * MessString::ParseNode(const TiXmlNode * node)
00394 {
00395         return new MessString("", GetString(node));
00396 }
00397 
00398 string MessString::ToString() const
00399 {
00400         string m = MessItem::ToString() + "String: " + mStr;
00401         return m;
00402 }
00403 
00404 
00405 void Message::AddItem(MessItem * mi)
00406 {
00407         mItems.push_back(mi);
00408 }
00409 
00410 /*
00411 <Message type="type">
00412         <Planet/>
00413         <Fleet/>
00414         <Packet/>
00415         ...
00416         <Location/>
00417         <Player/>
00418         <Number>456</Number>
00419         <String>String</String>
00420 </Message>
00421 */
00422 void Message::WriteNode(TiXmlNode * node) const
00423 {
00424         TiXmlElement * mNode = new TiXmlElement("Message");
00425         mNode->SetAttribute("Type", mType);
00426 
00427         for (unsigned int i = 0; i < mItems.size(); ++i)
00428                 mItems[i]->WriteNode(mNode);
00429 
00430         node->LinkEndChild(mNode);
00431 }
00432 
00433 bool Message::ParseNode(const TiXmlNode * node)
00434 {
00435         if (node == NULL)
00436                 return false;
00437 
00438         const TiXmlElement * tie = node->ToElement();
00439         if (tie == NULL)
00440                 return false;
00441 
00442         mType = tie->Attribute("Type");
00443         if (mType.empty())
00444                 return false;
00445 
00446         const TiXmlNode * child;
00447         MessItem * mi;
00448         for (child = node->FirstChild(); child != NULL; child = child->NextSibling()) {
00449                 mi = MessItem::ParseNode(child);
00450                 if (mi != NULL)
00451                         AddItem(mi);
00452         }
00453 
00454         return true;
00455 }
00456 
00457 string Message::ToString() const
00458 {
00459         string m = "Message (" + mType + ") :";
00460         for (unsigned int i = 0; i < mItems.size(); ++i)
00461                 m += "\n\t" + mItems[i]->ToString();
00462                 
00463         return m;
00464 }
00465 
00466 void Message::StoreMessageLocation(const Location * loc, const Player * player)
00467 {
00468         for (int i = 0; i < mItems.size(); ++i) {
00469                 MessLoc * ml = dynamic_cast<MessLoc *>(mItems[i]);
00470                 if (ml != NULL) {
00471                         if (ml->StoreMessageLocation(loc))
00472                                 AddItem("Deleted location", loc->GetName(player));
00473                 }
00474         }
00475 }

Generated on Mon Aug 8 21:33:43 2005 for Freestars by  doxygen 1.4.2-20050421