Subversion Repositories spk

Rev

Rev 14 | Rev 35 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef _XSPFILE_H__
#define _XSPFILE_H__

#include "BaseFile.h"
#include "ShipData.h"
#include "StringList.h"

class CCatFile;

#define SHIPYARD_NONE             0
#define SHIPYARD_ARGON            1
#define SHIPYARD_BORON            2
#define SHIPYARD_PARANID          4
#define SHIPYARD_SPLIT            8
#define SHIPYARD_TELADI          16
#define SHIPYARD_PIRATES         32
#define SHIPYARD_FRIEND          64
#define SHIPYARD_XENON          128
#define SHIPYARD_TERRAN         256
#define SHIPYARD_ATF            512
#define SHIPYARD_YAKI           1024

#define SHIPYARD_MAX    SHIPYARD_TERRAN

enum {TAT_NONE, TAT_SINGLE, TAT_3};

#define TSHIPPOS_CLASS          53

enum {IMPORTSHIP_NONE, IMPORTSHIP_SCENE, IMPORTSHIP_EXTRACTSCENE, IMPORTSHIP_DUMMIES, IMPORTSHIP_COMPONANT, IMPORTSHIP_MODELS, IMPORTSHIP_TEXTURES, IMPORTSHIP_TEXTS, IMPORTSHIP_BODIES, IMPORTSHIP_COCKPITS, IMPORTSHIP_PACK, IMPORTSHIP_DONE};

int              SPKEXPORT GetMaxShipyards ();
CyString SPKEXPORT GetShipyardName (int s);

typedef struct SWeaponMask {
        int             iMask;
        int             iGame;
} SWeaponMask;

typedef struct SText
{
        int             iId;
        CyString sName;
        CyString sDesc;
} SText;

typedef struct SDummy
{
        CyString        sSection;
        CyString sData;
} SDummy;

typedef struct SComponent
{
        CyString sSection;
        CyString sSection2;
        CyString sData;
} SComponent;

typedef struct SCockpit
{
        CyString           sCockpit;
        CLinkList<SWeaponMask> lWeaponMask;
        int                             iIndex;
} SCockpit;


class SPKEXPORT CXspFile : public CBaseFile
{
public:
        CXspFile ();
        ~CXspFile () { this->Delete(); }

        static bool ReadAnimations(CyStringList *lIn, CyStringList *lOut, int startRecord);
        static int GetAnimationType(CyString type);

        virtual bool WriteHeader ( FILE *id, int, int );

        bool IsLanguageText () { return m_bLanguageText; }
        bool IsExistingShip () { return m_bExistingShip; }

        int  GetOriginalDescription () { return m_iOrgDesc; }
        int  GetShipyards () { return m_iShipyard; }

        const Utils::String &GetShipID () const { return m_sID; }
        const Utils::String &GetShipData () const { return m_sData; }
        CyString GetX3ShipData();
        CyString GetTCShipData();
        CyString GetShipFilename () 
        { 
                CyString s = m_sName + "-" + m_sAuthor; 
                s = s.Remove ( ' ' );
                s = s.Remove ( '\\' );
                s = s.Remove ( '/' );
                return s;
        }

        SText *FindShipText(int lang);
        CyString GetTextName(int lang);
        CyString GetTextDescription(int lang);

        void SetLanguageText            ( bool b )   { m_bLanguageText = b; m_bChanged = true; }
        void SetExistingShip            ( bool b )   { m_bExistingShip = b; m_bChanged = true; }
        void SetOriginalDescription     ( int i )        { m_iOrgDesc = i; m_bChanged = true; }
        void SetShipID                          (const Utils::String &sId ) { m_sID = sId; m_bChanged = true; }
        void SetShipData                        (const Utils::String &sData ) { m_sData = sData; m_bChanged = true; }

        void SetSceneFile ( C_File *f ) { m_pSceneFile = f; }
        void SetCockpitFile ( C_File *f ) { m_pCockpitFile = f; }

        void AddAnimation(CyStringList *list);
        void AddAnimation(CyString data) { m_lAnimations.PushBack(data, true); m_bChanged = true; }
        void AddBodies(CyString data);
        void AddBody(CyString section, CyString data);
        void AddCutData(CyString data) { m_lCutData.PushBack(data, true); m_bChanged = true; }
        void AddText ( int id, CyString name, CyString desc );
        void AddCockpit ( CyString cockpit, int game, int mask = -1, int index = -1 );
        void NewCockpit ( CyString id, CyString scene, int mask );
        void EditCockpit ( CyString id, CyString cockpit);
        void EditCockpit(CyString id, CyString scene, int mask);
        CyString GetCockpitData(CyString id);
        SCockpit *FindCockpit(CyString id);
        void AddDummy ( CyString section, CyString data );
        void AddComponent ( CyString section, CyString section2, CyString data );
        void AddWeaponMask ( int game, int mask );
        void AddMissileMask ( int game, int mask );
        void RemoveText(int id);
        void ClearText() { m_lText.MemoryClear(); m_bChanged = true; }

        void AddShipyard ( int s ) { m_iShipyard |= s; m_bChanged = true; }
        void RemoveShipyard ( int s ) { m_iShipyard &= ~(s); m_bChanged = true; }
        void SetShipyard(int s, bool b) { if ( b ) AddShipyard(s); else RemoveShipyard(s); }
        void ToggleShipyard(int s) { if ( this->IsShipyard(s) ) RemoveShipyard(s); else AddShipyard(s); }

        bool RemoveCutData(CyString cut);
        bool RemoveCockpit(CyString cockpitid);
        bool RemoveComponent(CyString section1, CyString section2, CyString data);
        bool RemoveDummy(CyString section, CyString data);
        bool RemoveBodies(CyString body);
        bool RemoveAnimation(CyString ani);

        bool IsSigned() { return false; }
        bool IsValid ();
        bool IsShipyard(int s) { return (m_iShipyard & s) ? true : false; }
        bool AnyShipyards() { return (m_iShipyard > 0) ? true : false; }
        void AdjustCockpits();
        virtual Utils::String CreateValuesLine () const;
        virtual bool ParseValueLine(const Utils::String &line);

        virtual int GetType () { return TYPE_XSP; }

        CyString GetShipName(int lang);
        bool ConvertOld(CyString file);

        CyStringList *GetAnimations() { return &m_lAnimations; }
        CyStringList *GetCutData() { return &m_lCutData; }
        CyStringList *GetBodies() { return &m_lBodies; }
        CLinkList<SWeaponMask> *GetLaserMasks() { return &m_lWeaponMasks; }
        CLinkList<SWeaponMask> *GetMissileMasks() { return &m_lMissileMasks; }
        CLinkList<SText> *GetTexts() { return &m_lText; }
        CLinkList<SDummy> *GetDummies() { return &m_lDummy; }
        CLinkList<SComponent> *GetComponents() { return &m_lComponent; }
        CLinkList<SCockpit> *GetCockpits() { return &m_lCockpit; }
        int GetLaserMask(int game, bool getOnly = false);
        int GetMissileMask(int game, bool getOnly = false);
        void SetLaserMask(int game, int mask);
        void SetMissileMask(int game, int mask);

        void SetCreatedShipData(CShipData *data) { m_sData = data->CreateData().ToString(); }
        bool AnyTexts() { return !m_lText.empty(); }
        bool AnyDummies() { return !m_lDummy.empty(); }
        bool AnyComponents() { return !m_lComponent.empty(); }
        bool AnyCockpits() { return !m_lCockpit.empty(); }
        bool AnyCutData() { return !m_lCutData.Empty(); }
        bool AnyBodies() { return !m_lBodies.Empty(); }
        bool AnyAnimations() { return !m_lAnimations.Empty(); }

        CyString GetShipClass();

        // ship extraction
        bool StartExtractShip(CyString catFile, CyString secondCatFile, CyString id, CProgressInfo *progress);
        bool StartExtractShip(CCatFile *catFile, CCatFile *secondCatFile, CyString id, CProgressInfo *progress);
        bool ExtractShip(CCatFile *catFile, CyString id, CProgressInfo *progress);
        bool ExtractShip(CyString catFile, CyString id, CProgressInfo *progress);
        C_File *ExtractFileToPackage(CCatFile *catFile, CyString file, int type, CyString addAs = NullString);

        bool ExtractSceneFiles(CCatFile *catFile, CCatFile *secondCatFile);
        bool ExtractSceneFiles(CyString catFile, CyString secondCatFile);

        bool ProcessSceneFileSection(int section, CCatFile *catFile, CCatFile *secondCatFile, CyStringList *lModels, CProgressInfo *progress);
        bool ProcessSceneFiles(CCatFile *catFile, CCatFile *secondCatFile, CProgressInfo *progress);
        bool ProcessSceneFiles(CyString catFile, CyString secondCatFile, CProgressInfo *progress);

        bool UpdateSigned(bool updateFiles) { m_bSigned = false; return false; }
        void PackAllFiles();
        CyStringList *ReadSceneModels();
        void ExtractComponants(CCatFile *catFile, CyStringList *sceneModels);
        void ExtractDummies(CCatFile *catFile, CCatFile *secondCat, CyStringList *sceneModels, bool add);
        void ExtractTextures(CCatFile *catFile, CCatFile *secondCatFile);
        bool GetTextureList(CyStringList *list, const unsigned char *olddata, size_t size);
        void ExtractTexts(CCatFile *catFile, CCatFile *secondCatFile, int textId);
        bool AddTextFromFile(FILE *id, int textId = -1);
        bool AddTextFromFile(CyString file, int textId = -1);
        bool ExtractBodies(CCatFile *catFile, CCatFile *secondCatFile, CyStringList *sceneModels);
        bool ImportBodies(CyStringList *sceneModels, CyString filename);
        bool ExtractCockpits(CCatFile *catFile, CCatFile *secondCatFile);
        bool ImportCockpits(CyString filename);
        CyString FormatShipData(CyStringList *cockpits, int *text, int game);

        virtual bool LoadPackageData(const Utils::String &sFfirst, const Utils::String &sRest);
        virtual bool GeneratePackagerScript(bool wildcard, CyStringList *list, bool datafile = false);

protected:
        virtual void Delete ();
        virtual void SetDefaults ();
        virtual bool CheckHeader(const Utils::String header) const;

        C_File *m_pSceneFile, *m_pCockpitFile;

        bool m_bLanguageText, m_bExistingShip;

        int m_iOrgDesc;

        Utils::String m_sID;
        Utils::String m_sData;

        CyStringList                    m_lCutData;
        CyStringList                    m_lBodies;
        CyStringList                    m_lAnimations;
        CLinkList<SCockpit>             m_lCockpit;
        CLinkList<SText>                m_lText;
        CLinkList<SComponent>   m_lComponent;
        CLinkList<SDummy>               m_lDummy;
        CLinkList<SWeaponMask>  m_lWeaponMasks;
        CLinkList<SWeaponMask>  m_lMissileMasks;

        int m_iShipyard;
};


#endif //_XSPFILE_H__