00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00030 #if !defined(Player_h)
00031 #define Player_h
00032 
00033 #include <string>
00034 using namespace std;
00035 
00036 class Message;
00037 class Battle;
00038 class Bombing;
00039 class Order;
00040 class BattlePlanOrder;
00041 class RelationsOrder;
00042 class ProductionOrder;
00043 class MultipleOrder;
00044 #include "BattlePlan.h"
00045 #include "Ship.h"
00046 #include "ProdOrder.h"
00047 #include "Fleet.h"
00048 #include "Race.h"
00049 #include "MineField.h"
00050 
00054 class Player : public Race {
00055 public:
00056         Player(int id);
00057         virtual ~Player();
00058 
00059         void Remove()   { delete this; }
00060 
00061 
00062         bool ParseNode(const TiXmlNode * node, bool other);
00063         bool ParseCommon(const TiXmlNode * node);
00064         long CreateFromFile(const char * file);
00065         void SetupRelations();
00066         bool WriteNode(TiXmlNode * node, const Player * viewer) const;
00067         void ParseFleet(const TiXmlNode * node, bool other);
00068         void ParseOrders(const TiXmlNode * node);
00069         CargoHolder * ParseTransport(const TiXmlNode * node, const CargoHolder * owned);
00070         void TransferCargo(CargoHolder * from, CargoHolder * to, long pop, long fuel, deque<long> & cargo, bool write = true);
00071         void ParseMessages(const TiXmlNode * node);
00072 
00073 
00074         void ResetSeen();
00075         void SetSeenDesign(long p, long design, bool base);
00076         void SetSeenHull(long p, long design, bool base);
00077         void SetSeenHab(const Player * viewer)  { mSeenHab[viewer->GetID() - 1] = true; }
00078 
00079         Message * AddMessage(string type, const Location * loc);
00080         Message * AddMessage(string type);
00081         void WriteMessages(TiXmlNode * node, const char * type);
00082         void StoreMessageLocation(const Location * loc);
00083 
00084         
00085         bool HasGotTech() const                                 { return mGotTech; }
00086         void SetGotTech(bool val)                               { mGotTech = val; }
00087         long GainTech(long TechGain, TechType tech);
00088         long GainTech(long TechGain)                    { return GainTech(TechGain, mResearchField); }
00089         bool GainTechLevel(TechType tech);
00090         void GainSpyTech(long TechGain, TechType tech);
00091         void CheckTechGain();
00092         long TechCost(TechType tech) const;
00093         long GetTechLevel(TechType tech) const  { return mTechLevel[tech]; }
00094         void AddProductionTech();
00095 
00096         void SetResearchTax(double tax);
00097         void SetResearchField(long current);
00098         void SetResearchNext(long next);
00099         double GetResearchTax() const                   { return mResearchTax; }
00100         long GetResearchField() const                   { return mResearchField; }
00101         long GetResearchNext() const                    { return mResearchNext; }
00102 
00103         long GetScanSpace() const                               { return mScanSpace; }
00104         long GetScanPen() const                                 { return mScanPen; }
00105         const deque<ProdOrder *> & GetDefaultQ() const  { return mDefaultQ; }
00106         bool GetDefaultPayTax() const                   { return mDefaultPayTax; }
00107         void SetDefaultPayTax(bool pt)                  { mDefaultPayTax = pt; }
00108         const Fleet * GetFleet(long n) const    { return const_cast<Player *>(this)->NCGetFleet(n); }
00109         Fleet * NCGetFleet(unsigned long n);
00110         Fleet * GetFleetCreate(unsigned long n, const CargoHolder &loc);
00111         const Ship * GetShipDesign(unsigned long n) const;
00112         const Ship * GetBaseDesign(unsigned long n) const;
00113         unsigned long GetBaseDesign(const Ship * design) const
00114                 { return find(mBaseDesigns.begin(), mBaseDesigns.end(), design) - mBaseDesigns.begin(); }
00115         long GetShipNumber(const Ship * design) const
00116                 { return find(mShipDesigns.begin(), mShipDesigns.end(), design) - mShipDesigns.begin(); }
00117         const Ship * GetExistingDesign(const Ship * check) const;
00118         const Ship * GetExistingBaseDesign(const Ship * check) const;
00119 
00120         void DeleteFleet(Fleet * gone);
00121         unsigned long GetID() const                                             { return mID; }
00122         void SetRelations(const deque<long> rel);
00123         long GetRelations(const Player * p2) const              { return p2 == this ? PR_SELF : mRelations[p2->GetID()-1]; }
00124         const BattlePlan * GetBattlePlan(unsigned long num) const;
00125         void ChangeBattlePlan(BattlePlan * bp, int num);
00126         double GetDefenseValue() const                  { return mDefenseValue * DefenseFactor(); }
00127         double Miniturize(const Component * comp) const;
00128         long TerraLimit(HabType ht) const               { return mTerraLimit[ht]; }
00129         void BuildShips(Planet * planet, long Type, long number);
00130         long ForEachFleet(Fleet::FuncType func, bool arg);
00131 
00132         void ResetTerraLimits();
00133         void SetTerraLimit(HabType ht, long limit);
00134 
00135         void DoBattles();
00136         void AddBattleFleets(Battle * bat);
00137         bool AddBombingFleets(Bombing * bom, const Player* owner,const long t) const; 
00138         void ClearBattleEnemies();
00139         void SetBattleEnemy(long p)                     { mBattleEnemy[p] = true; mInBattle = true; }
00140         bool GetBattleEnemy(long p) const       { return mBattleEnemy[p]; }
00141         bool InThisBattle() const                       { return mInBattle; }
00142         
00143         const deque<Message *>& GetMessages() const {return mMessages;}
00144         long GetMineFieldID() const;
00145 
00146         void AddStartShips(Planet * planet, bool HomeWorld);
00147         void AddStartShips(const RacialTrait * rt, int i, Planet * planet, bool HomeWorld);
00148 
00149         bool HasHW()            { return mHasHW; }
00150         void PlaceHW(Planet * planet);
00151         void PlaceSW(Planet * second, Planet * homeworld);
00152 
00153         void IncrementBaseBuilt(long base)      { mBaseDesigns[base]->IncrementBuilt(1); }
00154         void LoadFleets();
00155         void LoadMinefields();
00156 
00157         bool UnsavedChanges() const     { return mUnsavedChanges != 0; }
00158         bool OpenOrdersFile();
00159         bool OpenOrdersFile(const char * file);
00160         bool SaveXFile();
00161         bool WriteXFile() const         { return mWriteXFile; }
00162         void SetWriteXFile()            { mWriteXFile = true; }
00163         void AddOrder(Order * o);
00164         void TestUndoRedo();
00165         const Order * GetOrder(int i)           { return mOrders[i]; }
00166         bool UndoOrder(int pos = -1);
00167         bool RedoOrder();
00168         void StartMultipleOrder();
00169         void EndMultipleOrder();
00170 
00171         void ParseResearchTax(const TiXmlNode * node);
00172         long ParseResearchField(const TiXmlNode * node);
00173 
00174         void UndoBattlePlan(BattlePlanOrder * bpo);
00175         TiXmlNode * WriteBattlePlan(TiXmlNode * node, int num) const;
00176 
00177         void SetProduction(const deque<ProdOrder *> & ords);
00178         void SetPayTax(bool paytax);
00179         void ParseWaypoints(const TiXmlNode * node);
00180 
00181 private:
00182         double mResearchTax;
00183         long mResearchField;
00184         long mResearchNext;
00185         bool mGotTech;
00186         deque<long> mTechLevel;
00187         deque<long> mTempTechLevel;
00188         deque<long> mTechProgress;
00189         long mScanSpace;
00190         long mScanPen;
00191         double mDefenseValue;
00192         deque<ProdOrder *> mDefaultQ;
00193         bool mDefaultPayTax;
00194         deque<Fleet *> mFleets;
00195         deque<Ship *> mShipDesigns;
00196         deque<Ship *> mBaseDesigns;
00197         deque<long> mRelations;
00198         deque<BattlePlan *> mBattlePlans;
00199         unsigned long mID;
00200         deque<long> mTerraLimit;
00201         deque<MineField *> mMineFields;
00202         deque<Message *> mMessages;
00203         deque<bool> mSeenHab;
00204 
00205         bool mWriteXFile;
00206         long mUnsavedChanges;
00207         deque<Order *> mOrders;
00208         MultipleOrder * mMO;
00209 
00210         
00211         deque<bool> mBattleEnemy;       
00212         bool mInBattle;                         
00213 
00214         bool mHasHW;    
00215 };
00216 
00217 #endif // !defined(Player_h)