forked from mirror/openmw-tes3mp
added opcode for running scripts with explicit references (targeted scripts)
This commit is contained in:
parent
e9377ad5c4
commit
75ab8de3d2
8 changed files with 36 additions and 14 deletions
|
@ -24,7 +24,7 @@ namespace MWScript
|
||||||
addStartup();
|
addStartup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalScripts::addScript (const std::string& name)
|
void GlobalScripts::addScript (const std::string& name, const std::string& targetId)
|
||||||
{
|
{
|
||||||
std::map<std::string, GlobalScriptDesc>::iterator iter =
|
std::map<std::string, GlobalScriptDesc>::iterator iter =
|
||||||
mScripts.find (::Misc::StringUtils::lowerCase (name));
|
mScripts.find (::Misc::StringUtils::lowerCase (name));
|
||||||
|
@ -36,12 +36,16 @@ namespace MWScript
|
||||||
GlobalScriptDesc desc;
|
GlobalScriptDesc desc;
|
||||||
desc.mRunning = true;
|
desc.mRunning = true;
|
||||||
desc.mLocals.configure (*script);
|
desc.mLocals.configure (*script);
|
||||||
|
desc.mId = targetId;
|
||||||
|
|
||||||
mScripts.insert (std::make_pair (name, desc));
|
mScripts.insert (std::make_pair (name, desc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (!iter->second.mRunning)
|
||||||
|
{
|
||||||
iter->second.mRunning = true;
|
iter->second.mRunning = true;
|
||||||
|
iter->second.mId = targetId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalScripts::removeScript (const std::string& name)
|
void GlobalScripts::removeScript (const std::string& name)
|
||||||
|
|
|
@ -44,7 +44,7 @@ namespace MWScript
|
||||||
|
|
||||||
GlobalScripts (const MWWorld::ESMStore& store);
|
GlobalScripts (const MWWorld::ESMStore& store);
|
||||||
|
|
||||||
void addScript (const std::string& name);
|
void addScript (const std::string& name, const std::string& targetId = "");
|
||||||
|
|
||||||
void removeScript (const std::string& name);
|
void removeScript (const std::string& name);
|
||||||
|
|
||||||
|
|
|
@ -366,9 +366,9 @@ namespace MWScript
|
||||||
return MWBase::Environment::get().getScriptManager()->getGlobalScripts().isRunning (name);
|
return MWBase::Environment::get().getScriptManager()->getGlobalScripts().isRunning (name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterContext::startScript (const std::string& name)
|
void InterpreterContext::startScript (const std::string& name, const std::string& targetId)
|
||||||
{
|
{
|
||||||
MWBase::Environment::get().getScriptManager()->getGlobalScripts().addScript (name);
|
MWBase::Environment::get().getScriptManager()->getGlobalScripts().addScript (name, targetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterContext::stopScript (const std::string& name)
|
void InterpreterContext::stopScript (const std::string& name)
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace MWScript
|
||||||
|
|
||||||
virtual bool isScriptRunning (const std::string& name) const;
|
virtual bool isScriptRunning (const std::string& name) const;
|
||||||
|
|
||||||
virtual void startScript (const std::string& name);
|
virtual void startScript (const std::string& name, const std::string& targetId = "");
|
||||||
|
|
||||||
virtual void stopScript (const std::string& name);
|
virtual void stopScript (const std::string& name);
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ namespace Interpreter
|
||||||
|
|
||||||
virtual bool isScriptRunning (const std::string& name) const = 0;
|
virtual bool isScriptRunning (const std::string& name) const = 0;
|
||||||
|
|
||||||
virtual void startScript (const std::string& name) = 0;
|
virtual void startScript (const std::string& name, const std::string& targetId = "") = 0;
|
||||||
|
|
||||||
virtual void stopScript (const std::string& name) = 0;
|
virtual void stopScript (const std::string& name) = 0;
|
||||||
|
|
||||||
|
|
|
@ -133,5 +133,6 @@ op 67: store stack[0] in member float stack[2] of global script with ID stack[1]
|
||||||
op 68: replace stack[0] with member short stack[1] of global script with ID stack[0]
|
op 68: replace stack[0] with member short stack[1] of global script with ID stack[0]
|
||||||
op 69: replace stack[0] with member short stack[1] of global script with ID stack[0]
|
op 69: replace stack[0] with member short stack[1] of global script with ID stack[0]
|
||||||
op 70: replace stack[0] with member short stack[1] of global script with ID stack[0]
|
op 70: replace stack[0] with member short stack[1] of global script with ID stack[0]
|
||||||
opcodes 71-33554431 unused
|
op 71: explicit reference (target) = stack[0]; pop; start script stack[0] and pop
|
||||||
|
opcodes 72-33554431 unused
|
||||||
opcodes 33554432-67108863 reserved for extensions
|
opcodes 33554432-67108863 reserved for extensions
|
||||||
|
|
|
@ -113,6 +113,7 @@ namespace Interpreter
|
||||||
interpreter.installSegment5 (46, new OpScriptRunning);
|
interpreter.installSegment5 (46, new OpScriptRunning);
|
||||||
interpreter.installSegment5 (47, new OpStartScript);
|
interpreter.installSegment5 (47, new OpStartScript);
|
||||||
interpreter.installSegment5 (48, new OpStopScript);
|
interpreter.installSegment5 (48, new OpStopScript);
|
||||||
|
interpreter.installSegment5 (71, new OpStartScriptExplicit);
|
||||||
|
|
||||||
// spacial
|
// spacial
|
||||||
interpreter.installSegment5 (49, new OpGetDistance);
|
interpreter.installSegment5 (49, new OpGetDistance);
|
||||||
|
|
|
@ -30,6 +30,22 @@ namespace Interpreter
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class OpStartScriptExplicit : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
std::string targetId = runtime.getStringLiteral (runtime[0].mInteger);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
std::string name = runtime.getStringLiteral (runtime[0].mInteger);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
runtime.getContext().startScript (name, targetId);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class OpStopScript : public Opcode0
|
class OpStopScript : public Opcode0
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue