mirror of
https://github.com/XProger/OpenLara.git
synced 2025-02-24 23:42:49 +01:00
#138 Sega Saturn levels loader (WIP)
This commit is contained in:
parent
c8657cc55d
commit
ce3c0ac654
@ -117,10 +117,11 @@ struct Animation {
|
||||
// framePrev = frameIndex;
|
||||
frameIndex = int(time * 30.0f);
|
||||
|
||||
int rate = max((int)anim->frameRate, 1);
|
||||
// get count of real frames
|
||||
int fCount = (anim->frameEnd - anim->frameStart) / anim->frameRate + 1;
|
||||
int fCount = (anim->frameEnd - anim->frameStart) / rate + 1;
|
||||
// real frame index & lerp delta
|
||||
int fIndex = int(time * 30.0f) / anim->frameRate;
|
||||
int fIndex = int(time * 30.0f) / rate;
|
||||
int k = fIndex * anim->frameRate;
|
||||
delta = (time * 30.0f - k) / max(1, min((int)anim->frameRate, framesCount - k)); // min is because in some cases framesCount > realFramesCount / frameRate * frameRate
|
||||
|
||||
@ -135,7 +136,7 @@ struct Animation {
|
||||
frameNext = anim->nextFrame;
|
||||
anim = &level->anims[anim->nextAnimation];
|
||||
frameNext -= anim->frameStart;
|
||||
fIndexB = frameNext / anim->frameRate;
|
||||
fIndexB = frameNext / max((int)anim->frameRate, 1);
|
||||
}
|
||||
|
||||
getCommand(anim, frameNext, NULL, NULL, &rot);
|
||||
|
@ -393,7 +393,7 @@ struct Controller {
|
||||
switch (cmd.func) {
|
||||
|
||||
case TR::FloorData::PORTAL :
|
||||
info.roomNext = (*fd++).data;
|
||||
info.roomNext = (*fd++).value;
|
||||
break;
|
||||
|
||||
case TR::FloorData::FLOOR : // floor & ceiling
|
||||
|
@ -696,11 +696,13 @@ namespace Debug {
|
||||
c = c->next;
|
||||
}
|
||||
|
||||
vec3 viewPos = ((Lara*)controller)->camera->frustum->pos;
|
||||
|
||||
char buf[255];
|
||||
sprintf(buf, "DIP = %d, TRI = %d, SND = %d, active = %d", Core::stats.dips, Core::stats.tris, Sound::channelsCount, activeCount);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
|
||||
vec3 angle = controller->angle * RAD2DEG;
|
||||
sprintf(buf, "pos = (%d, %d, %d), angle = (%d, %d), room = %d (camera: %d)", int(controller->pos.x), int(controller->pos.y), int(controller->pos.z), (int)angle.x, (int)angle.y, controller->getRoomIndex(), game->getCamera()->getRoomIndex());
|
||||
sprintf(buf, "pos = (%d, %d, %d), angle = (%d, %d), room = %d (camera: %d [%d, %d, %d])", int(controller->pos.x), int(controller->pos.y), int(controller->pos.z), (int)angle.x, (int)angle.y, controller->getRoomIndex(), game->getCamera()->getRoomIndex(), int(viewPos.x), int(viewPos.y), int(viewPos.z));
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
|
||||
int rate = anim.anims[anim.index].frameRate;
|
||||
sprintf(buf, "state = %d, anim = %d, next = %d, rate = %d, frame = %.2f / %d (%f)", anim.state, anim.index, anim.next, rate, anim.time * 30.0f, anim.framesCount, anim.delta);
|
||||
|
837
src/format.h
837
src/format.h
File diff suppressed because it is too large
Load Diff
@ -18,7 +18,7 @@ namespace TR {
|
||||
|
||||
VER_PC = 256,
|
||||
VER_PSX = 512,
|
||||
VER_SEGA = 1024,
|
||||
VER_SAT = 1024,
|
||||
|
||||
VER_TR1 = 1,
|
||||
VER_TR2 = 2,
|
||||
@ -27,11 +27,11 @@ namespace TR {
|
||||
VER_TR5 = 16,
|
||||
|
||||
VER_VERSION = VER_TR1 | VER_TR2 | VER_TR3 | VER_TR4 | VER_TR5,
|
||||
VER_PLATFORM = VER_PC | VER_PSX | VER_SEGA,
|
||||
VER_PLATFORM = VER_PC | VER_PSX | VER_SAT,
|
||||
|
||||
VER_TR1_PC = VER_TR1 | VER_PC,
|
||||
VER_TR1_PSX = VER_TR1 | VER_PSX,
|
||||
VER_TR1_SEGA = VER_TR1 | VER_SEGA,
|
||||
VER_TR1_SAT = VER_TR1 | VER_SAT,
|
||||
|
||||
VER_TR2_PC = VER_TR2 | VER_PC,
|
||||
VER_TR2_PSX = VER_TR2 | VER_PSX,
|
||||
@ -291,18 +291,21 @@ namespace TR {
|
||||
case 585648 : // PSX JAP
|
||||
case 508614 : version = VER_TR1_PSX;
|
||||
//case 320412 : // PC JAP
|
||||
case 5148 : // SAT
|
||||
case 334874 :
|
||||
case 316138 :
|
||||
case 316460 : return LVL_TR1_TITLE;
|
||||
// GYM
|
||||
case 1234800 : // PSX JAP
|
||||
case 1074234 : version = VER_TR1_PSX;
|
||||
case 343854 : // SAT
|
||||
case 3377974 : // PC JAP
|
||||
case 3236806 :
|
||||
case 3237128 : return LVL_TR1_GYM;
|
||||
// LEVEL1
|
||||
case 1667568 : // PSX JAP
|
||||
case 1448896 : version = VER_TR1_PSX;
|
||||
case 497656 :
|
||||
case 2540906 : // PC JAP
|
||||
case 2533312 :
|
||||
case 2533634 : return LVL_TR1_1;
|
||||
@ -735,7 +738,7 @@ namespace TR {
|
||||
if (Stream::existsContent("PSXDATA/GYM.PSX"))
|
||||
return VER_TR1_PSX;
|
||||
if (Stream::existsContent("DATA/GYM.SAT"))
|
||||
return VER_TR1_SEGA;
|
||||
return VER_TR1_SAT;
|
||||
|
||||
if (Stream::existsContent("data/ASSAULT.TR2") || Stream::existsContent("assault.TR2"))
|
||||
return VER_TR2_PC;
|
||||
@ -765,14 +768,14 @@ namespace TR {
|
||||
void getGameLevelFile(char *dst, Version version, LevelID id) {
|
||||
if (useEasyStart) {
|
||||
switch (version) {
|
||||
case VER_TR1_PC :
|
||||
case VER_TR1_PC :
|
||||
sprintf(dst, "DATA/%s.PHD", LEVEL_INFO[id].name);
|
||||
if (Stream::existsContent(dst)) break;
|
||||
sprintf(dst, "%s.PHD", LEVEL_INFO[id].name);
|
||||
break;
|
||||
case VER_TR1_PSX : sprintf(dst, "PSXDATA/%s.PSX", LEVEL_INFO[id].name); break;
|
||||
case VER_TR1_SEGA : sprintf(dst, "DATA/%s.SAT", LEVEL_INFO[id].name); break;
|
||||
case VER_TR2_PC : { // oh FFFFUUUUUUCKing CaTaComB.Tr2!
|
||||
case VER_TR1_PSX : sprintf(dst, "PSXDATA/%s.PSX", LEVEL_INFO[id].name); break;
|
||||
case VER_TR1_SAT : sprintf(dst, "DATA/%s.SAT", LEVEL_INFO[id].name); break;
|
||||
case VER_TR2_PC : { // oh FFFFUUUUUUCKing CaTaComB.Tr2!
|
||||
if (id == LVL_TR2_VENICE || id == LVL_TR2_CUT_2 || id == LVL_TR2_PLATFORM || id == LVL_TR2_CUT_3 || id == LVL_TR2_UNWATER ||
|
||||
id == LVL_TR2_KEEL || id == LVL_TR2_LIVING || id == LVL_TR2_DECK || id == LVL_TR2_CATACOMB || id == LVL_TR2_ICECAVE ||
|
||||
id == LVL_TR2_CUT_4 || id == LVL_TR2_XIAN || id == LVL_TR2_HOUSE) {
|
||||
@ -904,6 +907,7 @@ namespace TR {
|
||||
char title[32];
|
||||
if (useEasyStart) {
|
||||
switch (version) {
|
||||
case VER_TR1_SAT :
|
||||
case VER_TR1_PC :
|
||||
case VER_TR1_PSX :
|
||||
sprintf(title, "track_%02d", track);
|
||||
|
@ -1145,7 +1145,7 @@ struct Level : IGame {
|
||||
src = owner->tileData->color;
|
||||
uv = t.texCoordAtlas;
|
||||
uvCount = 4;
|
||||
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut);
|
||||
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut, t.type);
|
||||
} else {
|
||||
id -= level->objectTexturesCount;
|
||||
|
||||
@ -1155,7 +1155,7 @@ struct Level : IGame {
|
||||
src = owner->tileData->color;
|
||||
uv = t.texCoordAtlas;
|
||||
uvCount = 2;
|
||||
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut);
|
||||
level->fillObjectTexture(owner->tileData, tile.uv, tile.tile, tile.clut, TR::TextureType::TEX_TYPE_SPRITE);
|
||||
} else { // common (generated) textures
|
||||
id -= level->spriteTexturesCount;
|
||||
|
||||
@ -1280,8 +1280,6 @@ struct Level : IGame {
|
||||
}
|
||||
*/
|
||||
void initTextures() {
|
||||
ASSERT(level.tilesCount);
|
||||
|
||||
#ifndef SPLIT_BY_TILE
|
||||
|
||||
#ifdef _OS_PSP
|
||||
@ -1338,6 +1336,8 @@ struct Level : IGame {
|
||||
PROFILE_LABEL(TEXTURE, atlas->ID, "atlas");
|
||||
|
||||
#else
|
||||
ASSERT(level.tilesCount);
|
||||
|
||||
#ifdef _OS_PSP
|
||||
atlas = new Texture(level.tiles4, level.tilesCount, level.cluts, level.clutsCount);
|
||||
#else
|
||||
|
@ -908,7 +908,9 @@ struct MeshBuilder {
|
||||
dyn.faces = NULL;
|
||||
|
||||
for (int j = 0; j < d.fCount; j++) {
|
||||
TR::Face &f = d.faces[j];
|
||||
TR::Face &f = d.faces[j];
|
||||
ASSERT(!f.colored);
|
||||
ASSERT(f.flags.texture < level.objectTexturesCount);
|
||||
TR::ObjectTexture &t = level.objectTextures[f.flags.texture];
|
||||
|
||||
if (f.water) continue;
|
||||
@ -962,6 +964,7 @@ struct MeshBuilder {
|
||||
|
||||
for (int j = 0; j < mesh.fCount; j++) {
|
||||
TR::Face &f = mesh.faces[j];
|
||||
ASSERT(f.colored || f.flags.texture < level.objectTexturesCount);
|
||||
TR::ObjectTexture &t = f.colored ? whiteTile : level.objectTextures[f.flags.texture];
|
||||
|
||||
if (t.attribute != 0)
|
||||
|
@ -13,14 +13,17 @@
|
||||
#endif
|
||||
|
||||
#define ASSERT(expr) if (expr) {} else { LOG("ASSERT:\n %s:%d\n %s => %s\n", __FILE__, __LINE__, __FUNCTION__, #expr); debugBreak(); }
|
||||
#define ASSERTV(expr) ASSERT(expr)
|
||||
|
||||
#ifndef _OS_ANDROID
|
||||
#define LOG(...) printf(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#else
|
||||
#define ASSERT(expr)
|
||||
//#define ASSERT(expr) if (expr) {} else { LOG("ASSERT:\n %s:%d\n %s => %s\n", __FILE__, __LINE__, __FUNCTION__, #expr); }
|
||||
#define ASSERT(expr)
|
||||
#define ASSERTV(expr) (expr) ? 0 : 1
|
||||
|
||||
#ifdef _OS_LINUX
|
||||
#define LOG(...) printf(__VA_ARGS__); fflush(stdout)
|
||||
#else
|
||||
|
Loading…
x
Reference in New Issue
Block a user