1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-29 15:06:42 +00:00

Merge remote-tracking branch 'mrcheko/savedgame' into savedgame

This commit is contained in:
Marc Zinnschlag 2013-12-17 19:33:32 +01:00
commit 09fadd446b
11 changed files with 71 additions and 27 deletions

View file

@ -93,18 +93,18 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
if (mUseSound) if (mUseSound)
MWBase::Environment::get().getSoundManager()->update(frametime); MWBase::Environment::get().getSoundManager()->update(frametime);
// global scripts
if (MWBase::Environment::get().getStateManager()->getState()== if (MWBase::Environment::get().getStateManager()->getState()==
MWBase::StateManager::State_Running) MWBase::StateManager::State_Running)
{ {
// global scripts
MWBase::Environment::get().getScriptManager()->getGlobalScripts().run(); MWBase::Environment::get().getScriptManager()->getGlobalScripts().run();
bool changed = MWBase::Environment::get().getWorld()->hasCellChanged(); bool changed = MWBase::Environment::get().getWorld()->hasCellChanged();
// local scripts // local scripts
executeLocalScripts(); // This does not handle the case where a global script causes a executeLocalScripts(); // This does not handle the case where a global script causes a
// cell change, followed by a cell change in a local script during // cell change, followed by a cell change in a local script during
// the same frame. // the same frame.
if (changed) // keep change flag for another frame, if cell changed happened in local script if (changed) // keep change flag for another frame, if cell changed happened in local script
MWBase::Environment::get().getWorld()->markCellAsUnchanged(); MWBase::Environment::get().getWorld()->markCellAsUnchanged();
@ -113,17 +113,26 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
MWBase::Environment::get().getWorld()->advanceTime( MWBase::Environment::get().getWorld()->advanceTime(
frametime*MWBase::Environment::get().getWorld()->getTimeScaleFactor()/3600); frametime*MWBase::Environment::get().getWorld()->getTimeScaleFactor()/3600);
// update actors
MWBase::Environment::get().getMechanicsManager()->update(frametime,
MWBase::Environment::get().getWindowManager()->isGuiMode());
// update world
MWBase::Environment::get().getWorld()->update(frametime, MWBase::Environment::get().getWindowManager()->isGuiMode());
// update game state // update game state
MWBase::Environment::get().getStateManager()->update (frametime); MWBase::Environment::get().getStateManager()->update (frametime);
} }
// update actors
MWBase::Environment::get().getMechanicsManager()->update(frametime,
MWBase::Environment::get().getWindowManager()->isGuiMode());
if (MWBase::Environment::get().getStateManager()->getState()==
MWBase::StateManager::State_Running)
{
MWWorld::Ptr player = mEnvironment.getWorld()->getPlayer().getPlayer();
if(MWWorld::Class::get(player).getCreatureStats(player).isDead())
MWBase::Environment::get().getStateManager()->endGame();
}
// update world
MWBase::Environment::get().getWorld()->update(frametime, MWBase::Environment::get().getWindowManager()->isGuiMode());
// update GUI // update GUI
Ogre::RenderWindow* window = mOgre->getWindow(); Ogre::RenderWindow* window = mOgre->getWindow();
unsigned int tri, batch; unsigned int tri, batch;

View file

@ -112,6 +112,8 @@ namespace MWBase
virtual MWWorld::CellStore *getInterior (const std::string& name) = 0; virtual MWWorld::CellStore *getInterior (const std::string& name) = 0;
virtual void useDeathCamera() = 0;
virtual void setWaterHeight(const float height) = 0; virtual void setWaterHeight(const float height) = 0;
virtual void toggleWater() = 0; virtual void toggleWater() = 0;

View file

@ -181,7 +181,9 @@ namespace MWInput
switch (action) switch (action)
{ {
case A_GameMenu: case A_GameMenu:
toggleMainMenu (); if(!(MWBase::Environment::get().getStateManager()->getState() != MWBase::StateManager::State_Running
&& MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_MainMenu))
toggleMainMenu ();
break; break;
case A_Screenshot: case A_Screenshot:
screenshot(); screenshot();
@ -301,7 +303,9 @@ namespace MWInput
return; return;
// Disable movement in Gui mode // Disable movement in Gui mode
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return; if (MWBase::Environment::get().getWindowManager()->isGuiMode()
|| MWBase::Environment::get().getStateManager()->getState() != MWBase::StateManager::State_Running)
return;
// Configure player movement according to keyboard input. Actual movement will // Configure player movement according to keyboard input. Actual movement will

View file

@ -19,7 +19,6 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwbase/statemanager.hpp"
#include "npcstats.hpp" #include "npcstats.hpp"
#include "creaturestats.hpp" #include "creaturestats.hpp"
@ -571,19 +570,15 @@ namespace MWMechanics
stats.resurrect(); stats.resurrect();
continue; continue;
} }
MWBase::Environment::get().getStateManager()->endGame();
} }
if(iter->second->isDead()) if (iter->second->kill())
continue; {
++mDeathCount[cls.getId(iter->first)];
iter->second->kill(); if(cls.isEssential(iter->first))
MWBase::Environment::get().getWindowManager()->messageBox("#{sKilledEssential}");
++mDeathCount[cls.getId(iter->first)]; }
if(cls.isEssential(iter->first))
MWBase::Environment::get().getWindowManager()->messageBox("#{sKilledEssential}");
} }
} }

View file

@ -1052,10 +1052,19 @@ void CharacterController::forceStateUpdate()
} }
} }
void CharacterController::kill() bool CharacterController::kill()
{ {
if(mDeathState != CharState_None) if( isDead() )
return; {
//player's death animation is over
if( mPtr.getRefData().getHandle()=="player" && !isAnimPlaying(mCurrentDeath)
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_MainMenu )
{
MWWorld::Class::get(mPtr).getCreatureStats(mPtr).setHealth(0);
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
}
return false;
}
if(mPtr.getTypeName() == typeid(ESM::NPC).name()) if(mPtr.getTypeName() == typeid(ESM::NPC).name())
{ {
@ -1100,6 +1109,8 @@ void CharacterController::kill()
mIdleState = CharState_None; mIdleState = CharState_None;
mCurrentIdle.clear(); mCurrentIdle.clear();
return true;
} }
void CharacterController::resurrect() void CharacterController::resurrect()

View file

@ -188,7 +188,7 @@ public:
void skipAnim(); void skipAnim();
bool isAnimPlaying(const std::string &groupName); bool isAnimPlaying(const std::string &groupName);
void kill(); bool kill();
void resurrect(); void resurrect();
bool isDead() const bool isDead() const
{ return mDeathState != CharState_None; } { return mDeathState != CharState_None; }

View file

@ -221,6 +221,11 @@ OEngine::Render::Fader* RenderingManager::getFader()
return mRendering.getFader(); return mRendering.getFader();
} }
MWRender::Camera* RenderingManager::getCamera() const
{
return mCamera;
}
void RenderingManager::removeCell (MWWorld::CellStore *store) void RenderingManager::removeCell (MWWorld::CellStore *store)
{ {
mObjects.removeCell(store); mObjects.removeCell(store);

View file

@ -98,6 +98,8 @@ public:
SkyManager* getSkyManager(); SkyManager* getSkyManager();
Compositors* getCompositors(); Compositors* getCompositors();
MWRender::Camera* getCamera() const;
void toggleLight(); void toggleLight();
bool toggleRenderMode(int mode); bool toggleRenderMode(int mode);

View file

@ -77,6 +77,7 @@ void MWState::StateManager::newGame (bool bypass)
void MWState::StateManager::endGame() void MWState::StateManager::endGame()
{ {
mState = State_Ended; mState = State_Ended;
MWBase::Environment::get().getWorld()->useDeathCamera();
} }
void MWState::StateManager::saveGame (const std::string& description, const Slot *slot) void MWState::StateManager::saveGame (const std::string& description, const Slot *slot)

View file

@ -400,6 +400,17 @@ namespace MWWorld
return mCells.getInterior (name); return mCells.getInterior (name);
} }
void World::useDeathCamera()
{
if(mRendering->getCamera()->isVanityOrPreviewModeEnabled() )
{
mRendering->getCamera()->togglePreviewMode(false);
mRendering->getCamera()->toggleVanityMode(false);
}
if(mRendering->getCamera()->isFirstPerson())
togglePOV();
}
MWWorld::Player& World::getPlayer() MWWorld::Player& World::getPlayer()
{ {
return *mPlayer; return *mPlayer;

View file

@ -42,6 +42,7 @@ namespace MWRender
class SkyManager; class SkyManager;
class CellRender; class CellRender;
class Animation; class Animation;
class Camera;
} }
struct ContentLoader; struct ContentLoader;
@ -185,6 +186,9 @@ namespace MWWorld
virtual CellStore *getInterior (const std::string& name); virtual CellStore *getInterior (const std::string& name);
//switch to POV before showing player's death animation
virtual void useDeathCamera();
virtual void setWaterHeight(const float height); virtual void setWaterHeight(const float height);
virtual void toggleWater(); virtual void toggleWater();