mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-30 16:57:57 +03:00
Partially fixed level switching; Added rendering of animating 10; Horizon drawn only if camera room is outside;
This commit is contained in:
parent
fc927db655
commit
21f39827e7
8 changed files with 110 additions and 102 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
|
@ -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();
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
|
@ -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();
|
||||||
};
|
};
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue