mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-30 05:45:34 +00:00
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 <vector>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace Loading
|
||||
{
|
||||
class Listener;
|
||||
}
|
||||
|
||||
namespace ESM
|
||||
{
|
||||
class ESMReader;
|
||||
class ESMWriter;
|
||||
}
|
||||
|
||||
namespace MWBase
|
||||
{
|
||||
/// \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
|
||||
/// @return true if joystick, false otherwise
|
||||
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/sdlvideowrapper.hpp>
|
||||
#include <components/esm/esmwriter.hpp>
|
||||
#include <components/esm/esmreader.hpp>
|
||||
#include <components/esm/controlsstate.hpp>
|
||||
|
||||
#include "../mwbase/world.hpp"
|
||||
#include "../mwbase/windowmanager.hpp"
|
||||
|
@ -1574,6 +1577,44 @@ namespace MWInput
|
|||
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()
|
||||
{
|
||||
loadKeyDefaults(true);
|
||||
|
|
|
@ -149,6 +149,10 @@ namespace MWInput
|
|||
void clearAllKeyBindings (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:
|
||||
SDL_Window* mWindow;
|
||||
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().getDialogueManager()->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.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().getWindowManager()->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
|
||||
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);
|
||||
break;
|
||||
|
||||
case ESM::REC_INPU:
|
||||
MWBase::Environment::get().getInputManager()->readRecord(reader, n.intval);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
// ignore invalid records
|
||||
|
|
|
@ -77,7 +77,7 @@ add_component_dir (esm
|
|||
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
|
||||
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
|
||||
|
|
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_CAM_ = FourCC<'C','A','M','_'>::value,
|
||||
REC_STLN = FourCC<'S','T','L','N'>::value,
|
||||
REC_INPU = FourCC<'I','N','P','U'>::value,
|
||||
|
||||
// format 1
|
||||
REC_FILT = FourCC<'F','I','L','T'>::value,
|
||||
|
|
Loading…
Reference in a new issue