Partially fixed level switching; Added rendering of animating 10; Horizon drawn only if camera room is outside;

This commit is contained in:
MontyTRC89 2018-09-04 13:24:50 +02:00
parent fc927db655
commit 21f39827e7
8 changed files with 110 additions and 102 deletions

View file

@ -27,6 +27,8 @@
#include <process.h> #include <process.h>
#include <stdio.h> #include <stdio.h>
extern GameScript* g_Script;
GAME_STATUS __cdecl ControlPhase(__int32 numFrames, __int32 demoMode) GAME_STATUS __cdecl ControlPhase(__int32 numFrames, __int32 demoMode)
{ {
RegeneratePickups(); RegeneratePickups();
@ -213,12 +215,13 @@ unsigned __stdcall GameMain(void*)
InitGameMalloc(); InitGameMalloc();
TIME_Init(); TIME_Init();
//ResetSoundThings();
//SOUND_Init();
LoadNewStrings(); LoadNewStrings();
DoNewGameflow();
g_Script->DoGameflow();
GameClose(); GameClose();
//ResetSoundThings();
PostMessageA((HWND)WindowsHandle, 0x10u, 0, 0); PostMessageA((HWND)WindowsHandle, 0x10u, 0, 0);
_endthreadex(1); _endthreadex(1);

View file

@ -238,81 +238,4 @@ __int32 __cdecl DoPassportLoadGameMenu()
} }
return 0; return 0;
}
bool __cdecl DoNewGameflow()
{
// We start with the title level
CurrentLevel = 0;
g_Script->SelectedLevelForNewGame = 0;
// We loop indefinitely, looking for return values of DoTitle or DoLevel
bool loadFromSavegame = false;
while (true)
{
// First we need to fill some legacy variables in PCTomb5.exe
GameScriptLevel* level = g_Script->GetLevel(CurrentLevel);
CurrentAtmosphere = level->Soundtrack;
if (level->Horizon)
{
SkyColor1.r = level->Layer1.R;
SkyColor1.g = level->Layer1.G;
SkyColor1.b = level->Layer1.B;
SkyVelocity1 = level->Layer1.CloudSpeed;
SkyColor2.r = level->Layer2.R;
SkyColor2.g = level->Layer2.G;
SkyColor2.b = level->Layer2.B;
SkyVelocity2 = level->Layer2.CloudSpeed;
}
if (level->Storm)
{
SkyStormColor[0] = level->Layer1.R;
SkyStormColor[1] = level->Layer1.G;
SkyStormColor[2] = level->Layer1.B;
}
GAME_STATUS status;
if (CurrentLevel == 0)
{
status = DoTitle(0);
}
else
{
status = DoLevel(CurrentLevel, CurrentAtmosphere, loadFromSavegame);
loadFromSavegame = false;
}
switch (status)
{
case GAME_STATUS::GAME_STATUS_EXIT_GAME:
return true;
case GAME_STATUS::GAME_STATUS_EXIT_TO_TITLE:
CurrentLevel = 0;
break;
case GAME_STATUS::GAME_STATUS_NEW_GAME:
CurrentLevel = (g_Script->SelectedLevelForNewGame != 0 ? g_Script->SelectedLevelForNewGame : 1);
g_Script->SelectedLevelForNewGame = 0;
gfInitialiseGame = true;
break;
case GAME_STATUS::GAME_STATUS_LOAD_GAME:
CurrentLevel = Savegame.LevelNumber;
loadFromSavegame = true;
break;
case GAME_STATUS::GAME_STATUS_LEVEL_COMPLETED:
if (CurrentLevel == g_Script->GetNumLevels())
{
// TODO: final credits
}
else
CurrentLevel++;
break;
}
}
return true;
} }

View file

@ -20,7 +20,7 @@ typedef struct SavegameInfo {
extern SavegameInfo g_SavegameInfos[MAX_SAVEGAMES]; extern SavegameInfo g_SavegameInfos[MAX_SAVEGAMES];
extern vector<string> g_NewStrings; extern vector<string> g_NewStrings;
#define DoGameflow ((__int32 (__cdecl*)(void)) 0x004A8570) //#define DoGameflow ((__int32 (__cdecl*)(void)) 0x004A8570)
#define LoadGameflow ((__int32 (__cdecl*)(void)) 0x00434800) #define LoadGameflow ((__int32 (__cdecl*)(void)) 0x00434800)
__int32 __cdecl DoPauseMenu(); __int32 __cdecl DoPauseMenu();
@ -30,6 +30,4 @@ __int32 __cdecl DoLoadGameMenu();
__int32 __cdecl DoSaveGameMenu(); __int32 __cdecl DoSaveGameMenu();
__int32 __cdecl LoadSavegameInfos(); __int32 __cdecl LoadSavegameInfos();
__int32 __cdecl LoadNewStrings(); __int32 __cdecl LoadNewStrings();
__int32 __cdecl DoPassportLoadGameMenu(); __int32 __cdecl DoPassportLoadGameMenu();
bool __cdecl DoNewGameflow();

View file

@ -2111,7 +2111,7 @@ void Renderer::updateItemsAnimations()
ITEM_INFO* item = itemToDraw->Item; ITEM_INFO* item = itemToDraw->Item;
// Lara has her own routine // Lara has her own routine
if (item->objectNumber == ID_LARA || item->objectNumber == 434) if (item->objectNumber == ID_LARA)
continue; continue;
OBJECT_INFO* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
@ -3059,7 +3059,7 @@ bool Renderer::drawScene(bool dump)
D3DXMATRIX world; D3DXMATRIX world;
// Draw opaque geometry // Draw opaque geometry
if (level->Horizon) if (level->Horizon && m_rooms[Camera.pos.roomNumber]->Room->flags & 8)
drawHorizonAndSky(); drawHorizonAndSky();
for (__int32 i = 0; i < m_roomsToDraw.size(); i++) for (__int32 i = 0; i < m_roomsToDraw.size(); i++)
@ -3769,7 +3769,7 @@ bool Renderer::drawItem(RendererItemToDraw* itemToDraw, RENDERER_BUCKETS bucketI
UINT cPasses = 1; UINT cPasses = 1;
ITEM_INFO* item = itemToDraw->Item; ITEM_INFO* item = itemToDraw->Item;
if (item->objectNumber == ID_LARA || item->objectNumber == 434) if (item->objectNumber == ID_LARA)
return true; return true;
OBJECT_INFO* obj = &Objects[item->objectNumber]; OBJECT_INFO* obj = &Objects[item->objectNumber];
@ -5341,8 +5341,13 @@ void Renderer::updateAnimation(RendererObject* obj, __int16** frmptr, __int16 fr
void Renderer::FreeRendererData() void Renderer::FreeRendererData()
{ {
DX_RELEASE(m_textureAtlas); DX_RELEASE(m_textureAtlas);
m_textureAtlas = NULL;
DX_RELEASE(m_fontAndMiscTexture); DX_RELEASE(m_fontAndMiscTexture);
m_fontAndMiscTexture = NULL;
DX_RELEASE(m_skyTexture); DX_RELEASE(m_skyTexture);
m_skyTexture = NULL;
for (map<__int32, RendererRoom*>::iterator it = m_rooms.begin(); it != m_rooms.end(); ++it) for (map<__int32, RendererRoom*>::iterator it = m_rooms.begin(); it != m_rooms.end(); ++it)
delete (it->second); delete (it->second);

View file

@ -167,4 +167,81 @@ void GameScript::AddLevel(GameScriptLevel* level)
m_levels.push_back(level); m_levels.push_back(level);
} }
bool GameScript::DoGameflow()
{
// We start with the title level
CurrentLevel = 0;
SelectedLevelForNewGame = 0;
// We loop indefinitely, looking for return values of DoTitle or DoLevel
bool loadFromSavegame = false;
while (true)
{
// First we need to fill some legacy variables in PCTomb5.exe
GameScriptLevel* level = m_levels[CurrentLevel];
CurrentAtmosphere = level->Soundtrack;
if (level->Horizon)
{
SkyColor1.r = level->Layer1.R;
SkyColor1.g = level->Layer1.G;
SkyColor1.b = level->Layer1.B;
SkyVelocity1 = level->Layer1.CloudSpeed;
SkyColor2.r = level->Layer2.R;
SkyColor2.g = level->Layer2.G;
SkyColor2.b = level->Layer2.B;
SkyVelocity2 = level->Layer2.CloudSpeed;
}
if (level->Storm)
{
SkyStormColor[0] = level->Layer1.R;
SkyStormColor[1] = level->Layer1.G;
SkyStormColor[2] = level->Layer1.B;
}
GAME_STATUS status;
if (CurrentLevel == 0)
{
status = DoTitle(0);
}
else
{
status = DoLevel(CurrentLevel, CurrentAtmosphere, loadFromSavegame);
loadFromSavegame = false;
}
switch (status)
{
case GAME_STATUS::GAME_STATUS_EXIT_GAME:
return true;
case GAME_STATUS::GAME_STATUS_EXIT_TO_TITLE:
CurrentLevel = 0;
break;
case GAME_STATUS::GAME_STATUS_NEW_GAME:
CurrentLevel = (SelectedLevelForNewGame != 0 ? SelectedLevelForNewGame : 1);
SelectedLevelForNewGame = 0;
gfInitialiseGame = true;
break;
case GAME_STATUS::GAME_STATUS_LOAD_GAME:
CurrentLevel = Savegame.LevelNumber;
loadFromSavegame = true;
break;
case GAME_STATUS::GAME_STATUS_LEVEL_COMPLETED:
if (CurrentLevel == m_levels.size())
{
// TODO: final credits
}
else
CurrentLevel++;
break;
}
}
return true;
}
GameScript* g_Script; GameScript* g_Script;

View file

@ -149,7 +149,7 @@ private:
GameScriptSettings m_settings; GameScriptSettings m_settings;
vector<string> m_strings; vector<string> m_strings;
vector<GameScriptLevel*> m_levels; vector<GameScriptLevel*> m_levels;
__int32 m_numLevels;
string loadScriptFromFile(char* luaFilename); string loadScriptFromFile(char* luaFilename);
public: public:
@ -179,4 +179,5 @@ public:
void SetFog(byte r, byte g, byte b, __int16 startDistance, __int16 endDistance); void SetFog(byte r, byte g, byte b, __int16 startDistance, __int16 endDistance);
__int32 GetNumLevels(); __int32 GetNumLevels();
void AddLevel(GameScriptLevel* level); void AddLevel(GameScriptLevel* level);
bool DoGameflow();
}; };

View file

@ -4,6 +4,7 @@
#include "..\Specific\setup.h" #include "..\Specific\setup.h"
#include "..\Game\draw.h" #include "..\Game\draw.h"
#include "..\Game\lot.h" #include "..\Game\lot.h"
#include "..\Scripting\GameScript.h"
#include <process.h> #include <process.h>
#include <stdio.h> #include <stdio.h>
@ -28,9 +29,10 @@ using namespace std;
vector<__int32> MoveablesIds; vector<__int32> MoveablesIds;
vector<__int32> StaticObjectsIds; vector<__int32> StaticObjectsIds;
map<__int16*, RendererMesh*> MeshPointersToMesh; map<__int16*, RendererMesh*> MeshPointersToMesh;
extern GameScript* g_Script;
__int16 ReadInt16() __int16 ReadInt16()
{ {
__int16 value = *(__int16*)LevelDataPtr; __int16 value = *(__int16*)LevelDataPtr;
@ -499,15 +501,17 @@ __int32 __cdecl S_LoadLevelFile(__int32 levelIndex)
DB_Log(2, "S_LoadLevelFile - DLL"); DB_Log(2, "S_LoadLevelFile - DLL");
printf("S_LoadLevelFile\n"); printf("S_LoadLevelFile\n");
SOUND_Stop();
Sound_FreeSamples();
g_Renderer->FreeRendererData(); g_Renderer->FreeRendererData();
RenderLoadBar = false; RenderLoadBar = false;
char filename[80]; char filename[80];
strcpy_s(filename, &gfFilenameWad[gfFilenameOffset[levelIndex]]); strcpy_s(filename, g_Script->GetLevel(levelIndex)->FileName.c_str());
strcat_s(filename, ".TRC"); //strcat_s(filename, ".TRC");
printf("%s\n", filename); //printf("%s\n", filename);
IsLevelLoading = true; IsLevelLoading = true;
hLoadLevel = _beginthreadex(0, 0, LoadLevel, filename, 0, &ThreadId); hLoadLevel = _beginthreadex(0, 0, LoadLevel, filename, 0, &ThreadId);

View file

@ -47,7 +47,8 @@ __int32 __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lp
_CrtSetReportMode(0, 2); _CrtSetReportMode(0, 2);
_CrtSetDbgFlag(-1); _CrtSetDbgFlag(-1);
// TODO: deprecated
LoadGameflow(); LoadGameflow();
LoadSettings(); LoadSettings();
@ -120,7 +121,7 @@ __int32 __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lp
SetWindowPos(App.WindowHandle, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetWindowPos(App.WindowHandle, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
WindowsHandle = App.WindowHandle; // GetDesktopWindow(); WindowsHandle = App.WindowHandle;
App.bNoFocus = false; App.bNoFocus = false;
App.isInScene = false; App.isInScene = false;
@ -142,9 +143,6 @@ __int32 __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lp
while (DoTheGame); while (DoTheGame);
//DXClose();
//delete g_Renderer;
WinClose(); WinClose();
return 0; return 0;
@ -153,15 +151,14 @@ __int32 __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lp
__int32 __cdecl WinClose() __int32 __cdecl WinClose()
{ {
DB_Log(2, "WinClose - DLL"); DB_Log(2, "WinClose - DLL");
// sub_401BEA(); Save register keys - future
//CloseHandle(dxctx.cr.hObject);
//sub_401AFF(&dxctx);
DestroyAcceleratorTable(hAccTable); DestroyAcceleratorTable(hAccTable);
// Sound_DeInit(); //Sound_DeInit();
delete g_Renderer; delete g_Renderer;
delete g_Inventory; delete g_Inventory;
delete g_Script;
return 0; return 0;
} }