1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-16 01:54:38 +02:00

#15 add TR2 PSX title images support

This commit is contained in:
XProger
2017-12-14 03:19:26 +03:00
parent eb501ccb65
commit bc40299f99
3 changed files with 33 additions and 20 deletions

View File

@@ -671,26 +671,31 @@ namespace TR {
const char* getGameScreen(Version version, LevelID id) {
if (useEasyStart) {
#define CHECK_FILE(name) if (Stream::existsContent(name)) return name
switch (id) {
case LVL_TR1_TITLE :
if (Stream::existsContent("TITLEH.png")) return "TITLEH.png";
if (Stream::existsContent("DATA/TITLEH.PCX")) return "DATA/TITLEH.PCX";
if (Stream::existsContent("DELDATA/AMERTIT.RAW")) return "DELDATA/AMERTIT.RAW";
CHECK_FILE("TITLEH.png");
CHECK_FILE("DATA/TITLEH.PCX");
CHECK_FILE("DELDATA/AMERTIT.RAW");
break;
case LVL_TR2_TITLE :
if (Stream::existsContent("TITLE.png")) return "TITLE.png";
if (Stream::existsContent("data/TITLE.PCX")) return "data/TITLE.PCX";
if (Stream::existsContent("pix/title.pcx")) return "pix/title.pcx";
CHECK_FILE("TITLE.png");
CHECK_FILE("data/TITLE.PCX");
CHECK_FILE("pix/title.pcx");
CHECK_FILE("PIXUS/TITLEUS.RAW"); // TODO: add other languages
break;
case LVL_TR3_TITLE :
if (Stream::existsContent("pix/TITLEUK.BMP")) return "pix/TITLEUK.BMP";
CHECK_FILE("pix/TITLEUK.BMP"); // TODO: add other languages
break;
default : ;
}
#undef CHECK_FILE
} else {
switch (id) {
case LVL_TR1_TITLE : return "level/1/TITLEH.PCX";

View File

@@ -511,15 +511,18 @@ struct Texture {
}
static Texture* LoadRNC(Stream &stream) { // https://github.com/lab313ru/rnc_propack_source
stream.seek(4); // skip MAGIC
uint32 size = swap32(stream.read(size));
uint32 csize = swap32(stream.read(csize));
stream.seek(4); // skip CRC
uint8 chunks, fkey;
stream.read(fkey);
stream.read(chunks);
uint32 magic, size, csize;
stream.read(magic);
uint16 key = fkey;
if (magic == FOURCC("RNC\002")) {
size = swap32(stream.read(size));
csize = swap32(stream.read(csize));
stream.seek(6);
} else {
stream.seek(-4);
size = 384 * 256 * 2;
csize = stream.size;
}
uint8 *data = new uint8[size];
uint8 *cdata = new uint8[csize];
@@ -528,13 +531,12 @@ struct Texture {
BitStream bs(cdata, csize);
uint8 *dst = data;
uint8 *end = data + size;
uint32 length = 0;
uint16 offset = 0;
bs.readBits(2);
while (dst < end) {
while (bs.data < bs.end || bs.index > 0) {
if (!bs.readBit()) {
*dst++ = bs.readByte();
} else {
@@ -578,7 +580,7 @@ struct Texture {
delete[] cdata;
int width = 384;
int height = 256;
int height = size / width / 2;
int dw = Core::support.texNPOT ? width : nextPow2(width);
int dh = Core::support.texNPOT ? height : nextPow2(height);
@@ -610,13 +612,16 @@ struct Texture {
static Texture* Load(Stream &stream) {
uint32 magic;
stream.read(magic);
stream.seek(-int(sizeof(magic)));
stream.seek(-4);
#ifdef USE_INFLATE
if (magic == 0x474E5089)
return LoadPNG(stream);
#endif
if (magic == FOURCC("RNC\002"))
if (stream.name && strstr(stream.name, ".RAW"))
return LoadRNC(stream);
if ((magic & 0xFFFF) == 0x4D42)
return LoadBMP(stream);
return LoadPCX(stream);

View File

@@ -1055,6 +1055,9 @@ struct Stream {
size = ftell(f);
fseek(f, 0, SEEK_SET);
this->name = new char[strlen(name) + 1];
strcpy(this->name, name);
if (callback)
callback(this, userData);
}