forked from mirror/openmw-tes3mp
Save controls state (Fixes #3598)
This commit is contained in:
parent
5580123880
commit
301dd77efb
8 changed files with 153 additions and 2 deletions
|
@ -5,6 +5,19 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
namespace Loading
|
||||||
|
{
|
||||||
|
class Listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace ESM
|
||||||
|
{
|
||||||
|
class ESMReader;
|
||||||
|
class ESMWriter;
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWBase
|
namespace MWBase
|
||||||
{
|
{
|
||||||
/// \brief Interface for input manager (implemented in MWInput)
|
/// \brief Interface for input manager (implemented in MWInput)
|
||||||
|
@ -56,6 +69,10 @@ namespace MWBase
|
||||||
/// Returns if the last used input device was a joystick or a keyboard
|
/// Returns if the last used input device was a joystick or a keyboard
|
||||||
/// @return true if joystick, false otherwise
|
/// @return true if joystick, false otherwise
|
||||||
virtual bool joystickLastUsed() = 0;
|
virtual bool joystickLastUsed() = 0;
|
||||||
|
|
||||||
|
virtual int countSavedGameRecords() const = 0;
|
||||||
|
virtual void write(ESM::ESMWriter& writer, Loading::Listener& progress) = 0;
|
||||||
|
virtual void readRecord(ESM::ESMReader& reader, uint32_t type) = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
|
|
||||||
#include <components/sdlutil/sdlinputwrapper.hpp>
|
#include <components/sdlutil/sdlinputwrapper.hpp>
|
||||||
#include <components/sdlutil/sdlvideowrapper.hpp>
|
#include <components/sdlutil/sdlvideowrapper.hpp>
|
||||||
|
#include <components/esm/esmwriter.hpp>
|
||||||
|
#include <components/esm/esmreader.hpp>
|
||||||
|
#include <components/esm/controlsstate.hpp>
|
||||||
|
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
@ -1574,6 +1577,44 @@ namespace MWInput
|
||||||
mInputBinder->removeJoystickButtonBinding (mFakeDeviceID, mInputBinder->getJoystickButtonBinding (control, mFakeDeviceID, ICS::Control::INCREASE));
|
mInputBinder->removeJoystickButtonBinding (mFakeDeviceID, mInputBinder->getJoystickButtonBinding (control, mFakeDeviceID, ICS::Control::INCREASE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InputManager::countSavedGameRecords() const
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputManager::write(ESM::ESMWriter& writer, Loading::Listener& /*progress*/)
|
||||||
|
{
|
||||||
|
ESM::ControlsState controls;
|
||||||
|
controls.mViewSwitchDisabled = !getControlSwitch("playerviewswitch");
|
||||||
|
controls.mControlsDisabled = !getControlSwitch("playercontrols");
|
||||||
|
controls.mJumpingDisabled = !getControlSwitch("playerjumping");
|
||||||
|
controls.mLookingDisabled = !getControlSwitch("playerlooking");
|
||||||
|
controls.mVanityModeDisabled = !getControlSwitch("vanitymode");
|
||||||
|
controls.mWeaponDrawingDisabled = !getControlSwitch("playerfighting");
|
||||||
|
controls.mSpellDrawingDisabled = !getControlSwitch("playermagic");
|
||||||
|
|
||||||
|
writer.startRecord (ESM::REC_INPU);
|
||||||
|
controls.save(writer);
|
||||||
|
writer.endRecord (ESM::REC_INPU);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputManager::readRecord(ESM::ESMReader& reader, uint32_t type)
|
||||||
|
{
|
||||||
|
if (type == ESM::REC_INPU)
|
||||||
|
{
|
||||||
|
ESM::ControlsState controls;
|
||||||
|
controls.load(reader);
|
||||||
|
|
||||||
|
toggleControlSwitch("playerviewswitch", !controls.mViewSwitchDisabled);
|
||||||
|
toggleControlSwitch("playercontrols", !controls.mControlsDisabled);
|
||||||
|
toggleControlSwitch("playerjumping", !controls.mJumpingDisabled);
|
||||||
|
toggleControlSwitch("playerlooking", !controls.mLookingDisabled);
|
||||||
|
toggleControlSwitch("vanitymode", !controls.mVanityModeDisabled);
|
||||||
|
toggleControlSwitch("playerfighting", !controls.mWeaponDrawingDisabled);
|
||||||
|
toggleControlSwitch("playermagic", !controls.mSpellDrawingDisabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void InputManager::resetToDefaultKeyBindings()
|
void InputManager::resetToDefaultKeyBindings()
|
||||||
{
|
{
|
||||||
loadKeyDefaults(true);
|
loadKeyDefaults(true);
|
||||||
|
|
|
@ -149,6 +149,10 @@ namespace MWInput
|
||||||
void clearAllKeyBindings (ICS::Control* control);
|
void clearAllKeyBindings (ICS::Control* control);
|
||||||
void clearAllControllerBindings (ICS::Control* control);
|
void clearAllControllerBindings (ICS::Control* control);
|
||||||
|
|
||||||
|
virtual int countSavedGameRecords() const;
|
||||||
|
virtual void write(ESM::ESMWriter& writer, Loading::Listener& progress);
|
||||||
|
virtual void readRecord(ESM::ESMReader& reader, uint32_t type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDL_Window* mWindow;
|
SDL_Window* mWindow;
|
||||||
bool mWindowVisible;
|
bool mWindowVisible;
|
||||||
|
|
|
@ -249,7 +249,8 @@ void MWState::StateManager::saveGame (const std::string& description, const Slot
|
||||||
+MWBase::Environment::get().getScriptManager()->getGlobalScripts().countSavedGameRecords()
|
+MWBase::Environment::get().getScriptManager()->getGlobalScripts().countSavedGameRecords()
|
||||||
+MWBase::Environment::get().getDialogueManager()->countSavedGameRecords()
|
+MWBase::Environment::get().getDialogueManager()->countSavedGameRecords()
|
||||||
+MWBase::Environment::get().getWindowManager()->countSavedGameRecords()
|
+MWBase::Environment::get().getWindowManager()->countSavedGameRecords()
|
||||||
+MWBase::Environment::get().getMechanicsManager()->countSavedGameRecords();
|
+MWBase::Environment::get().getMechanicsManager()->countSavedGameRecords()
|
||||||
|
+MWBase::Environment::get().getInputManager()->countSavedGameRecords();
|
||||||
writer.setRecordCount (recordCount);
|
writer.setRecordCount (recordCount);
|
||||||
|
|
||||||
writer.save (stream);
|
writer.save (stream);
|
||||||
|
@ -271,6 +272,7 @@ void MWState::StateManager::saveGame (const std::string& description, const Slot
|
||||||
MWBase::Environment::get().getScriptManager()->getGlobalScripts().write (writer, listener);
|
MWBase::Environment::get().getScriptManager()->getGlobalScripts().write (writer, listener);
|
||||||
MWBase::Environment::get().getWindowManager()->write(writer, listener);
|
MWBase::Environment::get().getWindowManager()->write(writer, listener);
|
||||||
MWBase::Environment::get().getMechanicsManager()->write(writer, listener);
|
MWBase::Environment::get().getMechanicsManager()->write(writer, listener);
|
||||||
|
MWBase::Environment::get().getInputManager()->write(writer, listener);
|
||||||
|
|
||||||
// Ensure we have written the number of records that was estimated
|
// Ensure we have written the number of records that was estimated
|
||||||
if (writer.getRecordCount() != recordCount+1) // 1 extra for TES3 record
|
if (writer.getRecordCount() != recordCount+1) // 1 extra for TES3 record
|
||||||
|
@ -462,6 +464,10 @@ void MWState::StateManager::loadGame (const Character *character, const std::str
|
||||||
MWBase::Environment::get().getMechanicsManager()->readRecord(reader, n.intval);
|
MWBase::Environment::get().getMechanicsManager()->readRecord(reader, n.intval);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ESM::REC_INPU:
|
||||||
|
MWBase::Environment::get().getInputManager()->readRecord(reader, n.intval);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
// ignore invalid records
|
// ignore invalid records
|
||||||
|
|
|
@ -77,7 +77,7 @@ add_component_dir (esm
|
||||||
loadweap records aipackage effectlist spelllist variant variantimp loadtes3 cellref filter
|
loadweap records aipackage effectlist spelllist variant variantimp loadtes3 cellref filter
|
||||||
savedgame journalentry queststate locals globalscript player objectstate cellid cellstate globalmap inventorystate containerstate npcstate creaturestate dialoguestate statstate
|
savedgame journalentry queststate locals globalscript player objectstate cellid cellstate globalmap inventorystate containerstate npcstate creaturestate dialoguestate statstate
|
||||||
npcstats creaturestats weatherstate quickkeys fogstate spellstate activespells creaturelevliststate doorstate projectilestate debugprofile
|
npcstats creaturestats weatherstate quickkeys fogstate spellstate activespells creaturelevliststate doorstate projectilestate debugprofile
|
||||||
aisequence magiceffects util custommarkerstate stolenitems transport animationstate
|
aisequence magiceffects util custommarkerstate stolenitems transport animationstate controlsstate
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (esmterrain
|
add_component_dir (esmterrain
|
||||||
|
|
43
components/esm/controlsstate.cpp
Normal file
43
components/esm/controlsstate.cpp
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#include "controlsstate.hpp"
|
||||||
|
|
||||||
|
#include "esmreader.hpp"
|
||||||
|
#include "esmwriter.hpp"
|
||||||
|
|
||||||
|
ESM::ControlsState::ControlsState()
|
||||||
|
: mViewSwitchDisabled(false),
|
||||||
|
mControlsDisabled(false),
|
||||||
|
mJumpingDisabled(false),
|
||||||
|
mLookingDisabled(false),
|
||||||
|
mVanityModeDisabled(false),
|
||||||
|
mWeaponDrawingDisabled(false),
|
||||||
|
mSpellDrawingDisabled(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESM::ControlsState::load(ESM::ESMReader& esm)
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
esm.getHNT(flags, "CFLG");
|
||||||
|
|
||||||
|
mViewSwitchDisabled = flags & ViewSwitchDisabled;
|
||||||
|
mControlsDisabled = flags & ControlsDisabled;
|
||||||
|
mJumpingDisabled = flags & JumpingDisabled;
|
||||||
|
mLookingDisabled = flags & LookingDisabled;
|
||||||
|
mVanityModeDisabled = flags & VanityModeDisabled;
|
||||||
|
mWeaponDrawingDisabled = flags & WeaponDrawingDisabled;
|
||||||
|
mSpellDrawingDisabled = flags & SpellDrawingDisabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESM::ControlsState::save(ESM::ESMWriter& esm) const
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
if (mViewSwitchDisabled) flags |= ViewSwitchDisabled;
|
||||||
|
if (mControlsDisabled) flags |= ControlsDisabled;
|
||||||
|
if (mJumpingDisabled) flags |= JumpingDisabled;
|
||||||
|
if (mLookingDisabled) flags |= LookingDisabled;
|
||||||
|
if (mVanityModeDisabled) flags |= VanityModeDisabled;
|
||||||
|
if (mWeaponDrawingDisabled) flags |= WeaponDrawingDisabled;
|
||||||
|
if (mSpellDrawingDisabled) flags |= SpellDrawingDisabled;
|
||||||
|
|
||||||
|
esm.writeHNT("CFLG", flags);
|
||||||
|
}
|
39
components/esm/controlsstate.hpp
Normal file
39
components/esm/controlsstate.hpp
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#ifndef OPENMW_ESM_CONTROLSSTATE_H
|
||||||
|
#define OPENMW_ESM_CONTROLSSTATE_H
|
||||||
|
|
||||||
|
namespace ESM
|
||||||
|
{
|
||||||
|
class ESMReader;
|
||||||
|
class ESMWriter;
|
||||||
|
|
||||||
|
// format 0, saved games only
|
||||||
|
|
||||||
|
struct ControlsState
|
||||||
|
{
|
||||||
|
ControlsState();
|
||||||
|
|
||||||
|
enum Flags
|
||||||
|
{
|
||||||
|
ViewSwitchDisabled = 0x1,
|
||||||
|
ControlsDisabled = 0x4,
|
||||||
|
JumpingDisabled = 0x1000,
|
||||||
|
LookingDisabled = 0x2000,
|
||||||
|
VanityModeDisabled = 0x4000,
|
||||||
|
WeaponDrawingDisabled = 0x8000,
|
||||||
|
SpellDrawingDisabled = 0x10000
|
||||||
|
};
|
||||||
|
|
||||||
|
bool mViewSwitchDisabled;
|
||||||
|
bool mControlsDisabled;
|
||||||
|
bool mJumpingDisabled;
|
||||||
|
bool mLookingDisabled;
|
||||||
|
bool mVanityModeDisabled;
|
||||||
|
bool mWeaponDrawingDisabled;
|
||||||
|
bool mSpellDrawingDisabled;
|
||||||
|
|
||||||
|
void load (ESMReader &esm);
|
||||||
|
void save (ESMWriter &esm) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -127,6 +127,7 @@ enum RecNameInts
|
||||||
REC_ENAB = FourCC<'E','N','A','B'>::value,
|
REC_ENAB = FourCC<'E','N','A','B'>::value,
|
||||||
REC_CAM_ = FourCC<'C','A','M','_'>::value,
|
REC_CAM_ = FourCC<'C','A','M','_'>::value,
|
||||||
REC_STLN = FourCC<'S','T','L','N'>::value,
|
REC_STLN = FourCC<'S','T','L','N'>::value,
|
||||||
|
REC_INPU = FourCC<'I','N','P','U'>::value,
|
||||||
|
|
||||||
// format 1
|
// format 1
|
||||||
REC_FILT = FourCC<'F','I','L','T'>::value,
|
REC_FILT = FourCC<'F','I','L','T'>::value,
|
||||||
|
|
Loading…
Reference in a new issue