You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw-tes3mp/apps/openmw/mwscript/guiextensions.cpp

188 lines
6.5 KiB
C++

#include "guiextensions.hpp"
#include <boost/algorithm/string.hpp>
#include <components/compiler/extensions.hpp>
#include <components/compiler/opcodes.hpp>
#include <components/interpreter/interpreter.hpp>
#include <components/interpreter/runtime.hpp>
#include <components/interpreter/opcodes.hpp>
#include "../mwworld/esmstore.hpp"
#include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp"
#include "interpretercontext.hpp"
namespace MWScript
{
namespace Gui
{
class OpEnableWindow : public Interpreter::Opcode0
{
MWGui::GuiWindow mWindow;
public:
OpEnableWindow (MWGui::GuiWindow window) : mWindow (window) {}
virtual void execute (Interpreter::Runtime& runtime)
{
MWBase::Environment::get().getWindowManager()->allow (mWindow);
}
};
class OpEnableRest : public Interpreter::Opcode0
{
public:
virtual void execute (Interpreter::Runtime& runtime)
{
MWBase::Environment::get().getWindowManager()->enableRest();
}
};
class OpShowDialogue : public Interpreter::Opcode0
{
MWGui::GuiMode mDialogue;
public:
OpShowDialogue (MWGui::GuiMode dialogue)
: mDialogue (dialogue)
{}
virtual void execute (Interpreter::Runtime& runtime)
{
MWBase::Environment::get().getWindowManager()->pushGuiMode(mDialogue);
}
};
class OpGetButtonPressed : public Interpreter::Opcode0
{
public:
virtual void execute (Interpreter::Runtime& runtime)
{
runtime.push (MWBase::Environment::get().getWindowManager()->readPressedButton());
}
};
class OpToggleFogOfWar : public Interpreter::Opcode0
{
public:
virtual void execute (Interpreter::Runtime& runtime)
{
MWBase::Environment::get().getWindowManager()->toggleFogOfWar();
}
};
class OpToggleFullHelp : public Interpreter::Opcode0
{
public:
virtual void execute (Interpreter::Runtime& runtime)
{
MWBase::Environment::get().getWindowManager()->toggleFullHelp();
}
};
class OpShowMap : public Interpreter::Opcode0
{
public:
virtual void execute (Interpreter::Runtime& runtime)
{
std::string cell = (runtime.getStringLiteral (runtime[0].mInteger));
Misc::StringUtils::toLower(cell);
runtime.pop();
// "Will match complete or partial cells, so ShowMap, "Vivec" will show cells Vivec and Vivec, Fred's House as well."
// http://www.uesp.net/wiki/Tes3Mod:ShowMap
const MWWorld::Store<ESM::Cell> &cells =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Cell>();
MWWorld::Store<ESM::Cell>::iterator it = cells.extBegin();
for (; it != cells.extEnd(); ++it)
{
std::string name = it->mName;
Misc::StringUtils::toLower(name);
if (name.find(cell) != std::string::npos)
MWBase::Environment::get().getWindowManager()->addVisitedLocation (
it->mName,
it->getGridX(),
it->getGridY()
);
}
}
};
class OpFillMap : public Interpreter::Opcode0
{
public:
virtual void execute (Interpreter::Runtime& runtime)
{
const MWWorld::Store<ESM::Cell> &cells =
MWBase::Environment::get().getWorld ()->getStore().get<ESM::Cell>();
MWWorld::Store<ESM::Cell>::iterator it = cells.extBegin();
for (; it != cells.extEnd(); ++it)
{
std::string name = it->mName;
if (name != "")
MWBase::Environment::get().getWindowManager()->addVisitedLocation (
name,
it->getGridX(),
it->getGridY()
);
}
}
};
void installOpcodes (Interpreter::Interpreter& interpreter)
{
interpreter.installSegment5 (Compiler::Gui::opcodeEnableBirthMenu,
new OpShowDialogue (MWGui::GM_Birth));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableClassMenu,
new OpShowDialogue (MWGui::GM_Class));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableNameMenu,
new OpShowDialogue (MWGui::GM_Name));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableRaceMenu,
new OpShowDialogue (MWGui::GM_Race));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableStatsReviewMenu,
new OpShowDialogue (MWGui::GM_Review));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableInventoryMenu,
new OpEnableWindow (MWGui::GW_Inventory));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableMagicMenu,
new OpEnableWindow (MWGui::GW_Magic));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableMapMenu,
new OpEnableWindow (MWGui::GW_Map));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableStatsMenu,
new OpEnableWindow (MWGui::GW_Stats));
interpreter.installSegment5 (Compiler::Gui::opcodeEnableRest,
new OpEnableRest ());
interpreter.installSegment5 (Compiler::Gui::opcodeShowRestMenu,
new OpShowDialogue (MWGui::GM_RestBed));
interpreter.installSegment5 (Compiler::Gui::opcodeGetButtonPressed, new OpGetButtonPressed);
interpreter.installSegment5 (Compiler::Gui::opcodeToggleFogOfWar, new OpToggleFogOfWar);
interpreter.installSegment5 (Compiler::Gui::opcodeToggleFullHelp, new OpToggleFullHelp);
interpreter.installSegment5 (Compiler::Gui::opcodeShowMap, new OpShowMap);
interpreter.installSegment5 (Compiler::Gui::opcodeFillMap, new OpFillMap);
}
}
}