/* FinalSun/FinalAlert 2 Mission Editor Copyright (C) 1999-2024 Electronic Arts, Inc. Authored by Matthias Wagner This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /************************************** Global structs here **************************************/ #ifndef GLOBALSTRUCTS_H_INCLUDED #define GLOBALSTRUCTS_H_INCLUDED #include "defines.h" #include #include #include #include "MissionEditorPackLib.h" #include "Vec2.h" class MapTool; enum class TheaterChar : char { T = 'T', A = 'A', U = 'U', N = 'N', D = 'D', L = 'L', Generic = 'G', None = 0 }; inline TheaterChar toTheaterChar(char c) { switch (c) { case 'T': return TheaterChar::T; case 'A': return TheaterChar::A; case 'U': return TheaterChar::U; case 'N': return TheaterChar::N; case 'D': return TheaterChar::D; case 'L': return TheaterChar::L; case 'G': return TheaterChar::Generic; default: return TheaterChar::None; } } struct CLIPBOARD_MAPCOPY_ENTRY { BOOL bRedrawTerrain; BYTE overlay; BYTE overlaydata; WORD wGround; WORD bMapData; BYTE bSubTile; BYTE bHeight; BYTE bMapData2; // for RA2<->TS conversion: WORD wTileSet; BYTE bTile; }; struct CLIPBOARD_DATA { DWORD dwType; DWORD dwVersion; DWORD dwReserved; BYTE bGame; // 0 TS, 1 RA2 UINT iWidth; UINT iHeight; }; struct VBORDER { short left; short right; }; /* picdata Holds information for every picture: a directdraw surface, and additional data */ struct PICDATA { PICDATA() = default; PICDATA(const PICDATA& c) = default; PICDATA& operator=(const PICDATA& c) = default; ~PICDATA() = default; #ifndef NOSURFACES_OBJECTS LPDIRECTDRAWSURFACE4 pic; #else void* pic = nullptr; // BYTE* to image, exception: if bType==PICDATA_TYPE_BMP then this is a LPDIRECTDRAWSURFACE! VBORDER* vborder = nullptr; const int* pal = nullptr; std::shared_ptr> lighting; std::shared_ptr> rawPic; std::shared_ptr> _vBorder; #endif FSunPackLib::VoxelNormalClass normalClass = FSunPackLib::VoxelNormalClass::Unknown; short x = 0; // for SHPs (starting point of main graphic inside surface) short y = 0; // for SHPs (starting point of main graphic inside surface) WORD wWidth = 0; // for non-shps: size of whole surface, else size of main graphic WORD wHeight = 0; // for non-shps: size of whole surface, else size of main graphic WORD wMaxWidth = 0; // for SHPs (size of whole surface) WORD wMaxHeight = 0; // for SHPs (size of whole surface) BYTE bType = 0; // is loaded from voxel, shp, bmp, etc... (for drawing logic) TheaterChar bTerrain = TheaterChar::None; BOOL bTried = 0; // already tried to load this? - superseded by global array missingimages inline ProjectedVec drawOffset() const { return ProjectedVec(x, y); } #ifdef NOSURFACES_OBJECTS void createVBorder(); #endif }; /* TILEPIC / TILEDATA Holds information for every tile/subtile in TS. */ struct SUBTILE { #ifndef NOSURFACES LPDIRECTDRAWSURFACE4 pic; #else #ifdef NOSURFACES_EXTRACT BOOL bNotExtracted; // pic is not extracted, even if NOSURFACES_EXTRACT is specifed. Probably there is inner transparency! #endif BYTE* pic; // optionally use direct blitting? This is either a palette index array or non-palette data (if NOSURFACES_EXTRACT is specified) VBORDER* vborder; #endif WORD wWidth; // width of tile WORD wHeight; // height " short sX; // x starting pos short sY; // y starting pos BYTE bZHeight; // z difference from tile ground surface (1unit == f_y/2pixel == 12pixel) BYTE bDirection; // for ramps for example BYTE bTerrainType; // water, etc... RGBTRIPLE rgbLeft; RGBTRIPLE rgbRight; BYTE bHackedTerrainType; // same like bTerrainType, except some shore pieces that were hacked in fsdata.ini std::shared_ptr anim; inline ProjectedVec drawOffset() const { return ProjectedVec(sX, sY); } }; struct TILEDATA { TILEDATA() = default; ~TILEDATA(); WORD wTileSet = 0; SUBTILE* tiles = nullptr; // the different tiles WORD wTileCount = 0; // number of tiles WORD cx = 0; WORD cy = 0; BOOL bAllowTiberium = 0; BOOL bAllowToPlace = TRUE; BOOL bMorphable = FALSE; // morphable using lower/raise ground function? BOOL bHide = FALSE; // for user interface only BOOL bMarbleMadness = FALSE; WORD wMarbleGround = 0xFFFF; public: RECT rect = { 0 }; TILEDATA* lpReplacements = nullptr; BYTE bReplacementCount = 0; }; /* actiondata CViewObjects sets this data struct, and CIsoView uses it to interact with the user´s CViewObjects and terrain editing choice */ struct ACTIONDATA { DWORD mode; DWORD type; DWORD data; DWORD data2; DWORD data3; int z_data; CString data_s; std::unique_ptr tool; ~ACTIONDATA(); void reset(); }; struct SIDEINFO { CString name; int orig_n; }; struct HOUSEINFO { CString name; SIDEINFO* side; // side is used for rules.ini owner= settings RGBTRIPLE color; BOOL bPlayable; }; /********************** Unittype infos **********************/ /* building infos */ struct BUILDING_INFO { PICDATA pic[8]; int pic_count; BYTE w; BYTE h; BOOL bTemp; BOOL bSnow; BOOL bUrban; }; struct TREE_INFO { PICDATA pic; BYTE w; BYTE h; }; #ifdef SMUDGE_SUPP struct SMUDGE_INFO { PICDATA pic; //BYTE w; //BYTE h; }; #endif /* ** Condition enumeration */ enum ConditionEnum { COND_LT = 0, // less than COND_LE, // less than or equal to COND_EQ, // equal to COND_GE, // greater than or equal to COND_GT, // greater than COND_NE, // not equal to COND_COUNT }; struct AITrigInfo { union { struct { int Number; ConditionEnum Condition; }; char Padding[32]; }; }; /* Struct for string items */ struct XCString { XCString() { //wString=new(WCHAR[2]); //memset(wString, 0, 4); wString = NULL; bUsedDefault = FALSE; len = 0; } ~XCString() { if (wString) delete[] wString; len = 0; wString = NULL; } void SetString(const CHAR* cString) { len = strlen(cString); this->cString = cString; if (wString) delete[] wString; bUsedDefault = FALSE; wString = new(WCHAR[len + 1]); memset(wString, 0, (len + 1) * sizeof(WCHAR)); size_t convertedSize = 0; mbstowcs_s(&convertedSize, wString, len + 1, cString, len); } void SetString(const WCHAR* wString, int len) { this->len = len; if (this->wString) delete[] this->wString; bUsedDefault = FALSE; this->wString = new(WCHAR[len + 1]); memset(this->wString, 0, (len + 1) * 2); memcpy(this->wString, wString, len * 2); auto bufferSize = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, this->wString, len + 1, nullptr, 0, NULL, &bUsedDefault); if (bufferSize == 0) { cString = ""; return; // failed } std::vector bByte(bufferSize + 4, 0); if (WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, this->wString, len + 1, (LPSTR)bByte.data(), bufferSize, NULL, &bUsedDefault) == 0) { cString = ""; return; // failed } cString = bByte.data(); } CString cString; WCHAR* wString; BOOL bUsedDefault; size_t len; }; /********************** Map stuff structs ***********************/ /* AITRIGGERTYPE{}; Data for ai trigger types */ struct AITRIGGERTYPE { CString ID; // ai trigger id CString name; // param 1 CString teamtype1; // param 2 CString owner; // param 3 CString techlevel; // flag 1/ param 4 CString type; // param 5 CString unittype; // param 6 CString data; // param 7 CString float1; // param 8 CString float2; // param 9 CString float3; // param 10 CString skirmish; // param 11 CString flag4; // param 12 CString multihouse; // param 13 CString basedefense; // param 14 CString teamtype2; // param 15 CString easy; // param 16 CString medium; // param 17 CString hard; // param 18 }; /* STDOBJECTDATA Data for Trees, Units, Infantry, Aircraft & Structures This should be used for painting procedure... except if you want to draw the upgrades on buildings */ struct STDOBJECTDATA { CString house; // 1 CString type; // 2 CString strength; // 3 CString y; // 4 CString x; // 5 }; /* STRUCTURE Data for a structure */ struct STRUCTURE { CString house; // 1 CString type; // 2 CString strength; // 3 CString y; // 4 CString x; // 5 CString direction; // 6 CString tag; // 7 CString flag1; // 8 CString flag2; // 9 CString energy; // 10 CString upgradecount; // 11 CString spotlight; // 12 CString upgrade1; // 13 CString upgrade2; // 14 CString upgrade3; // 15 CString flag3; // 16 CString flag4; // 17 unsigned deleted : 1; }; // structure data especially for painting struct STRUCTUREPAINT { COLORREF col; CString type; short x; short y; short direction; BYTE strength; BYTE upradecount; CString upgrade1; CString upgrade2; CString upgrade3; }; /* struct INFANTRY{}; Data for an infantry unit */ struct INFANTRY { CString house; // 1 CString type; // 2 CString strength; // 3 CString y; // 4 CString x; // 5 CString pos; // 6 CString action; // 7 CString direction; // 8 CString tag; // 9 CString flag1; // 10 CString flag2; // 11 CString flag3; // 12 CString flag4; // 13 CString flag5; // 14 unsigned deleted : 1; }; struct UNIT { CString house; // 1 CString type; // 2 CString strength; // 3 CString y; // 4 CString x; // 5 CString direction; // 6 CString action; // 7 CString tag; // 8 CString flag1; // 9 CString flag2; // 10 CString flag3; // 11 CString flag4; // 12 CString flag5; // 13 CString flag6; // 14 unsigned deleted : 1; }; struct AIRCRAFT { CString house; // 1 CString type; // 2 CString strength; // 3 CString y; // 4 CString x; // 5 CString direction; // 6 CString action; // 7 CString tag; // 8 CString flag1; // 9 CString flag2; // 10 CString flag3; // 11 CString flag4; // 12 unsigned deleted : 1; }; struct TERRAIN { CString type; int x; int y; unsigned deleted : 1; }; // MW 08/07/01: Smudge #ifdef SMUDGE_SUPP struct SMUDGE { CString type; int x; int y; unsigned deleted : 1; }; #endif /* NODE Data for a node */ struct NODE { CString house; CString type; CString x; CString y; }; struct RA2STRFILEHEAD { DWORD dwFlag1; DWORD dwCount1; DWORD dwCount2; DWORD dwUnused; DWORD dwFlag2; }; #define RA2STRFILEHEADSIZE 20 struct RA2STRINGENTRY { RA2STRINGENTRY() { //memset(this, 0, sizeof(RA2STRINGENTRY)); id = NULL; value = NULL; value_asc = 0; value_asc_size = 0; dwFlag = 0; id_size = 0; value_size = 0; } ~RA2STRINGENTRY() { if (value) delete[] value; if (id) delete[] id; if (value_asc) delete[] value_asc; value = NULL; value_size = 0; id = NULL; id_size = 0; value_asc = 0; value_asc_size = 0; } RA2STRINGENTRY(RA2STRINGENTRY& ref) { value = NULL; value_size = 0; id = NULL; id_size = 0; value_asc = 0; value_asc_size = 0; if (ref.value_size && ref.value) { value_size = ref.value_size; value = new(WCHAR[value_size + 1]); memcpy(value, ref.value, value_size * sizeof(WCHAR)); value[value_size] = 0; } if (ref.id_size && ref.id) { id_size = ref.id_size; id = new(CHAR[id_size + 1]); memcpy(id, ref.id, id_size * sizeof(CHAR)); id[id_size] = 0; } if (ref.value_asc_size && ref.value_asc) { value_asc_size = ref.value_asc_size; value_asc = new(CHAR[value_asc_size + 1]); memcpy(value_asc, ref.value_asc, value_asc_size * sizeof(CHAR)); value_asc[value_asc_size] = 0; } dwFlag = ref.dwFlag; } RA2STRINGENTRY& operator=(RA2STRINGENTRY& ref) { if (value) delete[] value; if (id) delete[] id; value = NULL; value_size = 0; id = NULL; value_asc = 0; value_asc_size = 0; if (ref.value_size) { value_size = ref.value_size; value = new(WCHAR[value_size + 1]); memcpy(value, ref.value, value_size * sizeof(WCHAR)); value[value_size] = 0; } if (ref.id_size) { id_size = ref.id_size; id = new(CHAR[id_size + 1]); memcpy(id, ref.id, id_size * sizeof(CHAR)); id[id_size] = 0; } if (ref.value_asc_size) { value_asc_size = ref.value_asc_size; value_asc = new(CHAR[value_asc_size + 1]); memcpy(value_asc, ref.value_asc, value_asc_size * sizeof(CHAR)); value_asc[value_asc_size] = 0; } dwFlag = ref.dwFlag; return *this; } DWORD dwFlag; CHAR* id; DWORD id_size; DWORD value_size; WCHAR* value; CHAR* value_asc; DWORD value_asc_size; }; #endif