forked from mirror/openmw-tes3mp
added CellChanged script function
This commit is contained in:
parent
32eafaa301
commit
f0c492ae22
14 changed files with 162 additions and 4 deletions
|
@ -39,13 +39,17 @@ source_group(apps\\openmw\\mwinput FILES ${GAMEINPUT} ${GAMEINPUT_HEADER})
|
|||
|
||||
set(GAMESCRIPT
|
||||
apps/openmw/mwscript/scriptmanager.cpp
|
||||
apps/openmw/mwscript/interpretercontext.cpp)
|
||||
apps/openmw/mwscript/interpretercontext.cpp
|
||||
apps/openmw/mwscript/cellextensions.cpp
|
||||
apps/openmw/mwscript/extensions.cpp)
|
||||
set(GAMESCRIPT_HEADER
|
||||
apps/openmw/mwscript/locals.hpp
|
||||
apps/openmw/mwscript/scriptmanager.hpp
|
||||
apps/openmw/mwscript/compilercontext.hpp
|
||||
apps/openmw/mwscript/compilercontextscript.hpp
|
||||
apps/openmw/mwscript/interpretercontext.hpp)
|
||||
apps/openmw/mwscript/interpretercontext.hpp
|
||||
apps/openmw/mwscript/cellextensions.hpp
|
||||
apps/openmw/mwscript/extensions.hpp)
|
||||
source_group(apps\\openmw\\mwscript FILES ${GAMESCRIPT} ${GAMESCRIPT_HEADER})
|
||||
|
||||
set(APPS ${GAME} ${GAMEREND} ${GAMEINPUT} ${GAMESCRIPT})
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "mwscript/scriptmanager.hpp"
|
||||
#include "mwscript/compilercontextscript.hpp"
|
||||
#include "mwscript/interpretercontext.hpp"
|
||||
#include "mwscript/extensions.hpp"
|
||||
|
||||
#include "world.hpp"
|
||||
|
||||
|
@ -161,7 +162,10 @@ void OMW::Engine::go()
|
|||
// Create the world
|
||||
mWorld = new World (mOgre, mDataDir, mMaster, mCellName);
|
||||
|
||||
MWScript::registerExtensions (mExtensions);
|
||||
|
||||
mScriptContext = new MWScript::CompilerContextScript;
|
||||
mScriptContext->setExtensions (&mExtensions);
|
||||
|
||||
mScriptManager = new MWScript::ScriptManager (mWorld->getStore(), mVerboseScripts,
|
||||
*mScriptContext);
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "components/misc/tsdeque.hpp"
|
||||
#include "components/commandserver/server.hpp"
|
||||
#include "components/commandserver/command.hpp"
|
||||
#include <components/compiler/extensions.hpp>
|
||||
|
||||
#include "mwrender/mwscene.hpp"
|
||||
|
||||
|
@ -46,6 +47,7 @@ namespace OMW
|
|||
std::auto_ptr<OMW::CommandServer::Server> mspCommandServer;
|
||||
|
||||
MWScript::ScriptManager *mScriptManager;
|
||||
Compiler::Extensions mExtensions;
|
||||
Compiler::Context *mScriptContext;
|
||||
|
||||
// not implemented
|
||||
|
|
42
apps/openmw/mwscript/cellextensions.cpp
Normal file
42
apps/openmw/mwscript/cellextensions.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
|
||||
#include "cellextensions.hpp"
|
||||
|
||||
#include <components/compiler/extensions.hpp>
|
||||
|
||||
#include <components/interpreter/interpreter.hpp>
|
||||
#include <components/interpreter/runtime.hpp>
|
||||
#include <components/interpreter/opcodes.hpp>
|
||||
|
||||
#include "interpretercontext.hpp"
|
||||
|
||||
namespace MWScript
|
||||
{
|
||||
namespace Cell
|
||||
{
|
||||
class OpCellChanged : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
InterpreterContext& context
|
||||
= static_cast<InterpreterContext&> (runtime.getContext());
|
||||
|
||||
runtime.push (context.cellChanged() ? 1 : 0);
|
||||
}
|
||||
};
|
||||
|
||||
const int opcodeCellChanged = 0x2000000;
|
||||
|
||||
void registerExtensions (Compiler::Extensions& extensions)
|
||||
{
|
||||
extensions.registerFunction ("cellchanged", 'l', "", opcodeCellChanged);
|
||||
}
|
||||
|
||||
void installOpcodes (Interpreter::Interpreter& interpreter)
|
||||
{
|
||||
interpreter.installSegment5 (opcodeCellChanged, new OpCellChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
27
apps/openmw/mwscript/cellextensions.hpp
Normal file
27
apps/openmw/mwscript/cellextensions.hpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef GAME_SCRIPT_CELLEXTENSIONS_H
|
||||
#define GAME_SCRIPT_CELLEXTENSIONS_H
|
||||
|
||||
namespace Compiler
|
||||
{
|
||||
class Extensions;
|
||||
}
|
||||
|
||||
namespace Interpreter
|
||||
{
|
||||
class Interpreter;
|
||||
}
|
||||
|
||||
namespace MWScript
|
||||
{
|
||||
/// \brief cell-related script functionality
|
||||
namespace Cell
|
||||
{
|
||||
void registerExtensions (Compiler::Extensions& extensions);
|
||||
|
||||
void installOpcodes (Interpreter::Interpreter& interpreter);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
26
apps/openmw/mwscript/docs/vmformat.txt
Normal file
26
apps/openmw/mwscript/docs/vmformat.txt
Normal file
|
@ -0,0 +1,26 @@
|
|||
OpenMW Extensions:
|
||||
|
||||
Segment 0:
|
||||
(not implemented yet)
|
||||
opcodes 0x20-0x3f unused
|
||||
|
||||
Segment 1:
|
||||
(not implemented yet)
|
||||
opcodes 0x20-0x3f unused
|
||||
|
||||
Segment 2:
|
||||
(not implemented yet)
|
||||
opcodes 0x200-0x3ff unused
|
||||
|
||||
Segment 3:
|
||||
(not implemented yet)
|
||||
opcodes 0x200-0x3ff unused
|
||||
|
||||
Segment 4:
|
||||
(not implemented yet)
|
||||
opcodes 0x200-0x3ff unused
|
||||
|
||||
Segment 5:
|
||||
op 2000000: push 1 if cell has changed since last frame, 0 if not
|
||||
opcodes 0x2000001-0x3ffffff unused
|
||||
|
13
apps/openmw/mwscript/extensions.cpp
Normal file
13
apps/openmw/mwscript/extensions.cpp
Normal file
|
@ -0,0 +1,13 @@
|
|||
|
||||
#include "extensions.hpp"
|
||||
|
||||
#include "cellextensions.hpp"
|
||||
|
||||
namespace MWScript
|
||||
{
|
||||
void registerExtensions (Compiler::Extensions& extensions)
|
||||
{
|
||||
Cell::registerExtensions (extensions);
|
||||
}
|
||||
}
|
||||
|
14
apps/openmw/mwscript/extensions.hpp
Normal file
14
apps/openmw/mwscript/extensions.hpp
Normal file
|
@ -0,0 +1,14 @@
|
|||
#ifndef GAME_SCRIPT_EXTENSIONS_H
|
||||
#define GAME_SCRIPT_EXTENSIONS_H
|
||||
|
||||
namespace Compiler
|
||||
{
|
||||
class Extensions;
|
||||
}
|
||||
|
||||
namespace MWScript
|
||||
{
|
||||
void registerExtensions (Compiler::Extensions& extensions);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -5,6 +5,7 @@
|
|||
#include <iostream>
|
||||
|
||||
#include "locals.hpp"
|
||||
#include "../world.hpp"
|
||||
|
||||
namespace MWScript
|
||||
{
|
||||
|
@ -68,5 +69,10 @@ namespace MWScript
|
|||
if (!buttons.empty())
|
||||
std::cerr << "error: message box buttons not supported" << std::endl;
|
||||
}
|
||||
|
||||
bool InterpreterContext::cellChanged()
|
||||
{
|
||||
return mWorld.hasCellChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,8 @@ namespace MWScript
|
|||
|
||||
virtual void messageBox (const std::string& message,
|
||||
const std::vector<std::string>& buttons);
|
||||
|
||||
virtual bool cellChanged();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <components/esm_store/store.hpp>
|
||||
|
||||
#include <components/compiler/scanner.hpp>
|
||||
#include <components/compiler/context.hpp>
|
||||
|
||||
#include <components/interpreter/installopcodes.hpp>
|
||||
#include <components/interpreter/interpreter.hpp>
|
||||
|
@ -39,7 +40,7 @@ namespace MWScript
|
|||
{
|
||||
std::istringstream input (script->scriptText);
|
||||
|
||||
Compiler::Scanner scanner (mErrorHandler, input);
|
||||
Compiler::Scanner scanner (mErrorHandler, input, mCompilerContext.getExtensions());
|
||||
|
||||
scanner.scan (mParser);
|
||||
|
||||
|
@ -99,7 +100,7 @@ namespace MWScript
|
|||
try
|
||||
{
|
||||
Interpreter::Interpreter interpreter (interpreterContext);
|
||||
Interpreter::installOpcodes (interpreter);
|
||||
installOpcodes (interpreter);
|
||||
interpreter.run (&iter->second[0], iter->second.size());
|
||||
}
|
||||
catch (...)
|
||||
|
@ -108,5 +109,10 @@ namespace MWScript
|
|||
iter->second.clear(); // don't execute again.
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptManager::installOpcodes (Interpreter::Interpreter& interpreter)
|
||||
{
|
||||
Interpreter::installOpcodes (interpreter);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Compiler
|
|||
namespace Interpreter
|
||||
{
|
||||
class Context;
|
||||
class Interpreter;
|
||||
}
|
||||
|
||||
namespace MWScript
|
||||
|
@ -45,6 +46,8 @@ namespace MWScript
|
|||
Compiler::Context& compilerContext);
|
||||
|
||||
void run (const std::string& name, Interpreter::Context& interpreterContext);
|
||||
|
||||
static void installOpcodes (Interpreter::Interpreter& interpreter);
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -115,4 +115,10 @@ namespace OMW
|
|||
{
|
||||
return mLocalScripts;
|
||||
}
|
||||
|
||||
bool World::hasCellChanged() const
|
||||
{
|
||||
// Cell change not implemented yet.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,6 +68,9 @@ namespace OMW
|
|||
|
||||
const ScriptList& getLocalScripts() const;
|
||||
///< Names and local variable state of all local scripts in active cells.
|
||||
|
||||
bool hasCellChanged() const;
|
||||
///< Has the player moved to a different cell, since the last frame?
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue