mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 03:40:14 +00:00
make MenuMode, Random, GetSecondsPassed regular functions
This commit is contained in:
parent
f0e2ee45fa
commit
3875b837bc
@ -192,11 +192,6 @@ namespace MWScript
|
||||
{
|
||||
}
|
||||
|
||||
bool InterpreterContext::menuMode()
|
||||
{
|
||||
return MWBase::Environment::get().getWindowManager()->isGuiMode();
|
||||
}
|
||||
|
||||
int InterpreterContext::getGlobalShort (const std::string& name) const
|
||||
{
|
||||
return MWBase::Environment::get().getWorld()->getGlobalInt (name);
|
||||
@ -425,11 +420,6 @@ namespace MWScript
|
||||
}
|
||||
}
|
||||
|
||||
float InterpreterContext::getSecondsPassed() const
|
||||
{
|
||||
return MWBase::Environment::get().getFrameDuration();
|
||||
}
|
||||
|
||||
int InterpreterContext::getMemberShort (const std::string& id, const std::string& name,
|
||||
bool global) const
|
||||
{
|
||||
|
@ -77,8 +77,6 @@ namespace MWScript
|
||||
virtual void report (const std::string& message);
|
||||
///< By default, do nothing.
|
||||
|
||||
virtual bool menuMode();
|
||||
|
||||
virtual int getGlobalShort (const std::string& name) const;
|
||||
|
||||
virtual int getGlobalLong (const std::string& name) const;
|
||||
@ -124,8 +122,6 @@ namespace MWScript
|
||||
void executeActivation(MWWorld::Ptr ptr, MWWorld::Ptr actor);
|
||||
///< Execute the activation action for this ptr. If ptr is mActivated, mark activation as handled.
|
||||
|
||||
virtual float getSecondsPassed() const;
|
||||
|
||||
virtual int getMemberShort (const std::string& id, const std::string& name, bool global) const;
|
||||
|
||||
virtual int getMemberLong (const std::string& id, const std::string& name, bool global) const;
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <components/interpreter/runtime.hpp>
|
||||
#include <components/interpreter/opcodes.hpp>
|
||||
|
||||
#include <components/misc/rng.hpp>
|
||||
|
||||
#include <components/esm/loadmgef.hpp>
|
||||
#include <components/esm/loadcrea.hpp>
|
||||
|
||||
@ -78,6 +80,33 @@ namespace MWScript
|
||||
{
|
||||
namespace Misc
|
||||
{
|
||||
class OpMenuMode : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
runtime.push (MWBase::Environment::get().getWindowManager()->isGuiMode());
|
||||
}
|
||||
};
|
||||
|
||||
class OpRandom : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
Interpreter::Type_Integer limit = runtime[0].mInteger;
|
||||
runtime.pop();
|
||||
|
||||
if (limit<0)
|
||||
throw std::runtime_error (
|
||||
"random: argument out of range (Don't be so negative!)");
|
||||
|
||||
runtime.push (static_cast<Interpreter::Type_Float>(::Misc::Rng::rollDice(limit))); // [o, limit)
|
||||
}
|
||||
};
|
||||
|
||||
template<class R>
|
||||
class OpStartScript : public Interpreter::Opcode0
|
||||
{
|
||||
@ -116,6 +145,16 @@ namespace MWScript
|
||||
}
|
||||
};
|
||||
|
||||
class OpGetSecondsPassed : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
runtime.push (MWBase::Environment::get().getFrameDuration());
|
||||
}
|
||||
};
|
||||
|
||||
template<class R>
|
||||
class OpEnable : public Interpreter::Opcode0
|
||||
{
|
||||
@ -1530,10 +1569,13 @@ namespace MWScript
|
||||
|
||||
void installOpcodes (Interpreter::Interpreter& interpreter)
|
||||
{
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeMenuMode, new OpMenuMode);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeRandom, new OpRandom);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeScriptRunning, new OpScriptRunning);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeStartScript, new OpStartScript<ImplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeStartScriptExplicit, new OpStartScript<ExplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeStopScript, new OpStopScript);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeGetSecondsPassed, new OpGetSecondsPassed);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeEnable, new OpEnable<ImplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeEnableExplicit, new OpEnable<ExplicitRef>);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeDisable, new OpDisable<ImplicitRef>);
|
||||
|
@ -434,43 +434,6 @@ namespace Compiler
|
||||
mNextOperand = false;
|
||||
return true;
|
||||
}
|
||||
else if (keyword==Scanner::K_menumode)
|
||||
{
|
||||
start();
|
||||
|
||||
mTokenLoc = loc;
|
||||
|
||||
Generator::menuMode (mCode);
|
||||
mOperands.push_back ('l');
|
||||
|
||||
mNextOperand = false;
|
||||
return true;
|
||||
}
|
||||
else if (keyword==Scanner::K_random)
|
||||
{
|
||||
start();
|
||||
|
||||
mTokenLoc = loc;
|
||||
parseArguments ("l", scanner);
|
||||
|
||||
Generator::random (mCode);
|
||||
mOperands.push_back ('f');
|
||||
|
||||
mNextOperand = false;
|
||||
return true;
|
||||
}
|
||||
else if (keyword==Scanner::K_getsecondspassed)
|
||||
{
|
||||
start();
|
||||
|
||||
mTokenLoc = loc;
|
||||
|
||||
Generator::getSecondsPassed (mCode);
|
||||
mOperands.push_back ('f');
|
||||
|
||||
mNextOperand = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// check for custom extensions
|
||||
|
@ -241,9 +241,12 @@ namespace Compiler
|
||||
{
|
||||
void registerExtensions (Extensions& extensions)
|
||||
{
|
||||
extensions.registerFunction ("menumode", 'l', "", opcodeMenuMode);
|
||||
extensions.registerFunction ("random", 'f', "l", opcodeRandom);
|
||||
extensions.registerFunction ("scriptrunning", 'l', "c", opcodeScriptRunning);
|
||||
extensions.registerInstruction ("startscript", "c", opcodeStartScript, opcodeStartScriptExplicit);
|
||||
extensions.registerInstruction ("stopscript", "c", opcodeStopScript);
|
||||
extensions.registerFunction ("getsecondspassed", 'f', "", opcodeGetSecondsPassed);
|
||||
extensions.registerInstruction ("enable", "", opcodeEnable, opcodeEnableExplicit);
|
||||
extensions.registerInstruction ("disable", "", opcodeDisable, opcodeDisableExplicit);
|
||||
extensions.registerFunction ("getdisabled", 'l', "x", opcodeGetDisabled, opcodeGetDisabledExplicit);
|
||||
|
@ -222,11 +222,6 @@ namespace
|
||||
code.push_back (Compiler::Generator::segment5 (37));
|
||||
}
|
||||
|
||||
void opMenuMode (Compiler::Generator::CodeContainer& code)
|
||||
{
|
||||
code.push_back (Compiler::Generator::segment5 (38));
|
||||
}
|
||||
|
||||
void opStoreGlobalShort (Compiler::Generator::CodeContainer& code)
|
||||
{
|
||||
code.push_back (Compiler::Generator::segment5 (39));
|
||||
@ -286,16 +281,6 @@ namespace
|
||||
{
|
||||
code.push_back (Compiler::Generator::segment5 (global ? 70 : 64));
|
||||
}
|
||||
|
||||
void opRandom (Compiler::Generator::CodeContainer& code)
|
||||
{
|
||||
code.push_back (Compiler::Generator::segment5 (45));
|
||||
}
|
||||
|
||||
void opGetSecondsPassed (Compiler::Generator::CodeContainer& code)
|
||||
{
|
||||
code.push_back (Compiler::Generator::segment5 (50));
|
||||
}
|
||||
}
|
||||
|
||||
namespace Compiler
|
||||
@ -590,11 +575,6 @@ namespace Compiler
|
||||
}
|
||||
}
|
||||
|
||||
void menuMode (CodeContainer& code)
|
||||
{
|
||||
opMenuMode (code);
|
||||
}
|
||||
|
||||
void assignToGlobal (CodeContainer& code, Literals& literals, char localType,
|
||||
const std::string& name, const CodeContainer& value, char valueType)
|
||||
{
|
||||
@ -751,15 +731,5 @@ namespace Compiler
|
||||
assert (0);
|
||||
}
|
||||
}
|
||||
|
||||
void random (CodeContainer& code)
|
||||
{
|
||||
opRandom (code);
|
||||
}
|
||||
|
||||
void getSecondsPassed (CodeContainer& code)
|
||||
{
|
||||
opGetSecondsPassed (code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,8 +91,6 @@ namespace Compiler
|
||||
|
||||
void compare (CodeContainer& code, char op, char valueType1, char valueType2);
|
||||
|
||||
void menuMode (CodeContainer& code);
|
||||
|
||||
void assignToGlobal (CodeContainer& code, Literals& literals, char localType,
|
||||
const std::string& name, const CodeContainer& value, char valueType);
|
||||
|
||||
@ -106,10 +104,6 @@ namespace Compiler
|
||||
void fetchMember (CodeContainer& code, Literals& literals, char memberType,
|
||||
const std::string& name, const std::string& id, bool global);
|
||||
///< \param global Member of a global script instead of a script of a reference.
|
||||
|
||||
void random (CodeContainer& code);
|
||||
|
||||
void getSecondsPassed (CodeContainer& code);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -433,18 +433,6 @@ namespace Compiler
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mAllowExpression)
|
||||
{
|
||||
if (keyword==Scanner::K_getsquareroot || keyword==Scanner::K_menumode ||
|
||||
keyword==Scanner::K_random || keyword==Scanner::K_getsecondspassed)
|
||||
{
|
||||
scanner.putbackKeyword (keyword, loc);
|
||||
parseExpression (scanner, loc);
|
||||
mState = EndState;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return Parser::parseKeyword (keyword, loc, scanner);
|
||||
}
|
||||
|
||||
|
@ -201,9 +201,12 @@ namespace Compiler
|
||||
|
||||
namespace Misc
|
||||
{
|
||||
const int opcodeMenuMode = 38;
|
||||
const int opcodeRandom = 45;
|
||||
const int opcodeScriptRunning = 46;
|
||||
const int opcodeStartScript = 47;
|
||||
const int opcodeStopScript = 48;
|
||||
const int opcodeGetSecondsPassed = 50;
|
||||
const int opcodeEnable = 51;
|
||||
const int opcodeDisable = 52;
|
||||
const int opcodeGetDisabled = 53;
|
||||
|
@ -266,9 +266,6 @@ namespace Compiler
|
||||
"messagebox",
|
||||
"set", "to",
|
||||
"getsquareroot",
|
||||
"menumode",
|
||||
"random",
|
||||
"getsecondspassed",
|
||||
0
|
||||
};
|
||||
|
||||
|
@ -208,10 +208,7 @@ namespace Compiler
|
||||
K_return,
|
||||
K_messagebox,
|
||||
K_set, K_to,
|
||||
K_getsquareroot,
|
||||
K_menumode,
|
||||
K_random,
|
||||
K_getsecondspassed
|
||||
K_getsquareroot
|
||||
};
|
||||
|
||||
enum special
|
||||
|
@ -63,9 +63,7 @@ namespace Compiler
|
||||
keyword==Scanner::K_elseif || keyword==Scanner::K_while ||
|
||||
keyword==Scanner::K_endwhile || keyword==Scanner::K_return ||
|
||||
keyword==Scanner::K_messagebox || keyword==Scanner::K_set ||
|
||||
keyword==Scanner::K_to || keyword==Scanner::K_getsquareroot ||
|
||||
keyword==Scanner::K_menumode || keyword==Scanner::K_random ||
|
||||
keyword==Scanner::K_getsecondspassed)
|
||||
keyword==Scanner::K_to || keyword==Scanner::K_getsquareroot)
|
||||
{
|
||||
return parseName (loc.mLiteral, loc, scanner);
|
||||
}
|
||||
|
@ -35,8 +35,6 @@ namespace Interpreter
|
||||
|
||||
virtual void report (const std::string& message) = 0;
|
||||
|
||||
virtual bool menuMode() = 0;
|
||||
|
||||
virtual int getGlobalShort (const std::string& name) const = 0;
|
||||
|
||||
virtual int getGlobalLong (const std::string& name) const = 0;
|
||||
@ -79,8 +77,6 @@ namespace Interpreter
|
||||
|
||||
virtual std::string getCurrentCellName() const = 0;
|
||||
|
||||
virtual float getSecondsPassed() const = 0;
|
||||
|
||||
virtual int getMemberShort (const std::string& id, const std::string& name, bool global) const = 0;
|
||||
|
||||
virtual int getMemberLong (const std::string& id, const std::string& name, bool global) const = 0;
|
||||
|
@ -95,9 +95,6 @@ namespace Interpreter
|
||||
|
||||
// misc
|
||||
interpreter.installSegment3 (0, new OpMessageBox);
|
||||
interpreter.installSegment5 (38, new OpMenuMode);
|
||||
interpreter.installSegment5 (45, new OpRandom);
|
||||
interpreter.installSegment5 (50, new OpGetSecondsPassed);
|
||||
interpreter.installSegment5 (58, new OpReport);
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include "runtime.hpp"
|
||||
#include "defines.hpp"
|
||||
|
||||
#include <components/misc/rng.hpp>
|
||||
#include <components/misc/messageformatparser.hpp>
|
||||
|
||||
namespace Interpreter
|
||||
@ -168,44 +167,6 @@ namespace Interpreter
|
||||
}
|
||||
};
|
||||
|
||||
class OpMenuMode : public Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Runtime& runtime)
|
||||
{
|
||||
runtime.push (runtime.getContext().menuMode());
|
||||
}
|
||||
};
|
||||
|
||||
class OpRandom : public Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Runtime& runtime)
|
||||
{
|
||||
Type_Integer limit = runtime[0].mInteger;
|
||||
|
||||
if (limit<0)
|
||||
throw std::runtime_error (
|
||||
"random: argument out of range (Don't be so negative!)");
|
||||
|
||||
runtime[0].mFloat = static_cast<Type_Float>(Misc::Rng::rollDice(limit)); // [o, limit)
|
||||
}
|
||||
};
|
||||
|
||||
class OpGetSecondsPassed : public Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Runtime& runtime)
|
||||
{
|
||||
Type_Float duration = runtime.getContext().getSecondsPassed();
|
||||
|
||||
runtime.push (duration);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user