1 #include "controlswitch.hpp"
2 
3 #include <components/esm/esmwriter.hpp>
4 #include <components/esm/esmreader.hpp>
5 #include <components/esm/controlsstate.hpp>
6 
7 #include <components/loadinglistener/loadinglistener.hpp>
8 
9 #include "../mwbase/environment.hpp"
10 #include "../mwbase/world.hpp"
11 
12 #include "../mwworld/player.hpp"
13 
14 namespace MWInput
15 {
ControlSwitch()16     ControlSwitch::ControlSwitch()
17     {
18         clear();
19     }
20 
clear()21     void ControlSwitch::clear()
22     {
23         mSwitches["playercontrols"]      = true;
24         mSwitches["playerfighting"]      = true;
25         mSwitches["playerjumping"]       = true;
26         mSwitches["playerlooking"]       = true;
27         mSwitches["playermagic"]         = true;
28         mSwitches["playerviewswitch"]    = true;
29         mSwitches["vanitymode"]          = true;
30     }
31 
get(const std::string & key)32     bool ControlSwitch::get(const std::string& key)
33     {
34         return mSwitches[key];
35     }
36 
set(const std::string & key,bool value)37     void ControlSwitch::set(const std::string& key, bool value)
38     {
39         MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
40 
41         /// \note 7 switches at all, if-else is relevant
42         if (key == "playercontrols" && !value)
43         {
44             player.setLeftRight(0);
45             player.setForwardBackward(0);
46             player.setAutoMove(false);
47             player.setUpDown(0);
48         }
49         else if (key == "playerjumping" && !value)
50         {
51             /// \fixme maybe crouching at this time
52             player.setUpDown(0);
53         }
54         else if (key == "vanitymode")
55         {
56             MWBase::Environment::get().getWorld()->allowVanityMode(value);
57         }
58         else if (key == "playerlooking" && !value)
59         {
60             MWBase::Environment::get().getWorld()->rotateObject(player.getPlayer(), 0.f, 0.f, 0.f);
61         }
62         mSwitches[key] = value;
63     }
64 
write(ESM::ESMWriter & writer,Loading::Listener &)65     void ControlSwitch::write(ESM::ESMWriter& writer, Loading::Listener& /*progress*/)
66     {
67         ESM::ControlsState controls;
68         controls.mViewSwitchDisabled = !mSwitches["playerviewswitch"];
69         controls.mControlsDisabled = !mSwitches["playercontrols"];
70         controls.mJumpingDisabled = !mSwitches["playerjumping"];
71         controls.mLookingDisabled = !mSwitches["playerlooking"];
72         controls.mVanityModeDisabled = !mSwitches["vanitymode"];
73         controls.mWeaponDrawingDisabled = !mSwitches["playerfighting"];
74         controls.mSpellDrawingDisabled = !mSwitches["playermagic"];
75 
76         writer.startRecord (ESM::REC_INPU);
77         controls.save(writer);
78         writer.endRecord (ESM::REC_INPU);
79     }
80 
readRecord(ESM::ESMReader & reader,uint32_t type)81     void ControlSwitch::readRecord(ESM::ESMReader& reader, uint32_t type)
82     {
83         ESM::ControlsState controls;
84         controls.load(reader);
85 
86         set("playerviewswitch", !controls.mViewSwitchDisabled);
87         set("playercontrols", !controls.mControlsDisabled);
88         set("playerjumping", !controls.mJumpingDisabled);
89         set("playerlooking", !controls.mLookingDisabled);
90         set("vanitymode", !controls.mVanityModeDisabled);
91         set("playerfighting", !controls.mWeaponDrawingDisabled);
92         set("playermagic", !controls.mSpellDrawingDisabled);
93     }
94 
countSavedGameRecords() const95     int ControlSwitch::countSavedGameRecords() const
96     {
97         return 1;
98     }
99 }
100