Rev 35 | 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"
#include "VirtualFileSystem.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;
using namespace SPK;
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();
bool UpdateSigned(bool updateFiles) { m_bSigned = false; return false; }
// ship extraction
bool startExtractShip(CVirtualFileSystem *pVfs, const Utils::String &sId, CProgressInfo *pProgress);
bool extractShip(CVirtualFileSystem *pVfs, const Utils::String &sId, CProgressInfo *progress);
bool extractSceneFiles(CVirtualFileSystem *pVfs);
void extractComponants(CVirtualFileSystem *pVfs, CyStringList *sceneModels);
void extractDummies(CVirtualFileSystem *pVfs, CyStringList *sceneModels, bool add);
void extractTextures(CVirtualFileSystem *pVfs);
bool extractBodies(CVirtualFileSystem *pVfs, CyStringList *sceneModels);
bool extractCockpits(CVirtualFileSystem *pVfs);
bool processSceneFileSection(int section, CVirtualFileSystem *pVfs, CyStringList *lModels, CProgressInfo *progress);
bool processSceneFiles(CVirtualFileSystem *pVfs, CProgressInfo *progress);
void PackAllFiles();
CyStringList *ReadSceneModels();
//TODO: convert this
void ExtractTexts(CCatFile *catFile, CCatFile *secondCatFile, int textId);
bool GetTextureList(CyStringList *list, const unsigned char *olddata, size_t size);
bool AddTextFromFile(FILE *id, int textId = -1);
bool AddTextFromFile(CyString file, int textId = -1);
bool ImportBodies(CyStringList *sceneModels, CyString filename);
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__