mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-27 03:35:27 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
283a9183d0
@ -494,7 +494,7 @@ if(DPKG_PROGRAM)
|
|||||||
SET(CPACK_DEBIAN_PACKAGE_NAME "openmw")
|
SET(CPACK_DEBIAN_PACKAGE_NAME "openmw")
|
||||||
SET(CPACK_DEBIAN_PACKAGE_VERSION "${VERSION_STRING}")
|
SET(CPACK_DEBIAN_PACKAGE_VERSION "${VERSION_STRING}")
|
||||||
SET(CPACK_PACKAGE_EXECUTABLES "openmw;OpenMW esmtool;Esmtool omwlauncher;OMWLauncher")
|
SET(CPACK_PACKAGE_EXECUTABLES "openmw;OpenMW esmtool;Esmtool omwlauncher;OMWLauncher")
|
||||||
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libogremain-1.7.3 (>= 1.7.3), libbullet0 (>= 2.77), libboost-filesystem1.42.0 (>= 1.42.0), libboost-program-options1.42.0 (>= 1.42.0), libboost-system1.42.0 (>= 1.42.0), libboost-thread1.42.0 (>= 1.42.0), libc6 (>= 2.11.2), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libmpg123-0 (>= 1.12.1), libois-1.2.0 (>= 1.2.0), libopenal1 (>= 1:1.12.854), libsndfile1 (>= 1.0.23), libstdc++6 (>= 4.4.5), libuuid1 (>= 2.17.2), libqtgui4 (>= 4.7.0)")
|
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libogre-1.7.3 (>= 1.7.3), libbullet0 (>= 2.77), libboost-filesystem1.46.1 (>= 1.46.1), libboost-program-options1.46.1 (>= 1.46.1), libboost-system1.46.1 (>= 1.46.1), libboost-thread1.46.1 (>= 1.46.1), libc6 (>= 2.11.2), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libmpg123-0 (>= 1.12.1), libois-1.3.0 (>= 1.3.0), libopenal1 (>= 1:1.12.854), libsndfile1 (>= 1.0.23), libstdc++6 (>= 4.4.5), libuuid1 (>= 2.17.2), libqtgui4 (>= 4.7.0)")
|
||||||
|
|
||||||
SET(CPACK_DEBIAN_PACKAGE_SECTION "Games")
|
SET(CPACK_DEBIAN_PACKAGE_SECTION "Games")
|
||||||
|
|
||||||
|
@ -149,6 +149,7 @@ set(GAMEWORLD
|
|||||||
mwworld/containerutil.cpp
|
mwworld/containerutil.cpp
|
||||||
mwworld/player.cpp
|
mwworld/player.cpp
|
||||||
mwworld/cells.cpp
|
mwworld/cells.cpp
|
||||||
|
mwworld/localscripts.cpp
|
||||||
)
|
)
|
||||||
set(GAMEWORLD_HEADER
|
set(GAMEWORLD_HEADER
|
||||||
mwworld/refdata.hpp
|
mwworld/refdata.hpp
|
||||||
@ -170,6 +171,7 @@ set(GAMEWORLD_HEADER
|
|||||||
mwworld/player.hpp
|
mwworld/player.hpp
|
||||||
mwworld/cellfunctors.hpp
|
mwworld/cellfunctors.hpp
|
||||||
mwworld/cells.hpp
|
mwworld/cells.hpp
|
||||||
|
mwworld/localscripts.hpp
|
||||||
)
|
)
|
||||||
source_group(apps\\openmw\\mwworld FILES ${GAMEWORLD} ${GAMEWORLD_HEADER})
|
source_group(apps\\openmw\\mwworld FILES ${GAMEWORLD} ${GAMEWORLD_HEADER})
|
||||||
|
|
||||||
|
@ -6,22 +6,24 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include <OgreVector3.h>
|
#include <OgreRoot.h>
|
||||||
#include <Ogre.h>
|
|
||||||
|
|
||||||
#include "components/esm/records.hpp"
|
#include <MyGUI_WidgetManager.h>
|
||||||
|
|
||||||
|
#include <openengine/ogre/renderer.hpp>
|
||||||
|
#include <openengine/gui/manager.hpp>
|
||||||
|
|
||||||
|
#include <components/esm/records.hpp>
|
||||||
#include <components/esm_store/cell_store.hpp>
|
#include <components/esm_store/cell_store.hpp>
|
||||||
#include <components/files/fileops.hpp>
|
|
||||||
#include <components/bsa/bsa_archive.hpp>
|
#include <components/bsa/bsa_archive.hpp>
|
||||||
#include <components/esm/loadregn.hpp>
|
|
||||||
#include <components/esm/esm_reader.hpp>
|
#include <components/esm/esm_reader.hpp>
|
||||||
#include <components/files/path.hpp>
|
#include <components/files/path.hpp>
|
||||||
|
#include <components/nifbullet/bullet_nif_loader.hpp>
|
||||||
#include <openengine/gui/manager.hpp>
|
|
||||||
#include "mwgui/window_manager.hpp"
|
|
||||||
|
|
||||||
#include "mwinput/inputmanager.hpp"
|
#include "mwinput/inputmanager.hpp"
|
||||||
|
|
||||||
|
#include "mwgui/window_manager.hpp"
|
||||||
|
|
||||||
#include "mwscript/scriptmanager.hpp"
|
#include "mwscript/scriptmanager.hpp"
|
||||||
#include "mwscript/compilercontext.hpp"
|
#include "mwscript/compilercontext.hpp"
|
||||||
#include "mwscript/interpretercontext.hpp"
|
#include "mwscript/interpretercontext.hpp"
|
||||||
@ -43,116 +45,76 @@
|
|||||||
|
|
||||||
#include "mwmechanics/mechanicsmanager.hpp"
|
#include "mwmechanics/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include <OgreRoot.h>
|
|
||||||
|
|
||||||
#include <MyGUI_WidgetManager.h>
|
|
||||||
#include "mwgui/class.hpp"
|
|
||||||
|
|
||||||
#include "components/nifbullet/bullet_nif_loader.hpp"
|
|
||||||
|
|
||||||
//using namespace ESM;
|
|
||||||
|
|
||||||
void OMW::Engine::executeLocalScripts()
|
void OMW::Engine::executeLocalScripts()
|
||||||
{
|
{
|
||||||
for (MWWorld::World::ScriptList::const_iterator iter (
|
MWWorld::LocalScripts& localScripts = mEnvironment.mWorld->getLocalScripts();
|
||||||
mEnvironment.mWorld->getLocalScripts().begin());
|
|
||||||
iter!=mEnvironment.mWorld->getLocalScripts().end(); ++iter)
|
|
||||||
{
|
|
||||||
if (mIgnoreLocalPtr.isEmpty() || mIgnoreLocalPtr!=iter->second)
|
|
||||||
{
|
|
||||||
MWScript::InterpreterContext interpreterContext (mEnvironment,
|
|
||||||
&iter->second.getRefData().getLocals(), MWWorld::Ptr (iter->second));
|
|
||||||
mScriptManager->run (iter->first, interpreterContext);
|
|
||||||
|
|
||||||
if (mEnvironment.mWorld->hasCellChanged())
|
localScripts.startIteration();
|
||||||
break;
|
|
||||||
}
|
while (!localScripts.isFinished())
|
||||||
|
{
|
||||||
|
std::pair<std::string, MWWorld::Ptr> script = localScripts.getNext();
|
||||||
|
|
||||||
|
MWScript::InterpreterContext interpreterContext (mEnvironment,
|
||||||
|
&script.second.getRefData().getLocals(), script.second);
|
||||||
|
mScriptManager->run (script.first, interpreterContext);
|
||||||
|
|
||||||
|
if (mEnvironment.mWorld->hasCellChanged())
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mIgnoreLocalPtr = MWWorld::Ptr();
|
localScripts.setIgnore (MWWorld::Ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OMW::Engine::updateFocusReport (float duration)
|
||||||
|
{
|
||||||
|
if ((mFocusTDiff += duration)>0.25)
|
||||||
|
{
|
||||||
|
mFocusTDiff = 0;
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
std::string handle = mEnvironment.mWorld->getFacedHandle();
|
||||||
|
|
||||||
|
if (!handle.empty())
|
||||||
|
{
|
||||||
|
MWWorld::Ptr ptr = mEnvironment.mWorld->getPtrViaHandle (handle);
|
||||||
|
|
||||||
|
if (!ptr.isEmpty())
|
||||||
|
name = MWWorld::Class::get (ptr).getName (ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name!=mFocusName)
|
||||||
|
{
|
||||||
|
mFocusName = name;
|
||||||
|
|
||||||
|
if (mFocusName.empty())
|
||||||
|
std::cout << "Unfocus" << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "Focus: " << name << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
|
bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
|
||||||
{
|
{
|
||||||
if(mShowFPS)
|
|
||||||
{
|
|
||||||
mEnvironment.mWindowManager->wmSetFPS(mOgre.getFPS());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mUseSound && !(mEnvironment.mSoundManager->isMusicPlaying()))
|
|
||||||
{
|
|
||||||
// Play some good 'ol tunes
|
|
||||||
mEnvironment.mSoundManager->startRandomTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string effect;
|
|
||||||
|
|
||||||
MWWorld::Ptr::CellStore *current = mEnvironment.mWorld->getPlayer().getPlayer().getCell();
|
|
||||||
|
|
||||||
|
|
||||||
//If the region has changed
|
|
||||||
if(!(current->cell->data.flags & current->cell->Interior) && timer.elapsed() >= 10){
|
|
||||||
timer.restart();
|
|
||||||
if (test.name != current->cell->region)
|
|
||||||
{
|
|
||||||
total = 0;
|
|
||||||
test = (ESM::Region) *(mEnvironment.mWorld->getStore().regions.find(current->cell->region));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(test.soundList.size() > 0)
|
|
||||||
{
|
|
||||||
std::vector<ESM::Region::SoundRef>::iterator soundIter = test.soundList.begin();
|
|
||||||
//mEnvironment.mSoundManager
|
|
||||||
if(total == 0){
|
|
||||||
while (!(soundIter == test.soundList.end()))
|
|
||||||
{
|
|
||||||
ESM::NAME32 go = soundIter->sound;
|
|
||||||
int chance = (int) soundIter->chance;
|
|
||||||
//std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n";
|
|
||||||
soundIter++;
|
|
||||||
total += chance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
srand ( time(NULL) );
|
|
||||||
int r = rand() % total; //old random code
|
|
||||||
int pos = 0;
|
|
||||||
soundIter = test.soundList.begin();
|
|
||||||
while (!(soundIter == test.soundList.end()))
|
|
||||||
{
|
|
||||||
const ESM::NAME32 go = soundIter->sound;
|
|
||||||
int chance = (int) soundIter->chance;
|
|
||||||
//std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n";
|
|
||||||
soundIter++;
|
|
||||||
if( r - pos < chance)
|
|
||||||
{
|
|
||||||
effect = go.name;
|
|
||||||
//play sound
|
|
||||||
std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n";
|
|
||||||
mEnvironment.mSoundManager->playSound(effect, 20.0, 1.0);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
pos += chance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//mEnvironment.mSoundManager->playSound(effect, 1.0, 1.0);
|
|
||||||
//printf("REGION: %s\n", test.name);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(current->cell->data.flags & current->cell->Interior)
|
|
||||||
{
|
|
||||||
test.name = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
mEnvironment.mFrameDuration = evt.timeSinceLastFrame;
|
mEnvironment.mFrameDuration = evt.timeSinceLastFrame;
|
||||||
|
|
||||||
//
|
// sound
|
||||||
|
if (mUseSound)
|
||||||
|
{
|
||||||
|
if (!mEnvironment.mSoundManager->isMusicPlaying())
|
||||||
|
mEnvironment.mSoundManager->startRandomTitle();
|
||||||
|
|
||||||
|
mEnvironment.mSoundManager->update (evt.timeSinceLastFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update GUI
|
||||||
|
if(mShowFPS)
|
||||||
|
mEnvironment.mWindowManager->wmSetFPS(mOgre->getFPS());
|
||||||
|
|
||||||
mEnvironment.mWindowManager->onFrame(mEnvironment.mFrameDuration);
|
mEnvironment.mWindowManager->onFrame(mEnvironment.mFrameDuration);
|
||||||
|
|
||||||
// global scripts
|
// global scripts
|
||||||
@ -177,52 +139,39 @@ bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
|
|||||||
std::vector<std::pair<std::string, Ogre::Vector3> > movement;
|
std::vector<std::pair<std::string, Ogre::Vector3> > movement;
|
||||||
mEnvironment.mMechanicsManager->update (movement);
|
mEnvironment.mMechanicsManager->update (movement);
|
||||||
|
|
||||||
if (focusFrameCounter++ == focusUpdateFrame)
|
|
||||||
{
|
|
||||||
std::string handle = mEnvironment.mWorld->getFacedHandle();
|
|
||||||
|
|
||||||
std::string name;
|
|
||||||
|
|
||||||
if (!handle.empty())
|
|
||||||
{
|
|
||||||
MWWorld::Ptr ptr = mEnvironment.mWorld->getPtrViaHandle (handle);
|
|
||||||
|
|
||||||
if (!ptr.isEmpty())
|
|
||||||
name = MWWorld::Class::get (ptr).getName (ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!name.empty())
|
|
||||||
std::cout << "Object: " << name << std::endl;
|
|
||||||
|
|
||||||
focusFrameCounter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mEnvironment.mWindowManager->getMode()==MWGui::GM_Game)
|
if (mEnvironment.mWindowManager->getMode()==MWGui::GM_Game)
|
||||||
mEnvironment.mWorld->doPhysics (movement, mEnvironment.mFrameDuration);
|
mEnvironment.mWorld->doPhysics (movement, mEnvironment.mFrameDuration);
|
||||||
|
|
||||||
|
// report focus object (for debugging)
|
||||||
|
if (mReportFocus)
|
||||||
|
updateFocusReport (mEnvironment.mFrameDuration);
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
std::cerr << "Error in framelistener: " << e.what() << std::endl;
|
std::cerr << "Error in framelistener: " << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
//std::cout << "TESTING2";
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
OMW::Engine::Engine(Cfg::ConfigurationManager& configurationManager)
|
OMW::Engine::Engine(Cfg::ConfigurationManager& configurationManager)
|
||||||
: mPhysicEngine (0)
|
: mOgre (0)
|
||||||
|
, mPhysicEngine (0)
|
||||||
, mShowFPS (false)
|
, mShowFPS (false)
|
||||||
, mDebug (false)
|
, mDebug (false)
|
||||||
, mVerboseScripts (false)
|
, mVerboseScripts (false)
|
||||||
, mNewGame (false)
|
, mNewGame (false)
|
||||||
, mUseSound (true)
|
, mUseSound (true)
|
||||||
, mCompileAll (false)
|
, mCompileAll (false)
|
||||||
|
, mReportFocus (false)
|
||||||
|
, mFocusTDiff (0)
|
||||||
, mScriptManager (0)
|
, mScriptManager (0)
|
||||||
, mScriptContext (0)
|
, mScriptContext (0)
|
||||||
, mGuiManager (0)
|
, mGuiManager (0)
|
||||||
, mFSStrict (false)
|
, mFSStrict (false)
|
||||||
, mCfgMgr(configurationManager)
|
, mCfgMgr(configurationManager)
|
||||||
{
|
{
|
||||||
|
std::srand ( std::time(NULL) );
|
||||||
MWClass::registerClasses();
|
MWClass::registerClasses();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,6 +187,7 @@ OMW::Engine::~Engine()
|
|||||||
delete mScriptManager;
|
delete mScriptManager;
|
||||||
delete mScriptContext;
|
delete mScriptContext;
|
||||||
delete mPhysicEngine;
|
delete mPhysicEngine;
|
||||||
|
delete mOgre;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load all BSA files in data directory.
|
// Load all BSA files in data directory.
|
||||||
@ -261,7 +211,7 @@ void OMW::Engine::loadBSA()
|
|||||||
|
|
||||||
void OMW::Engine::addResourcesDirectory (const boost::filesystem::path& path)
|
void OMW::Engine::addResourcesDirectory (const boost::filesystem::path& path)
|
||||||
{
|
{
|
||||||
mOgre.getRoot()->addResourceLocation (path.string(), "FileSystem",
|
mOgre->getRoot()->addResourceLocation (path.string(), "FileSystem",
|
||||||
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true);
|
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,6 +275,11 @@ void OMW::Engine::setNewGame(bool newGame)
|
|||||||
mNewGame = newGame;
|
mNewGame = newGame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OMW::Engine::setReportFocus (bool report)
|
||||||
|
{
|
||||||
|
mReportFocus = report;
|
||||||
|
}
|
||||||
|
|
||||||
// Initialise and enter main loop.
|
// Initialise and enter main loop.
|
||||||
|
|
||||||
void OMW::Engine::go()
|
void OMW::Engine::go()
|
||||||
@ -332,11 +287,11 @@ void OMW::Engine::go()
|
|||||||
assert (!mEnvironment.mWorld);
|
assert (!mEnvironment.mWorld);
|
||||||
assert (!mCellName.empty());
|
assert (!mCellName.empty());
|
||||||
assert (!mMaster.empty());
|
assert (!mMaster.empty());
|
||||||
|
assert (!mOgre);
|
||||||
|
|
||||||
test.name = "";
|
mOgre = new OEngine::Render::OgreRenderer;
|
||||||
total = 0;
|
|
||||||
|
|
||||||
mOgre.configure(!boost::filesystem::is_regular_file(mCfgMgr.getOgreConfigPath()),
|
mOgre->configure(!boost::filesystem::is_regular_file(mCfgMgr.getOgreConfigPath()),
|
||||||
mCfgMgr.getOgreConfigPath().string(),
|
mCfgMgr.getOgreConfigPath().string(),
|
||||||
mCfgMgr.getLogPath().string() + std::string("/"),
|
mCfgMgr.getLogPath().string() + std::string("/"),
|
||||||
mCfgMgr.getPluginsConfigPath().string(), false);
|
mCfgMgr.getPluginsConfigPath().string(), false);
|
||||||
@ -346,28 +301,24 @@ void OMW::Engine::go()
|
|||||||
addResourcesDirectory(mResDir / "mygui");
|
addResourcesDirectory(mResDir / "mygui");
|
||||||
|
|
||||||
// Create the window
|
// Create the window
|
||||||
mOgre.createWindow("OpenMW");
|
mOgre->createWindow("OpenMW");
|
||||||
|
|
||||||
loadBSA();
|
loadBSA();
|
||||||
|
|
||||||
|
/// \todo move this into the physics manager
|
||||||
// Create physics. shapeLoader is deleted by the physic engine
|
// Create physics. shapeLoader is deleted by the physic engine
|
||||||
NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader();
|
NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader();
|
||||||
mPhysicEngine = new OEngine::Physic::PhysicEngine(shapeLoader);
|
mPhysicEngine = new OEngine::Physic::PhysicEngine(shapeLoader);
|
||||||
|
|
||||||
// Create the world
|
// Create the world
|
||||||
mEnvironment.mWorld = new MWWorld::World (mOgre, mPhysicEngine, mFileCollections, mMaster,
|
mEnvironment.mWorld = new MWWorld::World (*mOgre, mPhysicEngine, mFileCollections, mMaster,
|
||||||
mResDir, mNewGame, mEnvironment, mEncoding);
|
mResDir, mNewGame, mEnvironment, mEncoding);
|
||||||
|
|
||||||
|
/// \todo move this into the GUI manager (a.k.a WindowManager)
|
||||||
// Set up the GUI system
|
// Set up the GUI system
|
||||||
mGuiManager = new OEngine::GUI::MyGUIManager(mOgre.getWindow(), mOgre.getScene(), false,
|
mGuiManager = new OEngine::GUI::MyGUIManager(mOgre->getWindow(), mOgre->getScene(), false,
|
||||||
mCfgMgr.getLogPath().string() + std::string("/"));
|
mCfgMgr.getLogPath().string() + std::string("/"));
|
||||||
|
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSkill>("Widget");
|
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWAttribute>("Widget");
|
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpell>("Widget");
|
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpellEffect>("Widget");
|
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWDynamicStat>("Widget");
|
|
||||||
|
|
||||||
// Create window manager - this manages all the MW-specific GUI windows
|
// Create window manager - this manages all the MW-specific GUI windows
|
||||||
MWScript::registerExtensions (mExtensions);
|
MWScript::registerExtensions (mExtensions);
|
||||||
|
|
||||||
@ -375,11 +326,11 @@ void OMW::Engine::go()
|
|||||||
mExtensions, mShowFPS, mNewGame);
|
mExtensions, mShowFPS, mNewGame);
|
||||||
|
|
||||||
// Create sound system
|
// Create sound system
|
||||||
mEnvironment.mSoundManager = new MWSound::SoundManager(mOgre.getRoot(),
|
mEnvironment.mSoundManager = new MWSound::SoundManager(mOgre->getRoot(),
|
||||||
mOgre.getCamera(),
|
mOgre->getCamera(),
|
||||||
mEnvironment.mWorld->getStore(),
|
mEnvironment.mWorld->getStore(),
|
||||||
(mDataDir),
|
(mDataDir),
|
||||||
mUseSound, mFSStrict);
|
mUseSound, mFSStrict, mEnvironment);
|
||||||
|
|
||||||
// Create script system
|
// Create script system
|
||||||
mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full,
|
mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full,
|
||||||
@ -417,44 +368,32 @@ void OMW::Engine::go()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sets up the input system
|
// Sets up the input system
|
||||||
MWInput::MWInputManager input(mOgre, mEnvironment.mWorld->getPlayer(),
|
MWInput::MWInputManager input(*mOgre, mEnvironment.mWorld->getPlayer(),
|
||||||
*mEnvironment.mWindowManager, mDebug, *this);
|
*mEnvironment.mWindowManager, mDebug, *this);
|
||||||
mEnvironment.mInputManager = &input;
|
mEnvironment.mInputManager = &input;
|
||||||
|
|
||||||
focusFrameCounter = 0;
|
|
||||||
|
|
||||||
std::cout << "\nPress Q/ESC or close window to exit.\n";
|
std::cout << "\nPress Q/ESC or close window to exit.\n";
|
||||||
|
|
||||||
mOgre.getRoot()->addFrameListener (this);
|
mOgre->getRoot()->addFrameListener (this);
|
||||||
|
|
||||||
// Play some good 'ol tunes
|
// Play some good 'ol tunes
|
||||||
mEnvironment.mSoundManager->startRandomTitle();
|
mEnvironment.mSoundManager->startRandomTitle();
|
||||||
|
|
||||||
// scripts
|
// scripts
|
||||||
if (mCompileAll)
|
if (mCompileAll)
|
||||||
{
|
{
|
||||||
typedef ESMS::ScriptListT<ESM::Script>::MapType Container;
|
std::pair<int, int> result = mScriptManager->compileAll();
|
||||||
|
|
||||||
Container scripts = mEnvironment.mWorld->getStore().scripts.list;
|
if (result.first)
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
int success = 0;
|
|
||||||
|
|
||||||
for (Container::const_iterator iter (scripts.begin()); iter!=scripts.end(); ++iter, ++count)
|
|
||||||
if (mScriptManager->compile (iter->first))
|
|
||||||
++success;
|
|
||||||
|
|
||||||
if (count)
|
|
||||||
std::cout
|
std::cout
|
||||||
<< "compiled " << success << " of " << count << " scripts ("
|
<< "compiled " << result.second << " of " << result.first << " scripts ("
|
||||||
<< 100*static_cast<double> (success)/count
|
<< 100*static_cast<double> (result.second)/result.first
|
||||||
<< "%)"
|
<< "%)"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the main rendering loop
|
// Start the main rendering loop
|
||||||
mOgre.start();
|
mOgre->start();
|
||||||
|
|
||||||
std::cout << "Quitting peacefully.\n";
|
std::cout << "Quitting peacefully.\n";
|
||||||
}
|
}
|
||||||
@ -488,7 +427,7 @@ void OMW::Engine::activate()
|
|||||||
|
|
||||||
if (!script.empty())
|
if (!script.empty())
|
||||||
{
|
{
|
||||||
mIgnoreLocalPtr = ptr;
|
mEnvironment.mWorld->getLocalScripts().setIgnore (ptr);
|
||||||
mScriptManager->run (script, interpreterContext);
|
mScriptManager->run (script, interpreterContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,15 +7,14 @@
|
|||||||
|
|
||||||
#include <OgreFrameListener.h>
|
#include <OgreFrameListener.h>
|
||||||
|
|
||||||
#include <openengine/ogre/renderer.hpp>
|
|
||||||
#include <openengine/bullet/physic.hpp>
|
#include <openengine/bullet/physic.hpp>
|
||||||
|
|
||||||
#include <components/compiler/extensions.hpp>
|
#include <components/compiler/extensions.hpp>
|
||||||
#include <components/files/collections.hpp>
|
#include <components/files/collections.hpp>
|
||||||
|
#include <components/cfg/configurationmanager.hpp>
|
||||||
|
|
||||||
#include "mwworld/environment.hpp"
|
#include "mwworld/environment.hpp"
|
||||||
#include "mwworld/ptr.hpp"
|
#include "mwworld/ptr.hpp"
|
||||||
#include <boost/timer.hpp>
|
|
||||||
#include <components/cfg/configurationmanager.hpp>
|
|
||||||
|
|
||||||
namespace Compiler
|
namespace Compiler
|
||||||
{
|
{
|
||||||
@ -48,6 +47,11 @@ namespace OEngine
|
|||||||
{
|
{
|
||||||
class MyGUIManager;
|
class MyGUIManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Render
|
||||||
|
{
|
||||||
|
class OgreRenderer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace OMW
|
namespace OMW
|
||||||
@ -58,7 +62,7 @@ namespace OMW
|
|||||||
std::string mEncoding;
|
std::string mEncoding;
|
||||||
boost::filesystem::path mDataDir;
|
boost::filesystem::path mDataDir;
|
||||||
boost::filesystem::path mResDir;
|
boost::filesystem::path mResDir;
|
||||||
OEngine::Render::OgreRenderer mOgre;
|
OEngine::Render::OgreRenderer *mOgre;
|
||||||
OEngine::Physic::PhysicEngine* mPhysicEngine;
|
OEngine::Physic::PhysicEngine* mPhysicEngine;
|
||||||
std::string mCellName;
|
std::string mCellName;
|
||||||
std::string mMaster;
|
std::string mMaster;
|
||||||
@ -68,20 +72,15 @@ namespace OMW
|
|||||||
bool mNewGame;
|
bool mNewGame;
|
||||||
bool mUseSound;
|
bool mUseSound;
|
||||||
bool mCompileAll;
|
bool mCompileAll;
|
||||||
int total;
|
bool mReportFocus;
|
||||||
|
float mFocusTDiff;
|
||||||
|
std::string mFocusName;
|
||||||
|
|
||||||
MWWorld::Environment mEnvironment;
|
MWWorld::Environment mEnvironment;
|
||||||
MWScript::ScriptManager *mScriptManager;
|
MWScript::ScriptManager *mScriptManager;
|
||||||
Compiler::Extensions mExtensions;
|
Compiler::Extensions mExtensions;
|
||||||
Compiler::Context *mScriptContext;
|
Compiler::Context *mScriptContext;
|
||||||
OEngine::GUI::MyGUIManager *mGuiManager;
|
OEngine::GUI::MyGUIManager *mGuiManager;
|
||||||
ESM::Region test;
|
|
||||||
boost::timer timer;
|
|
||||||
|
|
||||||
int focusFrameCounter;
|
|
||||||
static const int focusUpdateFrame = 10;
|
|
||||||
|
|
||||||
MWWorld::Ptr mIgnoreLocalPtr;
|
|
||||||
|
|
||||||
Files::Collections mFileCollections;
|
Files::Collections mFileCollections;
|
||||||
bool mFSStrict;
|
bool mFSStrict;
|
||||||
@ -100,9 +99,9 @@ namespace OMW
|
|||||||
|
|
||||||
void executeLocalScripts();
|
void executeLocalScripts();
|
||||||
|
|
||||||
virtual bool frameRenderingQueued (const Ogre::FrameEvent& evt);
|
void updateFocusReport (float duration);
|
||||||
|
|
||||||
/// Process pending commands
|
virtual bool frameRenderingQueued (const Ogre::FrameEvent& evt);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Engine(Cfg::ConfigurationManager& configurationManager);
|
Engine(Cfg::ConfigurationManager& configurationManager);
|
||||||
@ -144,6 +143,9 @@ namespace OMW
|
|||||||
/// Start as a new game.
|
/// Start as a new game.
|
||||||
void setNewGame(bool newGame);
|
void setNewGame(bool newGame);
|
||||||
|
|
||||||
|
/// Write name of focussed object to cout
|
||||||
|
void setReportFocus (bool report);
|
||||||
|
|
||||||
/// Initialise and enter main loop.
|
/// Initialise and enter main loop.
|
||||||
void go();
|
void go();
|
||||||
|
|
||||||
|
@ -102,6 +102,9 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::Configuratio
|
|||||||
"\n\twin1250 - Central and Eastern European such as Polish, Czech, Slovak, Hungarian, Slovene, Bosnian, Croatian, Serbian (Latin script), Romanian and Albanian languages\n"
|
"\n\twin1250 - Central and Eastern European such as Polish, Czech, Slovak, Hungarian, Slovene, Bosnian, Croatian, Serbian (Latin script), Romanian and Albanian languages\n"
|
||||||
"\n\twin1251 - Cyrillic alphabet such as Russian, Bulgarian, Serbian Cyrillic and other languages\n"
|
"\n\twin1251 - Cyrillic alphabet such as Russian, Bulgarian, Serbian Cyrillic and other languages\n"
|
||||||
"\n\twin1252 - Western European (Latin) alphabet, used by default")
|
"\n\twin1252 - Western European (Latin) alphabet, used by default")
|
||||||
|
|
||||||
|
("report-focus", boost::program_options::value<bool>()->implicit_value(true)
|
||||||
|
->default_value(false), "write name of focussed object to cout")
|
||||||
;
|
;
|
||||||
|
|
||||||
bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv)
|
bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv)
|
||||||
@ -202,6 +205,7 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Cfg::Configuratio
|
|||||||
engine.setSoundUsage(!variables["nosound"].as<bool>());
|
engine.setSoundUsage(!variables["nosound"].as<bool>());
|
||||||
engine.setScriptsVerbosity(variables["script-verbose"].as<bool>());
|
engine.setScriptsVerbosity(variables["script-verbose"].as<bool>());
|
||||||
engine.setCompileAll(variables["script-all"].as<bool>());
|
engine.setCompileAll(variables["script-all"].as<bool>());
|
||||||
|
engine.setReportFocus(variables["report-focus"].as<bool>());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,12 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment
|
|||||||
playerSkillValues.insert(std::make_pair(ESM::Skill::skillIds[i], MWMechanics::Stat<float>()));
|
playerSkillValues.insert(std::make_pair(ESM::Skill::skillIds[i], MWMechanics::Stat<float>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSkill>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWAttribute>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpell>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpellEffect>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWDynamicStat>("Widget");
|
||||||
|
|
||||||
// Set up visibility
|
// Set up visibility
|
||||||
updateVisible();
|
updateVisible();
|
||||||
}
|
}
|
||||||
@ -329,7 +335,7 @@ void WindowManager::updateVisible()
|
|||||||
dialogueWindow->open();
|
dialogueWindow->open();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mode == GM_InterMessageBox)
|
if(mode == GM_InterMessageBox)
|
||||||
{
|
{
|
||||||
if(!mMessageBoxManager->isInteractiveMessageBox()) {
|
if(!mMessageBoxManager->isInteractiveMessageBox()) {
|
||||||
|
@ -116,4 +116,20 @@ namespace MWScript
|
|||||||
iter->second.clear(); // don't execute again.
|
iter->second.clear(); // don't execute again.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<int, int> ScriptManager::compileAll()
|
||||||
|
{
|
||||||
|
typedef ESMS::ScriptListT<ESM::Script>::MapType Container;
|
||||||
|
|
||||||
|
const Container& scripts = mStore.scripts.list;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
int success = 0;
|
||||||
|
|
||||||
|
for (Container::const_iterator iter (scripts.begin()); iter!=scripts.end(); ++iter, ++count)
|
||||||
|
if (compile (iter->first))
|
||||||
|
++success;
|
||||||
|
|
||||||
|
return std::make_pair (count, success);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,10 @@ namespace MWScript
|
|||||||
bool compile (const std::string& name);
|
bool compile (const std::string& name);
|
||||||
///< Compile script with the given namen
|
///< Compile script with the given namen
|
||||||
/// \return Success?
|
/// \return Success?
|
||||||
|
|
||||||
|
std::pair<int, int> compileAll();
|
||||||
|
///< Compile all scripts
|
||||||
|
/// \return count, success
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,18 +1,23 @@
|
|||||||
#include "soundmanager.hpp"
|
#include "soundmanager.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
#include <OgreRoot.h>
|
||||||
|
|
||||||
#include <openengine/sound/sndmanager.hpp>
|
#include <openengine/sound/sndmanager.hpp>
|
||||||
#include <mangle/sound/clients/ogre_listener_mover.hpp>
|
#include <mangle/sound/clients/ogre_listener_mover.hpp>
|
||||||
#include <mangle/sound/clients/ogre_output_updater.hpp>
|
#include <mangle/sound/clients/ogre_output_updater.hpp>
|
||||||
|
|
||||||
#include <components/file_finder/file_finder.hpp>
|
#include <components/file_finder/file_finder.hpp>
|
||||||
#include <components/esm_store/store.hpp>
|
#include <components/esm_store/store.hpp>
|
||||||
#include <algorithm>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include <OgreRoot.h>
|
#include "../mwworld/environment.hpp"
|
||||||
|
#include "../mwworld/world.hpp"
|
||||||
|
#include "../mwworld/player.hpp"
|
||||||
|
|
||||||
/* Set up the sound manager to use Audiere, FFMPEG or
|
/* Set up the sound manager to use Audiere, FFMPEG or
|
||||||
MPG123/libsndfile for input. The OPENMW_USE_x macros are set in
|
MPG123/libsndfile for input. The OPENMW_USE_x macros are set in
|
||||||
@ -378,12 +383,18 @@ namespace MWSound
|
|||||||
SoundManager::SoundManager(Ogre::Root *root, Ogre::Camera *camera,
|
SoundManager::SoundManager(Ogre::Root *root, Ogre::Camera *camera,
|
||||||
const ESMS::ESMStore &store,
|
const ESMS::ESMStore &store,
|
||||||
boost::filesystem::path dataDir,
|
boost::filesystem::path dataDir,
|
||||||
bool useSound, bool fsstrict)
|
bool useSound, bool fsstrict, MWWorld::Environment& environment)
|
||||||
: mData(NULL), fsStrict (fsstrict)
|
: mData(NULL), fsStrict (fsstrict), mEnvironment (environment)
|
||||||
{
|
{
|
||||||
MP3Lookup(dataDir / "Music/Explore/");
|
MP3Lookup(dataDir / "Music/Explore/");
|
||||||
if(useSound)
|
if(useSound)
|
||||||
mData = new SoundImpl(root, camera, store, (dataDir / "Sound").string(), (dataDir / "Music").string(), fsstrict);
|
mData = new SoundImpl(root, camera, store, (dataDir / "Sound").string(), (dataDir / "Music").string(), fsstrict);
|
||||||
|
|
||||||
|
|
||||||
|
test.name = "";
|
||||||
|
total = 0;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundManager::~SoundManager()
|
SoundManager::~SoundManager()
|
||||||
@ -533,4 +544,64 @@ namespace MWSound
|
|||||||
if(!mData) return;
|
if(!mData) return;
|
||||||
mData->updatePositions(ptr);
|
mData->updatePositions(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoundManager::update (float duration)
|
||||||
|
{
|
||||||
|
std::string effect;
|
||||||
|
|
||||||
|
MWWorld::Ptr::CellStore *current = mEnvironment.mWorld->getPlayer().getPlayer().getCell();
|
||||||
|
|
||||||
|
//If the region has changed
|
||||||
|
if(!(current->cell->data.flags & current->cell->Interior) && timer.elapsed() >= 10){
|
||||||
|
timer.restart();
|
||||||
|
if (test.name != current->cell->region)
|
||||||
|
{
|
||||||
|
total = 0;
|
||||||
|
test = (ESM::Region) *(mEnvironment.mWorld->getStore().regions.find(current->cell->region));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(test.soundList.size() > 0)
|
||||||
|
{
|
||||||
|
std::vector<ESM::Region::SoundRef>::iterator soundIter = test.soundList.begin();
|
||||||
|
//mEnvironment.mSoundManager
|
||||||
|
if(total == 0){
|
||||||
|
while (!(soundIter == test.soundList.end()))
|
||||||
|
{
|
||||||
|
ESM::NAME32 go = soundIter->sound;
|
||||||
|
int chance = (int) soundIter->chance;
|
||||||
|
//std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n";
|
||||||
|
soundIter++;
|
||||||
|
total += chance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int r = rand() % total; //old random code
|
||||||
|
int pos = 0;
|
||||||
|
soundIter = test.soundList.begin();
|
||||||
|
while (!(soundIter == test.soundList.end()))
|
||||||
|
{
|
||||||
|
const ESM::NAME32 go = soundIter->sound;
|
||||||
|
int chance = (int) soundIter->chance;
|
||||||
|
//std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n";
|
||||||
|
soundIter++;
|
||||||
|
if( r - pos < chance)
|
||||||
|
{
|
||||||
|
effect = go.name;
|
||||||
|
//play sound
|
||||||
|
std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n";
|
||||||
|
mEnvironment.mSoundManager->playSound(effect, 20.0, 1.0);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
pos += chance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(current->cell->data.flags & current->cell->Interior)
|
||||||
|
{
|
||||||
|
test.name = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,9 @@
|
|||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
#include <openengine/sound/sndmanager.hpp>
|
#include <openengine/sound/sndmanager.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
#include <boost/timer.hpp>
|
||||||
|
|
||||||
namespace Ogre
|
namespace Ogre
|
||||||
{
|
{
|
||||||
class Root;
|
class Root;
|
||||||
@ -19,6 +22,11 @@ namespace ESMS
|
|||||||
struct ESMStore;
|
struct ESMStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
struct Environment;
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWSound
|
namespace MWSound
|
||||||
{
|
{
|
||||||
//SoundPtr *music;
|
//SoundPtr *music;
|
||||||
@ -31,6 +39,11 @@ namespace MWSound
|
|||||||
SoundImpl *mData;
|
SoundImpl *mData;
|
||||||
std::vector<boost::filesystem::path> files;
|
std::vector<boost::filesystem::path> files;
|
||||||
bool fsStrict;
|
bool fsStrict;
|
||||||
|
MWWorld::Environment& mEnvironment;
|
||||||
|
|
||||||
|
int total;
|
||||||
|
ESM::Region test;
|
||||||
|
boost::timer timer;
|
||||||
|
|
||||||
void streamMusicFull (const std::string& filename);
|
void streamMusicFull (const std::string& filename);
|
||||||
///< Play a soundifle
|
///< Play a soundifle
|
||||||
@ -38,8 +51,9 @@ namespace MWSound
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SoundManager(Ogre::Root*, Ogre::Camera*, const ESMS::ESMStore &store,
|
SoundManager(Ogre::Root*, Ogre::Camera*, const ESMS::ESMStore &store,
|
||||||
boost::filesystem::path dataDir, bool useSound, bool fsstrict);
|
boost::filesystem::path dataDir, bool useSound, bool fsstrict,
|
||||||
|
MWWorld::Environment& environment);
|
||||||
~SoundManager();
|
~SoundManager();
|
||||||
|
|
||||||
void streamMusic(const std::string& filename);
|
void streamMusic(const std::string& filename);
|
||||||
@ -60,8 +74,6 @@ namespace MWSound
|
|||||||
bool sayDone (MWWorld::Ptr reference) const;
|
bool sayDone (MWWorld::Ptr reference) const;
|
||||||
///< Is actor not speaking?
|
///< Is actor not speaking?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void playSound (const std::string& soundId, float volume, float pitch);
|
void playSound (const std::string& soundId, float volume, float pitch);
|
||||||
///< Play a sound, independently of 3D-position
|
///< Play a sound, independently of 3D-position
|
||||||
|
|
||||||
@ -81,6 +93,8 @@ namespace MWSound
|
|||||||
|
|
||||||
void updateObject(MWWorld::Ptr reference);
|
void updateObject(MWWorld::Ptr reference);
|
||||||
///< Update the position of all sounds connected to the given object.
|
///< Update the position of all sounds connected to the given object.
|
||||||
|
|
||||||
|
void update (float duration);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
126
apps/openmw/mwworld/localscripts.cpp
Normal file
126
apps/openmw/mwworld/localscripts.cpp
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
|
||||||
|
#include "localscripts.hpp"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
void listCellScripts (MWWorld::LocalScripts& localScripts,
|
||||||
|
ESMS::CellRefList<T, MWWorld::RefData>& cellRefList, MWWorld::Ptr::CellStore *cell)
|
||||||
|
{
|
||||||
|
for (typename ESMS::CellRefList<T, MWWorld::RefData>::List::iterator iter (
|
||||||
|
cellRefList.list.begin());
|
||||||
|
iter!=cellRefList.list.end(); ++iter)
|
||||||
|
{
|
||||||
|
if (!iter->base->script.empty() && iter->mData.getCount())
|
||||||
|
{
|
||||||
|
localScripts.add (iter->base->script, MWWorld::Ptr (&*iter, cell));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MWWorld::LocalScripts::LocalScripts (const ESMS::ESMStore& store) : mStore (store) {}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::setIgnore (const Ptr& ptr)
|
||||||
|
{
|
||||||
|
mIgnore = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::startIteration()
|
||||||
|
{
|
||||||
|
mIter = mScripts.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MWWorld::LocalScripts::isFinished() const
|
||||||
|
{
|
||||||
|
if (mIter==mScripts.end())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!mIgnore.isEmpty() && mIter->second==mIgnore)
|
||||||
|
{
|
||||||
|
std::list<std::pair<std::string, Ptr> >::iterator iter = mIter;
|
||||||
|
return ++iter==mScripts.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<std::string, MWWorld::Ptr> MWWorld::LocalScripts::getNext()
|
||||||
|
{
|
||||||
|
assert (!isFinished());
|
||||||
|
|
||||||
|
std::list<std::pair<std::string, Ptr> >::iterator iter = mIter++;
|
||||||
|
|
||||||
|
if (mIgnore.isEmpty() || iter->second!=mIgnore)
|
||||||
|
return *iter;
|
||||||
|
|
||||||
|
return getNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::add (const std::string& scriptName, const Ptr& ptr)
|
||||||
|
{
|
||||||
|
if (const ESM::Script *script = mStore.scripts.find (scriptName))
|
||||||
|
{
|
||||||
|
ptr.getRefData().setLocals (*script);
|
||||||
|
|
||||||
|
mScripts.push_back (std::make_pair (scriptName, ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::addCell (Ptr::CellStore *cell)
|
||||||
|
{
|
||||||
|
listCellScripts (*this, cell->activators, cell);
|
||||||
|
listCellScripts (*this, cell->potions, cell);
|
||||||
|
listCellScripts (*this, cell->appas, cell);
|
||||||
|
listCellScripts (*this, cell->armors, cell);
|
||||||
|
listCellScripts (*this, cell->books, cell);
|
||||||
|
listCellScripts (*this, cell->clothes, cell);
|
||||||
|
listCellScripts (*this, cell->containers, cell);
|
||||||
|
listCellScripts (*this, cell->creatures, cell);
|
||||||
|
listCellScripts (*this, cell->doors, cell);
|
||||||
|
listCellScripts (*this, cell->ingreds, cell);
|
||||||
|
listCellScripts (*this, cell->lights, cell);
|
||||||
|
listCellScripts (*this, cell->lockpicks, cell);
|
||||||
|
listCellScripts (*this, cell->miscItems, cell);
|
||||||
|
listCellScripts (*this, cell->npcs, cell);
|
||||||
|
listCellScripts (*this, cell->probes, cell);
|
||||||
|
listCellScripts (*this, cell->repairs, cell);
|
||||||
|
listCellScripts (*this, cell->weapons, cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::clear()
|
||||||
|
{
|
||||||
|
mScripts.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::clearCell (Ptr::CellStore *cell)
|
||||||
|
{
|
||||||
|
std::list<std::pair<std::string, Ptr> >::iterator iter = mScripts.begin();
|
||||||
|
|
||||||
|
while (iter!=mScripts.end())
|
||||||
|
{
|
||||||
|
if (iter->second.getCell()==cell)
|
||||||
|
{
|
||||||
|
if (iter==mIter)
|
||||||
|
++mIter;
|
||||||
|
|
||||||
|
mScripts.erase (iter++);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MWWorld::LocalScripts::remove (const Ptr& ptr)
|
||||||
|
{
|
||||||
|
for (std::list<std::pair<std::string, Ptr> >::iterator iter = mScripts.begin();
|
||||||
|
iter!=mScripts.end(); ++iter)
|
||||||
|
if (iter->second==ptr)
|
||||||
|
{
|
||||||
|
if (iter==mIter)
|
||||||
|
++mIter;
|
||||||
|
|
||||||
|
mScripts.erase (iter);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
58
apps/openmw/mwworld/localscripts.hpp
Normal file
58
apps/openmw/mwworld/localscripts.hpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef GAME_MWWORLD_LOCALSCRIPTS_H
|
||||||
|
#define GAME_MWWORLD_LOCALSCRIPTS_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ptr.hpp"
|
||||||
|
|
||||||
|
namespace ESMS
|
||||||
|
{
|
||||||
|
struct ESMStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace MWWorld
|
||||||
|
{
|
||||||
|
/// \brief List of active local scripts
|
||||||
|
class LocalScripts
|
||||||
|
{
|
||||||
|
std::list<std::pair<std::string, Ptr> > mScripts;
|
||||||
|
std::list<std::pair<std::string, Ptr> >::iterator mIter;
|
||||||
|
MWWorld::Ptr mIgnore;
|
||||||
|
const ESMS::ESMStore& mStore;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
LocalScripts (const ESMS::ESMStore& store);
|
||||||
|
|
||||||
|
void setIgnore (const Ptr& ptr);
|
||||||
|
///< Mark a single reference for ignoring during iteration over local scripts (will revoke
|
||||||
|
/// previous ignores).
|
||||||
|
|
||||||
|
void startIteration();
|
||||||
|
///< Set the iterator to the begin of the script list.
|
||||||
|
|
||||||
|
bool isFinished() const;
|
||||||
|
///< Is iteration finished?
|
||||||
|
|
||||||
|
std::pair<std::string, Ptr> getNext();
|
||||||
|
///< Get next local script (must not be called if isFinished())
|
||||||
|
|
||||||
|
void add (const std::string& scriptName, const Ptr& ptr);
|
||||||
|
///< Add script to collection of active local scripts.
|
||||||
|
|
||||||
|
void addCell (Ptr::CellStore *cell);
|
||||||
|
///< Add all local scripts in a cell.
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
///< Clear active local scripts collection.
|
||||||
|
|
||||||
|
void clearCell (Ptr::CellStore *cell);
|
||||||
|
///< Remove all scripts belonging to \a cell.
|
||||||
|
|
||||||
|
void remove (const Ptr& ptr);
|
||||||
|
///< Remove script for given reference (ignored if reference does not have a scirpt listed).
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -57,7 +57,7 @@ namespace MWWorld
|
|||||||
mPhysics->removeObject (*iter);
|
mPhysics->removeObject (*iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
mWorld->removeScripts (iter->first);
|
mWorld->getLocalScripts().clearCell (iter->first);
|
||||||
|
|
||||||
mEnvironment.mMechanicsManager->dropActors (iter->first);
|
mEnvironment.mMechanicsManager->dropActors (iter->first);
|
||||||
mEnvironment.mSoundManager->stopSound (iter->first);
|
mEnvironment.mSoundManager->stopSound (iter->first);
|
||||||
@ -68,7 +68,7 @@ namespace MWWorld
|
|||||||
void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render)
|
void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render)
|
||||||
{
|
{
|
||||||
// register local scripts
|
// register local scripts
|
||||||
mWorld->insertInteriorScripts (*cell);
|
mWorld->getLocalScripts().addCell (cell);
|
||||||
|
|
||||||
// This connects the cell data with the rendering scene.
|
// This connects the cell data with the rendering scene.
|
||||||
std::pair<CellRenderCollection::iterator, bool> result =
|
std::pair<CellRenderCollection::iterator, bool> result =
|
||||||
|
@ -27,7 +27,7 @@ namespace
|
|||||||
{
|
{
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void listCellScripts (const ESMS::ESMStore& store,
|
void listCellScripts (const ESMS::ESMStore& store,
|
||||||
ESMS::CellRefList<T, MWWorld::RefData>& cellRefList, MWWorld::World::ScriptList& scriptList,
|
ESMS::CellRefList<T, MWWorld::RefData>& cellRefList, MWWorld::LocalScripts& localScripts,
|
||||||
MWWorld::Ptr::CellStore *cell)
|
MWWorld::Ptr::CellStore *cell)
|
||||||
{
|
{
|
||||||
for (typename ESMS::CellRefList<T, MWWorld::RefData>::List::iterator iter (
|
for (typename ESMS::CellRefList<T, MWWorld::RefData>::List::iterator iter (
|
||||||
@ -40,8 +40,7 @@ namespace
|
|||||||
{
|
{
|
||||||
iter->mData.setLocals (*script);
|
iter->mData.setLocals (*script);
|
||||||
|
|
||||||
scriptList.push_back (
|
localScripts.add (iter->base->script, MWWorld::Ptr (&*iter, cell));
|
||||||
std::make_pair (iter->base->script, MWWorld::Ptr (&*iter, cell)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,28 +66,6 @@ namespace
|
|||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
|
|
||||||
void World::insertInteriorScripts (ESMS::CellStore<RefData>& cell)
|
|
||||||
{
|
|
||||||
listCellScripts (mStore, cell.activators, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.potions, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.appas, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.armors, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.books, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.clothes, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.containers, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.creatures, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.doors, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.ingreds, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.lights, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.lockpicks, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.miscItems, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.npcs, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.probes, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.repairs, mLocalScripts, &cell);
|
|
||||||
listCellScripts (mStore, cell.weapons, mLocalScripts, &cell);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ptr World::getPtrViaHandle (const std::string& handle, Ptr::CellStore& cell)
|
Ptr World::getPtrViaHandle (const std::string& handle, Ptr::CellStore& cell)
|
||||||
{
|
{
|
||||||
if (ESMS::LiveCellRef<ESM::Activator, RefData> *ref =
|
if (ESMS::LiveCellRef<ESM::Activator, RefData> *ref =
|
||||||
@ -185,20 +162,6 @@ namespace MWWorld
|
|||||||
throw std::runtime_error ("month out of range");
|
throw std::runtime_error ("month out of range");
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::removeScripts (Ptr::CellStore *cell)
|
|
||||||
{
|
|
||||||
ScriptList::iterator iter = mLocalScripts.begin();
|
|
||||||
|
|
||||||
while (iter!=mLocalScripts.end())
|
|
||||||
{
|
|
||||||
if (iter->second.getCell()==cell)
|
|
||||||
mLocalScripts.erase (iter++);
|
|
||||||
else
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void World::adjustSky()
|
void World::adjustSky()
|
||||||
{
|
{
|
||||||
if (mSky)
|
if (mSky)
|
||||||
@ -213,7 +176,7 @@ namespace MWWorld
|
|||||||
const Files::Collections& fileCollections,
|
const Files::Collections& fileCollections,
|
||||||
const std::string& master, const boost::filesystem::path& resDir,
|
const std::string& master, const boost::filesystem::path& resDir,
|
||||||
bool newGame, Environment& environment, const std::string& encoding)
|
bool newGame, Environment& environment, const std::string& encoding)
|
||||||
: mScene (renderer,physEng), mPlayer (0), mGlobalVariables (0),
|
: mScene (renderer,physEng), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0),
|
||||||
mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this)
|
mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this)
|
||||||
{
|
{
|
||||||
mPhysEngine = physEng;
|
mPhysEngine = physEng;
|
||||||
@ -306,7 +269,7 @@ namespace MWWorld
|
|||||||
return mEsm;
|
return mEsm;
|
||||||
}
|
}
|
||||||
|
|
||||||
const World::ScriptList& World::getLocalScripts() const
|
LocalScripts& World::getLocalScripts()
|
||||||
{
|
{
|
||||||
return mLocalScripts;
|
return mLocalScripts;
|
||||||
}
|
}
|
||||||
@ -575,13 +538,7 @@ namespace MWWorld
|
|||||||
|
|
||||||
mPhysics->removeObject (ptr.getRefData().getHandle());
|
mPhysics->removeObject (ptr.getRefData().getHandle());
|
||||||
|
|
||||||
for (ScriptList::iterator iter = mLocalScripts.begin(); iter!=mLocalScripts.end();
|
mLocalScripts.remove (ptr);
|
||||||
++iter)
|
|
||||||
if (ptr==iter->second)
|
|
||||||
{
|
|
||||||
mLocalScripts.erase (iter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render->deleteObject (ptr.getRefData().getHandle());
|
render->deleteObject (ptr.getRefData().getHandle());
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "scene.hpp"
|
#include "scene.hpp"
|
||||||
#include "physicssystem.hpp"
|
#include "physicssystem.hpp"
|
||||||
#include "cells.hpp"
|
#include "cells.hpp"
|
||||||
|
#include "localscripts.hpp"
|
||||||
|
|
||||||
#include <openengine/bullet/physic.hpp>
|
#include <openengine/bullet/physic.hpp>
|
||||||
|
|
||||||
@ -55,9 +56,7 @@ namespace MWWorld
|
|||||||
|
|
||||||
class World
|
class World
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef std::list<std::pair<std::string, Ptr> > ScriptList;
|
|
||||||
|
|
||||||
enum RenderMode
|
enum RenderMode
|
||||||
{
|
{
|
||||||
@ -71,7 +70,7 @@ namespace MWWorld
|
|||||||
MWWorld::Player *mPlayer;
|
MWWorld::Player *mPlayer;
|
||||||
ESM::ESMReader mEsm;
|
ESM::ESMReader mEsm;
|
||||||
ESMS::ESMStore mStore;
|
ESMS::ESMStore mStore;
|
||||||
ScriptList mLocalScripts;
|
LocalScripts mLocalScripts;
|
||||||
MWWorld::Globals *mGlobalVariables;
|
MWWorld::Globals *mGlobalVariables;
|
||||||
MWWorld::PhysicsSystem *mPhysics;
|
MWWorld::PhysicsSystem *mPhysics;
|
||||||
bool mSky;
|
bool mSky;
|
||||||
@ -108,10 +107,6 @@ namespace MWWorld
|
|||||||
|
|
||||||
Ptr::CellStore *getInterior (const std::string& name);
|
Ptr::CellStore *getInterior (const std::string& name);
|
||||||
|
|
||||||
void removeScripts (Ptr::CellStore *cell);
|
|
||||||
|
|
||||||
void insertInteriorScripts (ESMS::CellStore<RefData>& cell);
|
|
||||||
|
|
||||||
void adjustSky();
|
void adjustSky();
|
||||||
|
|
||||||
MWWorld::Player& getPlayer();
|
MWWorld::Player& getPlayer();
|
||||||
@ -120,8 +115,7 @@ namespace MWWorld
|
|||||||
|
|
||||||
ESM::ESMReader& getEsmReader();
|
ESM::ESMReader& getEsmReader();
|
||||||
|
|
||||||
const ScriptList& getLocalScripts() const;
|
LocalScripts& getLocalScripts();
|
||||||
///< Names and local variable state of all local scripts in active cells.
|
|
||||||
|
|
||||||
bool hasCellChanged() const;
|
bool hasCellChanged() const;
|
||||||
///< Has the player moved to a different cell, since the last frame?
|
///< Has the player moved to a different cell, since the last frame?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user