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

View file

@ -239,80 +239,3 @@ __int32 __cdecl DoPassportLoadGameMenu()
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 vector<string> g_NewStrings;
#define DoGameflow ((__int32 (__cdecl*)(void)) 0x004A8570)
//#define DoGameflow ((__int32 (__cdecl*)(void)) 0x004A8570)
#define LoadGameflow ((__int32 (__cdecl*)(void)) 0x00434800)
__int32 __cdecl DoPauseMenu();
@ -31,5 +31,3 @@ __int32 __cdecl DoSaveGameMenu();
__int32 __cdecl LoadSavegameInfos();
__int32 __cdecl LoadNewStrings();
__int32 __cdecl DoPassportLoadGameMenu();
bool __cdecl DoNewGameflow();

View file

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

View file

@ -167,4 +167,81 @@ void GameScript::AddLevel(GameScriptLevel* 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;

View file

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

View file

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

View file

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