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 <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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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();
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
|
@ -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();
|
||||
};
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
delete g_Renderer;
|
||||
delete g_Inventory;
|
||||
delete g_Script;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue