mirror of
https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor.git
synced 2025-04-30 17:11:40 -04:00
made some progress, but SHP image position is not always correct .
This commit is contained in:
parent
5639805b58
commit
c8f7c99c80
12 changed files with 162 additions and 252 deletions
2
3rdParty/xcc/misc/cc_file.cpp
vendored
2
3rdParty/xcc/misc/cc_file.cpp
vendored
|
@ -257,7 +257,7 @@ int Ccc_file::read()
|
|||
return 0;
|
||||
}
|
||||
|
||||
int Ccc_file::read(void* data, int size)
|
||||
int Ccc_file::read(void* data, int64_t size)
|
||||
{
|
||||
if (get_p() < 0 || get_p() + size > get_size())
|
||||
return 1;
|
||||
|
|
8
3rdParty/xcc/misc/cc_file.h
vendored
8
3rdParty/xcc/misc/cc_file.h
vendored
|
@ -114,7 +114,7 @@ public:
|
|||
void load(const Ccc_file& f);
|
||||
t_file_type get_file_type(bool fast = true);
|
||||
int read();
|
||||
int read(void* data, int size);
|
||||
int read(void* data, int64_t size);
|
||||
int extract(const string& name);
|
||||
virtual void close();
|
||||
Ccc_file(bool read_on_open);
|
||||
|
@ -154,7 +154,7 @@ public:
|
|||
return m_data;
|
||||
}
|
||||
|
||||
int get_p() const
|
||||
int64_t get_p() const
|
||||
{
|
||||
return m_p;
|
||||
}
|
||||
|
@ -174,7 +174,7 @@ public:
|
|||
m_p = p;
|
||||
}
|
||||
|
||||
void skip(int p)
|
||||
void skip(int64_t p)
|
||||
{
|
||||
m_p += p;
|
||||
}
|
||||
|
@ -189,7 +189,7 @@ private:
|
|||
Cvirtual_binary m_data;
|
||||
Cfile32 m_f;
|
||||
bool m_is_open = false;
|
||||
int m_p;
|
||||
int64_t m_p;
|
||||
const bool m_read_on_open;
|
||||
size_t m_size;
|
||||
};
|
||||
|
|
4
3rdParty/xcc/misc/cc_structures.h
vendored
4
3rdParty/xcc/misc/cc_structures.h
vendored
|
@ -194,7 +194,7 @@ struct t_mix_index_entry
|
|||
{
|
||||
t_mix_index_entry() = default;
|
||||
|
||||
t_mix_index_entry(unsigned int id_, int offset_, int size_)
|
||||
t_mix_index_entry(unsigned int id_, int offset_, unsigned __int32 size_)
|
||||
{
|
||||
id = id_;
|
||||
offset = offset_;
|
||||
|
@ -203,7 +203,7 @@ struct t_mix_index_entry
|
|||
|
||||
unsigned __int32 id;
|
||||
__int32 offset;
|
||||
__int32 size;
|
||||
unsigned __int32 size;
|
||||
};
|
||||
|
||||
struct t_mix_rg_header
|
||||
|
|
2
3rdParty/xcc/misc/mix_file.cpp
vendored
2
3rdParty/xcc/misc/mix_file.cpp
vendored
|
@ -318,7 +318,7 @@ string Cmix_file::get_name(int id)
|
|||
#endif
|
||||
}
|
||||
|
||||
int Cmix_file::get_id(t_game game, string name)
|
||||
unsigned int Cmix_file::get_id(t_game game, string name)
|
||||
{
|
||||
boost::to_upper(name);
|
||||
std::replace(name.begin(), name.end(), '/', '\\');
|
||||
|
|
14
3rdParty/xcc/misc/mix_file.h
vendored
14
3rdParty/xcc/misc/mix_file.h
vendored
|
@ -26,7 +26,7 @@ class Cmix_file : public Ccc_file
|
|||
public:
|
||||
int post_open();
|
||||
string get_name(int id);
|
||||
static int get_id(t_game game, string name);
|
||||
static unsigned int get_id(t_game game, string name);
|
||||
int get_index(unsigned int id) const;
|
||||
using Ccc_file::get_size;
|
||||
using Ccc_file::vdata;
|
||||
|
@ -80,10 +80,14 @@ public:
|
|||
return m_index[get_index(id)].offset;
|
||||
}
|
||||
|
||||
int get_size(unsigned int id) const
|
||||
size_t get_size(unsigned int id) const
|
||||
{
|
||||
assert(get_index(id) != -1);
|
||||
return m_index[get_index(id)].size;
|
||||
auto const idx = get_index(id);
|
||||
//assert(idx != -1);
|
||||
if (idx >= 0) {
|
||||
return m_index[idx].size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool has_checksum() const
|
||||
|
@ -101,7 +105,7 @@ public:
|
|||
return &m_index[0];
|
||||
}
|
||||
private:
|
||||
using t_id_index = map<int, int>;
|
||||
using t_id_index = map<unsigned int, int>;
|
||||
|
||||
static bool m_ft_support;
|
||||
|
||||
|
|
2
3rdParty/xcc/misc/tmp_file.h
vendored
2
3rdParty/xcc/misc/tmp_file.h
vendored
|
@ -27,7 +27,7 @@ public:
|
|||
bool is_valid() const
|
||||
{
|
||||
const t_tmp_header& h = header();
|
||||
int size = get_size();
|
||||
auto const size = get_size();
|
||||
return !(sizeof(t_tmp_header) > size ||
|
||||
h.cx != 24 ||
|
||||
h.cy != 24 ||
|
||||
|
|
|
@ -5506,6 +5506,7 @@ void CIsoView::DrawMap()
|
|||
SetError("Loading graphics");
|
||||
theApp.m_loading->LoadUnitGraphic(buildingId);
|
||||
::Map->UpdateBuildingInfo(&buildingId);
|
||||
|
||||
pic = buildinginfo[id].pic[0];
|
||||
}
|
||||
if (pic.pic == NULL) {
|
||||
|
|
|
@ -1233,12 +1233,12 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
CString filename; // filename of the image
|
||||
char theat = cur_theat; // standard theater char is t (Temperat). a is snow.
|
||||
|
||||
BOOL bAlwaysSetChar = FALSE; // second char is always theater, even if NewTheater not specified!
|
||||
bool bAlwaysSetChar = FALSE; // second char is always theater, even if NewTheater not specified!
|
||||
WORD wStep = 1; // step is 1 for infantry, buildings, etc, and for shp vehicles it specifies the step rate between every direction
|
||||
WORD wStartWalkFrame = 0; // for examply cyborg reaper has another walk starting frame
|
||||
int iTurretOffset = 0; // used for centering y pos of turret (if existing) (for vehicles)
|
||||
const BOOL bStructure = rules["BuildingTypes"].HasValue(lpUnittype); // is this a structure?
|
||||
const BOOL bVehicle = rules["VehicleTypes"].HasValue(lpUnittype); // is this a structure?
|
||||
const bool bStructure = rules["BuildingTypes"].HasValue(lpUnittype); // is this a structure?
|
||||
const bool bVehicle = rules["VehicleTypes"].HasValue(lpUnittype); // is this a structure?
|
||||
|
||||
auto const bPowerUp = !rules.GetString(lpUnittype, "PowersUpBuilding").IsEmpty();
|
||||
|
||||
|
@ -1314,7 +1314,6 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
SHPHEADER specialanim3_h;
|
||||
BYTE* specialanim4 = NULL;
|
||||
SHPHEADER specialanim4_h;
|
||||
BYTE** lpT = NULL;
|
||||
SHPHEADER* lpT_h = NULL;
|
||||
std::vector<BYTE> turretColors[8];
|
||||
std::vector<BYTE> turretLighting[8];
|
||||
|
@ -1360,8 +1359,8 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
|
||||
FSunPackLib::VoxelNormalClass vnc = FSunPackLib::VoxelNormalClass::Unknown;
|
||||
|
||||
if (rules.GetBool(image, "Turret")) {
|
||||
turretanim_name = rules.GetString(image, "TurretAnim");
|
||||
if (rules.GetBool(lpUnittype, "Turret")) {
|
||||
turretanim_name = rules.GetString(lpUnittype, "TurretAnim");
|
||||
auto vxl_turretanim_filename = turretanim_name.IsEmpty() ? image + "tur.vxl" : turretanim_name + ".vxl";
|
||||
auto vxl_barrelanim_filename = image + "barl.vxl";
|
||||
auto const& imageID = art.GetString(turretanim_name, "Image");
|
||||
|
@ -1369,40 +1368,40 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
vxl_turretanim_filename = imageID + ".vxl";
|
||||
}
|
||||
|
||||
if (bStructure && turretanim_name.GetLength() > 0 && !rules.GetBool(image, "TurretAnimIsVoxel")) {
|
||||
if (bStructure && turretanim_name.GetLength() > 0 && !rules.GetBool(lpUnittype, "TurretAnimIsVoxel")) {
|
||||
turretanim_filename = turretanim_name + ".shp";
|
||||
auto const& imageID = art.GetString(turretanim_name, "Image");
|
||||
if (!imageID.IsEmpty()) {
|
||||
turretanim_filename = imageID + ".shp";
|
||||
}
|
||||
|
||||
if (artSection.GetBool("NewTheater")) {
|
||||
turretanim_filename.SetAt(1, 'G');
|
||||
if (artSection.GetBool("NewTheater", true)) {
|
||||
auto tmp = turretanim_filename;
|
||||
tmp.SetAt(1, theat);
|
||||
if (FSunPackLib::XCC_DoesFileExist(tmp, hShpMix))
|
||||
if (FSunPackLib::XCC_DoesFileExist(tmp, hShpMix)) {
|
||||
turretanim_filename = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
turretanim_filename.MakeUpper();
|
||||
FSunPackLib::SetCurrentSHP(turretanim_filename, hShpMix);
|
||||
FSunPackLib::XCC_GetSHPHeader(&head);
|
||||
|
||||
int iStartTurret = 0;
|
||||
const WORD wAnimCount = 4; // anims between each "normal" direction, seems to be hardcoded
|
||||
auto const turretFrameStart = art.GetInteger(turretanim_name, "LoopStart");
|
||||
auto const turretFrameCount = art.GetInteger(turretanim_name, "LoopEnd", 32);
|
||||
const WORD wAnimCount = turretFrameCount / 8; // anims between each "normal" direction
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (iStartTurret + i * wAnimCount < head.c_images) {
|
||||
FSunPackLib::XCC_GetSHPImageHeader(iStartTurret + i * wAnimCount, &turretinfo[i]);
|
||||
for (auto i = 0; i < 8; i++) {
|
||||
if (turretFrameStart + i * wAnimCount < head.c_images) {
|
||||
FSunPackLib::XCC_GetSHPImageHeader(turretFrameStart + i * wAnimCount, &turretinfo[i]);
|
||||
FSunPackLib::XCC_GetSHPHeader(&turrets_h[i]);
|
||||
FSunPackLib::LoadSHPImage(iStartTurret + i * wAnimCount, turretColors[i]);
|
||||
FSunPackLib::LoadSHPImage(turretFrameStart + i * wAnimCount, turretColors[i]);
|
||||
turretLighting[i].clear();
|
||||
}
|
||||
|
||||
}
|
||||
} else if (
|
||||
(bStructure && turretanim_name.GetLength() > 0 && rules.GetBool(image, "TurretAnimIsVoxel"))
|
||||
(bStructure && !turretanim_name.IsEmpty() && rules.GetBool(lpUnittype, "TurretAnimIsVoxel"))
|
||||
|| (!bStructure && (FindFileInMix(vxl_turretanim_filename) || FindFileInMix(vxl_barrelanim_filename)))
|
||||
) {
|
||||
turretanim_filename = vxl_turretanim_filename;
|
||||
|
@ -1545,17 +1544,16 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
if (bSuccess) {
|
||||
|
||||
FSunPackLib::XCC_GetSHPHeader(&head);
|
||||
int i;
|
||||
int maxPics = head.c_images;
|
||||
if (maxPics > 8) {
|
||||
maxPics = 8; // we only need 8 pictures for every direction!
|
||||
}
|
||||
if (bStructure && !bPowerUp && !rules.GetBool(image, "Turret")) {
|
||||
if (bStructure && !bPowerUp) {
|
||||
maxPics = 1;
|
||||
}
|
||||
if (bVoxelTurret) {
|
||||
if (rules.GetBool(lpUnittype, "Turret")) {
|
||||
maxPics = 8;
|
||||
}
|
||||
if (maxPics > 8) {
|
||||
maxPics = 8; // we only need 8 pictures for every direction!
|
||||
}
|
||||
|
||||
if (!bStructure && rules.GetBool(image, "Turret")) {
|
||||
int iStartTurret = wStartWalkFrame + 8 * wStep;
|
||||
|
@ -1572,32 +1570,23 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
|
||||
|
||||
// create an array of pointers to directdraw surfaces
|
||||
lpT = new(BYTE * [maxPics]);
|
||||
auto lpT = new(BYTE * [maxPics]);
|
||||
::memset(lpT, 0, sizeof(BYTE) * maxPics);
|
||||
std::vector<std::vector<BYTE>> lighting(maxPics);
|
||||
std::vector<SHPIMAGEHEADER> shp_image_headers(maxPics);
|
||||
|
||||
if (bVoxelTurret && bStructure) {
|
||||
for (i = 0; i < maxPics; i++) {
|
||||
FSunPackLib::LoadSHPImage(0, 1, &lpT[i]);
|
||||
FSunPackLib::XCC_GetSHPImageHeader(0, &shp_image_headers[i]);
|
||||
}
|
||||
} else if (wStep == 1 && (rules.GetString(lpUnittype, "PowersUpBuilding").IsEmpty() || !rules.GetBool(lpUnittype, "Turret"))) {
|
||||
// standard case...
|
||||
FSunPackLib::LoadSHPImage(wStartWalkFrame, maxPics, lpT);
|
||||
for (int i = 0; i < maxPics; ++i) {
|
||||
FSunPackLib::XCC_GetSHPImageHeader(wStartWalkFrame + i, &shp_image_headers[i]);
|
||||
}
|
||||
if (lpUnittype == "CAWBNKR1") {
|
||||
printf("");
|
||||
}
|
||||
|
||||
} else if (!rules.GetString(lpUnittype, "PowersUpBuilding").IsEmpty() && rules.GetBool(lpUnittype, "Turret")) {
|
||||
// a "real" turret (vulcan cannon, etc...)
|
||||
for (i = 0; i < maxPics; i++) {
|
||||
FSunPackLib::LoadSHPImage(i * 4, 1, &lpT[i]);
|
||||
FSunPackLib::XCC_GetSHPImageHeader(i * 4, &shp_image_headers[i]);
|
||||
if (bStructure) {
|
||||
for (auto i = 0; i < maxPics; i++) {
|
||||
FSunPackLib::XCC_GetSHPImageHeader(0, &shp_image_headers[i]);
|
||||
FSunPackLib::LoadSHPImage(0, 1, &lpT[i]);
|
||||
}
|
||||
} else {
|
||||
} else {// vehicle, infantry
|
||||
// walk frames used
|
||||
for (i = 0; i < maxPics; i++) {
|
||||
for (auto i = 0; i < maxPics; i++) {
|
||||
const int dir = bVehicle ? ((i + 1) % 8) : i;
|
||||
const int pic_in_file = dir * wStep + wStartWalkFrame;
|
||||
FSunPackLib::LoadSHPImage(pic_in_file, 1, &lpT[i]);
|
||||
|
@ -1605,20 +1594,12 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < maxPics; i++) {
|
||||
int pic_in_file = i;
|
||||
if (bStructure && bVoxelTurret) pic_in_file = 0;
|
||||
SHPIMAGEHEADER imghead = shp_image_headers[i];
|
||||
//FSunPackLib::XCC_GetSHPImageHeader(pic_in_file, &imghead);
|
||||
|
||||
// this block handles one-direction only building frame
|
||||
if (bStructure) {
|
||||
SHPIMAGEHEADER imghead = shp_image_headers[0];
|
||||
auto blitDst = lpT[0];
|
||||
if (bib != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, bib, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, bib, bib_h.cx, bib_h.cy);
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, bib, bib_h.cx, bib_h.cy);
|
||||
|
||||
imghead.cx = head.cx - imghead.x; // update size of main graphic
|
||||
imghead.cy = head.cy - imghead.y;
|
||||
|
@ -1626,144 +1607,73 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
}
|
||||
|
||||
if (activeanim != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, activeanim, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, activeanim, activeanim_h.cx, activeanim_h.cy);
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, activeanim, activeanim_h.cx, activeanim_h.cy);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (idleanim != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, idleanim, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, idleanim, idleanim_h.cx, idleanim_h.cy);
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, idleanim, idleanim_h.cx, idleanim_h.cy);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (activeanim2 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, activeanim2, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, activeanim2, activeanim2_h.cx, activeanim2_h.cy);
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, activeanim2, activeanim2_h.cx, activeanim2_h.cy);
|
||||
|
||||
}
|
||||
|
||||
if (activeanim3 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, activeanim3, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, activeanim3, activeanim3_h.cx, activeanim3_h.cy);
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, activeanim3, activeanim3_h.cx, activeanim3_h.cy);
|
||||
|
||||
}
|
||||
|
||||
if (superanim1 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, superanim1, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, superanim_1_zadjust, head.cx, head.cy, superanim1, superanim1_h.cx, superanim1_h.cy);
|
||||
|
||||
|
||||
Blit_Pal(blitDst, 0, superanim_1_zadjust, head.cx, head.cy, superanim1, superanim1_h.cx, superanim1_h.cy);
|
||||
}
|
||||
|
||||
if (superanim2 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, superanim2, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, superanim_2_zadjust, head.cx, head.cy, superanim2, superanim2_h.cx, superanim2_h.cy);
|
||||
|
||||
|
||||
Blit_Pal(blitDst, 0, superanim_2_zadjust, head.cx, head.cy, superanim2, superanim2_h.cx, superanim2_h.cy);
|
||||
}
|
||||
|
||||
if (superanim3 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, superanim3, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, superanim_3_zadjust, head.cx, head.cy, superanim3, superanim3_h.cx, superanim3_h.cy);
|
||||
|
||||
|
||||
Blit_Pal(blitDst, 0, superanim_3_zadjust, head.cx, head.cy, superanim3, superanim3_h.cx, superanim3_h.cy);
|
||||
}
|
||||
|
||||
if (superanim4 != NULL && strcmp(lpUnittype, "YAGNTC") != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, superanim4, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, superanim_4_zadjust, head.cx, head.cy, superanim4, superanim4_h.cx, superanim4_h.cy);
|
||||
Blit_Pal(blitDst, 0, superanim_4_zadjust, head.cx, head.cy, superanim4, superanim4_h.cx, superanim4_h.cy);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (specialanim1 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, specialanim1, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, specialanim1, specialanim1_h.cx, specialanim1_h.cy);
|
||||
|
||||
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, specialanim1, specialanim1_h.cx, specialanim1_h.cy);
|
||||
}
|
||||
|
||||
if (specialanim2 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, specialanim2, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, specialanim2, specialanim2_h.cx, specialanim2_h.cy);
|
||||
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, specialanim2, specialanim2_h.cx, specialanim2_h.cy);
|
||||
}
|
||||
|
||||
if (specialanim3 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, specialanim3, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, specialanim3, specialanim3_h.cx, specialanim3_h.cy);
|
||||
|
||||
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, specialanim3, specialanim3_h.cx, specialanim3_h.cy);
|
||||
}
|
||||
|
||||
if (specialanim4 != NULL) {
|
||||
DDBLTFX fx;
|
||||
|
||||
::memset(&fx, 0, sizeof(DDBLTFX));
|
||||
fx.dwSize = sizeof(DDBLTFX);
|
||||
|
||||
//lpT[i]->Blt(NULL, specialanim4, NULL, DDBLT_KEYSRC | DDBLT_WAIT , &fx);
|
||||
Blit_Pal(lpT[i], 0, 0, head.cx, head.cy, specialanim4, specialanim4_h.cx, specialanim4_h.cy);
|
||||
Blit_Pal(blitDst, 0, 0, head.cx, head.cy, specialanim4, specialanim4_h.cx, specialanim4_h.cy);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (auto i = 0; i < maxPics; i++) {
|
||||
SHPIMAGEHEADER* imghead = &shp_image_headers[i];
|
||||
if (bStructure) {
|
||||
imghead = &shp_image_headers[0];
|
||||
if (!lpT[i]) {
|
||||
auto const dataLen = imghead->cx * imghead->cy;
|
||||
auto data = new(BYTE[dataLen]);
|
||||
memcpy(data, lpT[0], dataLen);
|
||||
lpT[i] = data;
|
||||
}
|
||||
}
|
||||
//FSunPackLib::XCC_GetSHPImageHeader(pic_in_file, &imghead);
|
||||
|
||||
|
||||
|
||||
if (!vxlBarrelLighting[i].empty() || !turretLighting[i].empty())
|
||||
lighting[i].resize(head.cx * head.cy, 46); // value needs to lead to 1.0 lighting
|
||||
|
@ -1823,24 +1733,26 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
ddsd.dwWidth = turrets_h[i].cx;
|
||||
ddsd.dwHeight = turrets_h[i].cy;
|
||||
|
||||
int XMover, YMover;
|
||||
char c[50];
|
||||
itoa(i, c, 10);
|
||||
#ifdef RA2_MODE
|
||||
XMover = g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "X");
|
||||
YMover = g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "Y");
|
||||
XMover += g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "X" + c);
|
||||
YMover += g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "Y" + c);
|
||||
#else
|
||||
XMover = g_data.GetInteger("BuildingVoxelTurrets", lpUnittype + "X");
|
||||
YMover = g_data.GetInteger("BuildingVoxelTurrets", lpUnittype + "Y");
|
||||
#endif
|
||||
int XMover = 0;
|
||||
int YMover = 0;
|
||||
|
||||
RECT srcRect, destRect;
|
||||
|
||||
if (bVoxelTurret) {
|
||||
int mx = head.cx / 2 + rules.GetInteger(image, "TurretAnimX") - turretinfo[i].x;
|
||||
int my = head.cy / 2 + rules.GetInteger(image, "TurretAnimY") - turretinfo[i].y;
|
||||
int mx = head.cx / 2 + rules.GetInteger(lpUnittype, "TurretAnimX") - turretinfo[i].x;
|
||||
int my = head.cy / 2 + rules.GetInteger(lpUnittype, "TurretAnimY") - turretinfo[i].y;
|
||||
|
||||
char c[50];
|
||||
itoa(i, c, 10);
|
||||
#ifdef RA2_MODE
|
||||
XMover = g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "X");
|
||||
YMover = g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "Y");
|
||||
XMover += g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "X" + c);
|
||||
YMover += g_data.GetInteger("BuildingVoxelTurretsRA2", lpUnittype + "Y" + c);
|
||||
#else
|
||||
XMover = g_data.GetInteger("BuildingVoxelTurrets", lpUnittype + "X");
|
||||
YMover = g_data.GetInteger("BuildingVoxelTurrets", lpUnittype + "Y");
|
||||
#endif
|
||||
|
||||
srcRect.top = 0;
|
||||
srcRect.left = 0;
|
||||
|
@ -1851,13 +1763,9 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
destRect.right = destRect.left + ddsd.dwWidth;;
|
||||
destRect.bottom = destRect.top + ddsd.dwHeight;
|
||||
|
||||
} else // !bVoxelTurret
|
||||
{
|
||||
|
||||
int mx = rules.GetInteger(image, "TurretAnimX");
|
||||
int my = rules.GetInteger(image, "TurretAnimY");//+rules.GetInteger(image, "barrelAnimZAdjust");
|
||||
|
||||
|
||||
} else {// !bVoxelTurret
|
||||
int mx = rules.GetInteger(lpUnittype, "TurretAnimX");
|
||||
int my = rules.GetInteger(lpUnittype, "TurretAnimY");//+rules.GetInteger(image, "barrelAnimZAdjust");
|
||||
|
||||
srcRect.top = 0;
|
||||
srcRect.left = 0;
|
||||
|
@ -1921,7 +1829,7 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
|
||||
}
|
||||
|
||||
if (!bPowerUp && i != 0 && (imghead.unknown == 0 && !g_data.GetBool("Debug", "IgnoreSHPImageHeadUnused")) && bStructure) {
|
||||
if (!bPowerUp && i != 0 && (imghead->unknown == 0 && !g_data.GetBool("Debug", "IgnoreSHPImageHeadUnused")) && bStructure) {
|
||||
if (lpT[i]) delete[] lpT[i];
|
||||
lpT[i] = NULL;
|
||||
} else {
|
||||
|
@ -1948,10 +1856,10 @@ BOOL CLoading::LoadUnitGraphic(const CString& lpUnittype)
|
|||
if (hPalette == m_hPalUnitTemp || hPalette == m_hPalUnitUrb || hPalette == m_hPalUnitSnow || hPalette == m_hPalUnitDes || hPalette == m_hPalUnitLun || hPalette == m_hPalUnitUbn) p.pal = iPalUnit;
|
||||
if (hPalette == m_hPalLib) p.pal = iPalLib;
|
||||
|
||||
p.x = imghead.x;
|
||||
p.y = imghead.y;
|
||||
p.wHeight = imghead.cy;
|
||||
p.wWidth = imghead.cx;
|
||||
p.x = imghead->x;
|
||||
p.y = imghead->y;
|
||||
p.wHeight = imghead->cy;
|
||||
p.wWidth = imghead->cx;
|
||||
p.wMaxWidth = head.cx;
|
||||
p.wMaxHeight = head.cy;
|
||||
p.bType = PICDATA_TYPE_SHP;
|
||||
|
@ -3643,7 +3551,7 @@ void CLoading::LoadOverlayGraphic(const CString& lpOvrlName_, int iOvrlNum)
|
|||
|
||||
FSunPackLib::SetTSPaletteEntry(hPalette, 0x10 + i, &rgbNew, &rgbOld[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
FSunPackLib::LoadSHPImage(0, maxPics, lpT);
|
||||
|
@ -3703,10 +3611,10 @@ void CLoading::LoadOverlayGraphic(const CString& lpOvrlName_, int iOvrlNum)
|
|||
|
||||
|
||||
delete[] lpT;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < 0xFF; i++) {
|
||||
char ic[50];
|
||||
|
@ -4435,21 +4343,21 @@ void CLoading::FreeAll()
|
|||
#endif
|
||||
|
||||
i->second.pic = NULL;
|
||||
} catch (...) {
|
||||
CString err;
|
||||
err = "Access violation while trying to release surface ";
|
||||
char c[6];
|
||||
itoa(e, c, 10);
|
||||
err += c;
|
||||
} catch (...) {
|
||||
CString err;
|
||||
err = "Access violation while trying to release surface ";
|
||||
char c[6];
|
||||
itoa(e, c, 10);
|
||||
err += c;
|
||||
|
||||
err += "\n";
|
||||
OutputDebugString(err);
|
||||
continue;
|
||||
err += "\n";
|
||||
OutputDebugString(err);
|
||||
continue;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
try {
|
||||
|
@ -4469,7 +4377,7 @@ void CLoading::FreeAll()
|
|||
} catch (...) {
|
||||
errstream << "Exception while freeing DirectDraw" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CLoading::PostNcDestroy()
|
||||
{
|
||||
|
@ -4738,7 +4646,7 @@ void CLoading::LoadStrings()
|
|||
//CCStrings[*rules.GetSectionName(i)].SetString=rul
|
||||
CCStrings[*rules.GetSectionName(i)].SetString((LPSTR)(LPCSTR)rules.GetSection(i)->values["Name"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -3493,6 +3493,10 @@ void CMapData::UpdateBuildingInfo(const CString* lpUnitType)
|
|||
buildinginfo[n].bUrban = TRUE;
|
||||
}
|
||||
|
||||
if (type == "NALASR") {
|
||||
printf("");
|
||||
}
|
||||
|
||||
buildinginfo[n].pic_count = 8;
|
||||
for (auto k = 0; k < 8; k++) {
|
||||
lpPicFile = GetUnitPictureFilename(type, k);
|
||||
|
|
|
@ -52,28 +52,20 @@ inline CString GetUnitPictureFilename(LPCTSTR lpUnitName, DWORD dwPicIndex)
|
|||
{
|
||||
CIniFile& ini = Map->GetIniFile();
|
||||
|
||||
CString UnitName = lpUnitName;
|
||||
auto artname = rules.GetStringOr(lpUnitName, "Image", lpUnitName);
|
||||
artname = ini.GetStringOr(lpUnitName, "Image", artname);
|
||||
|
||||
UnitName = ini.GetString(lpUnitName, "Image");
|
||||
if (UnitName.IsEmpty()) {
|
||||
UnitName = rules.GetString(lpUnitName, "Image");
|
||||
}
|
||||
|
||||
CString artname = UnitName;
|
||||
if (UnitName.IsEmpty()) {
|
||||
artname = lpUnitName;
|
||||
}
|
||||
auto const shapeName = art.GetString(UnitName, "Image");
|
||||
auto const& shapeName = art.GetString(artname, "Image");
|
||||
|
||||
if (!shapeName.IsEmpty()) {
|
||||
if (!g_data.GetBool("IgnoreArtImage", UnitName)) {
|
||||
if (!g_data.GetBool("IgnoreArtImage", artname)) {
|
||||
artname = shapeName;
|
||||
}
|
||||
}
|
||||
|
||||
CString filename = UnitName;
|
||||
CString filename = artname;
|
||||
|
||||
if (art.GetBool(UnitName, "NewTheater") && !art.GetBool(UnitName, "DemandLoad")) {
|
||||
if (art.GetBool(artname, "NewTheater") && !art.GetBool(artname, "DemandLoad")) {
|
||||
filename.SetAt(1, 'T');
|
||||
}
|
||||
|
||||
|
@ -81,7 +73,7 @@ inline CString GetUnitPictureFilename(LPCTSTR lpUnitName, DWORD dwPicIndex)
|
|||
_itoa_s(dwPicIndex, n, 10);
|
||||
|
||||
|
||||
if (pics.find(artname + n) != pics.end()) {
|
||||
if (pics.find((artname + n)) != pics.end()) {
|
||||
filename = artname; // yes, found
|
||||
filename += n;
|
||||
} else if (pics.find(artname + ".bmp") != pics.end()) // since June, 15th (Matze): Only use BMP if no SHP/VXL exists
|
||||
|
|
|
@ -558,26 +558,30 @@ namespace FSunPackLib
|
|||
return TRUE;
|
||||
};
|
||||
|
||||
BOOL SetCurrentSHP(LPCSTR szSHP, HMIXFILE hOwner)
|
||||
bool SetCurrentSHP(LPCSTR szSHP, HMIXFILE hOwner)
|
||||
{
|
||||
if (cur_shp.is_open()) cur_shp.close();
|
||||
if (cur_shp.is_open()) {
|
||||
cur_shp.close();
|
||||
}
|
||||
|
||||
if (hOwner == NULL) {
|
||||
if (open_read(cur_shp, szSHP) != 0) {
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
int id = mixfiles[hOwner - 1].get_id(mixfiles[hOwner - 1].get_game(), szSHP);
|
||||
int size = mixfiles[hOwner - 1].get_size(id);
|
||||
if (size == 0)
|
||||
auto const id = mixfiles[hOwner - 1].get_id(mixfiles[hOwner - 1].get_game(), szSHP);
|
||||
auto const size = mixfiles[hOwner - 1].get_size(id);
|
||||
if (size == 0) {
|
||||
OutputDebugString("NULL size");
|
||||
return false;
|
||||
}
|
||||
BYTE* b = new(BYTE[size]);
|
||||
mixfiles[hOwner - 1].seek(mixfiles[hOwner - 1].get_offset(id));
|
||||
mixfiles[hOwner - 1].read(b, size);
|
||||
cur_shp.load(Cvirtual_binary(b, size));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
};
|
||||
|
||||
BOOL XCC_GetTMPTileInfo(int iTile, POINT* lpPos, int* lpWidth, int* lpHeight, BYTE* lpDirection, BYTE* lpTileHeight, BYTE* lpTileType, RGBTRIPLE* lpRgbLeft, RGBTRIPLE* lpRgbRight)
|
||||
|
@ -876,7 +880,7 @@ namespace FSunPackLib
|
|||
|
||||
}
|
||||
|
||||
BOOL LoadSHPImage(int iImageIndex, int iCount, BYTE** lpPics)
|
||||
BOOL LoadSHPImage(int startIndex, int wantedNum, BYTE** lpPics)
|
||||
{
|
||||
t_shp_ts_image_header imghead;
|
||||
BYTE* image = NULL;
|
||||
|
@ -889,26 +893,22 @@ namespace FSunPackLib
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int pic;
|
||||
std::vector<byte> decode_image_buffer;
|
||||
for (pic = 0; pic < iCount; pic++) {
|
||||
if (cur_shp.get_image_header(iImageIndex + pic)) {
|
||||
imghead = *(cur_shp.get_image_header(iImageIndex + pic));
|
||||
for (auto frameIdx = 0; frameIdx < wantedNum; frameIdx++) {
|
||||
if (cur_shp.get_image_header(startIndex + frameIdx)) {
|
||||
imghead = *(cur_shp.get_image_header(startIndex + frameIdx));
|
||||
// if(imghead.offset!=0)
|
||||
{
|
||||
|
||||
if (cur_shp.is_compressed(iImageIndex + pic)) {
|
||||
if (cur_shp.is_compressed(startIndex + frameIdx)) {
|
||||
decode_image_buffer.resize(imghead.cx * imghead.cy);
|
||||
image = decode_image_buffer.data();
|
||||
decode3(cur_shp.get_image(iImageIndex + pic), image, imghead.cx, imghead.cy);
|
||||
decode3(cur_shp.get_image(startIndex + frameIdx), image, imghead.cx, imghead.cy);
|
||||
} else
|
||||
image = (unsigned char*)cur_shp.get_image(iImageIndex + pic);
|
||||
image = (unsigned char*)cur_shp.get_image(startIndex + frameIdx);
|
||||
|
||||
|
||||
lpPics[pic] = new(BYTE[head.cx * head.cy]);
|
||||
lpPics[frameIdx] = new(BYTE[head.cx * head.cy]);
|
||||
|
||||
int i, e;
|
||||
for (i = 0; i < head.cx; i++) {
|
||||
|
@ -920,9 +920,9 @@ namespace FSunPackLib
|
|||
dwRead = (i - imghead.x) + (e - imghead.y) * imghead.cx;
|
||||
|
||||
if (dwRead != 0xFFFFFFFF) {
|
||||
lpPics[pic][dwWrite] = image[dwRead];
|
||||
lpPics[frameIdx][dwWrite] = image[dwRead];
|
||||
} else
|
||||
lpPics[pic][dwWrite] = 0;
|
||||
lpPics[frameIdx][dwWrite] = 0;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ namespace FSunPackLib
|
|||
BOOL SetCurrentTMP(LPCSTR szTMP, HMIXFILE hOwner);
|
||||
|
||||
|
||||
BOOL SetCurrentSHP(LPCSTR szSHP, HMIXFILE hOwner);
|
||||
bool SetCurrentSHP(LPCSTR szSHP, HMIXFILE hOwner);
|
||||
|
||||
|
||||
BOOL XCC_GetTMPTileInfo(int iTile, POINT* lpPos, int* lpWidth, int* lpHeight, BYTE* lpDirection, BYTE* lpTileHeight, BYTE* lpTileType, RGBTRIPLE* lpRgbLeft, RGBTRIPLE* lpRgbRight);
|
||||
|
@ -195,7 +195,8 @@ namespace FSunPackLib
|
|||
BOOL LoadTMPImage(int iStart, int iCount, BYTE** lpTileArray);
|
||||
|
||||
BOOL LoadSHPImageInSurface(IDirectDraw4* pdd, HTSPALETTE hPalette, int iImageIndex, int iCount, LPDIRECTDRAWSURFACE4* pdds);
|
||||
BOOL LoadSHPImage(int iImageIndex, int iCount, BYTE** lpPics);
|
||||
// load 'wantedNum' frames at 'startIndex'
|
||||
BOOL LoadSHPImage(int startIndex, int wantedNum, BYTE** lpPics);
|
||||
BOOL LoadSHPImage(int iImageIndex, std::vector<BYTE>& pic);
|
||||
|
||||
HTSPALETTE LoadTSPalette(LPCSTR szPalette, HMIXFILE hPaletteOwner);
|
||||
|
|
Loading…
Add table
Reference in a new issue