OpenClonk
C4PlayerControl.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2005-2009, RedWolf Design GmbH, http://www.clonk.de/
5  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
6  *
7  * Distributed under the terms of the ISC license; see accompanying file
8  * "COPYING" for details.
9  *
10  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
11  * See accompanying file "TRADEMARK" for details.
12  *
13  * To redistribute this file separately, substitute the full license texts
14  * for the above references.
15  */
16 // Input to player control mapping
17 
18 #ifndef INC_C4PlayerControl
19 #define INC_C4PlayerControl
20 
21 #include "gui/C4KeyboardInput.h"
23 #include "object/C4Id.h"
25 
26 const float C4GFX_ZoomStep = 1.1040895f;
27 
28 // one control definition, e.g. "Left", "Throw", etc.
30 {
31 public:
32  enum CoordinateSpace // coordinate space for mouse position
33  {
34  COS_Game = 0, // game (landscape) coordinates
35  COS_Viewport = 1 // viewport (GUI) coordinates
36  };
37  enum Actions //action to be performed when control is triggered
38  {
39  CDA_None = 0, // do nothing
40  CDA_Script, // default: Script callback
41  CDA_Menu, // open player menu (async)
43  CDA_ObjectMenuTextComplete, // object menu fast-foward through text animation (async)
45  CDA_ZoomIn, CDA_ZoomOut // player viewport control (async)
46  };
47 
48 private:
49  StdCopyStrBuf sIdentifier; // name as seen in script and config
50  StdCopyStrBuf sGUIName; // name as displayed to player
51  StdCopyStrBuf sGUIDesc; // key description displayed to player in config dialog
52  bool fGlobal{false}; // if true, control can be bound to the global player only
53  bool fIsHoldKey{false}; // if true, the control can be in down and up state
54  bool fDefaultDisabled{false}; // if true, the control is disabled by default and needs to be enabled by script
55  bool fSendCursorPos{false}; // if true, x/y parameters will be set by current GUI mouse cursor pos (or GetCursor()-GUI coordinate pos for gamepad)
56  int32_t iRepeatDelay; // if >0, the key will generate successive events when held down
57  int32_t iInitialRepeatDelay; // delay after which KeyRepeat will be enabled
58  C4ID idControlExtraData; // extra data to be passed to script function
59  CoordinateSpace eCoordSpace{COS_Game}; // coordinate space to be used for mouse coordinates when control is triggered by mouse
60  Actions eAction{CDA_Script};
61 
62 public:
64  idControlExtraData(C4ID::None)
65  {}
66  ~C4PlayerControlDef() = default;
67 
68  void CompileFunc(StdCompiler *pComp);
69 
70  const char *GetIdentifier() const { return sIdentifier.getData(); }
71  const char *GetGUIName() const { return sGUIName.getData(); }
72  const char *GetGUIDesc() const { return sGUIDesc.getData(); }
73  Actions GetAction() const { return eAction; }
74  bool IsHoldKey() const { return fIsHoldKey; }
75  C4ID GetExtraData() const { return idControlExtraData; }
76  bool IsGlobal() const { return fGlobal; }
77  int32_t GetRepeatDelay() const { return iRepeatDelay; }
78  int32_t GetInitialRepeatDelay() const { return iInitialRepeatDelay; }
79  bool IsDefaultDisabled() const { return fDefaultDisabled; }
80  CoordinateSpace GetCoordinateSpace() const { return eCoordSpace; }
81  bool IsSendCursorPos() const { return fSendCursorPos; }
82 
83  bool operator ==(const C4PlayerControlDef &cmp) const;
84 
85  bool Execute(bool fUp, const C4KeyEventData &rKeyExtraData); // key was triggered - execute and return if handled
86  bool IsSyncObjectMenuControl() const { return eAction>=CDA_ObjectMenuOK && eAction<=CDA_ObjectMenuDown; }
87  bool IsAsync() const { return eAction != CDA_None && eAction != CDA_Script && !IsSyncObjectMenuControl(); } // true if to be executed directly when triggered
88  bool IsSync() const { return eAction == CDA_Script || IsSyncObjectMenuControl(); } // true if to be executed via control queue
89  bool IsValid() const { return eAction != CDA_None; }
90 };
91 
92 // CON_* constants are indices into the C4PlayerControlDefs list
93 enum { CON_None = -1 }; // No/undefined control
94 
95 // list of all known player control definitions
97 {
98 private:
99  typedef std::vector<C4PlayerControlDef> DefVecImpl;
100  DefVecImpl Defs;
101  bool clear_previous{false}; // if set is merged, all previous control defs are cleared - use
102 
103 public:
105  {
107  CInternalCons() = default;
109 
110  void UpdateInternalCons();
111 
112 public:
113  C4PlayerControlDefs() = default;
114  ~C4PlayerControlDefs() = default;
115  void Clear();
116 
117  void CompileFunc(StdCompiler *pComp);
118  void MergeFrom(const C4PlayerControlDefs &Src); // copy all defs from source file; overwrite defs of same name if found
119 
120  void FinalInit(); // after all defs have been loaded: register script constants
121 
122  const C4PlayerControlDef *GetControlByIndex(int32_t idx) const;
123  int32_t GetControlIndexByIdentifier(const char *szIdentifier) const; // return CON_None for not found
124  size_t GetCount() const { return Defs.size(); }
125 
126  bool operator ==(const C4PlayerControlDefs &cmp) const { return Defs == cmp.Defs && clear_previous == cmp.clear_previous; }
127 };
128 
130 {
134  bool operator ==(const C4KeyCodeEx &cmp) { return pressed_key==cmp; } // comparison op for finding items in lists: Search for the pressed key only
135 };
136 
137 typedef std::list<C4PlayerControlRecentKey> C4PlayerControlRecentKeyList;
138 
139 typedef std::vector<C4KeyCodeEx> C4KeyCodeExVec;
140 
141 // a key/mouse/gamepad assignment to a PlayerControlDef
143 {
144 public:
145  // action to be performed on the control upon this key
147  {
148  CTM_Default = 0, // standard behaviour: The control will be triggered
149  CTM_Hold = 1 << 0, // the control will be put into "down"-mode
150  CTM_Release = 1 << 1, // the hold mode of the control will be released
151  CTM_AlwaysUnhandled = 1 << 2, // the key will not block handling of other keys even if it got handled
152  CTM_HandleDownStatesOnly = 1 << 3, // used when an already handled release key is processed to reset down states of overridden keys only
153  CTM_ClearRecentKeys = 1 << 4 // if this assignment is triggered, RecentKeys are reset so no more combos can be generated
154  };
155 
156 private:
157  // KeyCombo list:
158  // if size()>1, the control is triggered only if this combo is fulfilled
159  // used for simultanuous keypresses or sequences
160  struct KeyComboItem
161  {
162  C4KeyCodeEx Key;
163  StdCopyStrBuf sKeyName;
164  void CompileFunc(StdCompiler *pComp);
165  void UpdateKeyName();
166  bool operator ==(const KeyComboItem &cmp) const { return Key==cmp.Key; }
167  };
168  typedef std::vector<KeyComboItem> KeyComboVec;
169  KeyComboVec KeyCombo;
170  bool fComboIsSequence; // if true, the keys must be pressed in sequence. Otherwise, they must be pressed simultanuously
171 
172  // trigger key: key/mouse/gamepad event triggering this assignment. For combinations, the last key of the combo.
173  C4KeyCodeEx TriggerKey;
174 
175  StdCopyStrBuf sControlName; // name of the control to be executed on this key
176  StdCopyStrBuf sGUIName; // name as displayed to player. If empty, name stored in control def should be used.
177  StdCopyStrBuf sGUIDesc; // key description displayed to player in config dialog. If empty, name stored in control def should be used.
178  bool fGUIDisabled; // whether this key can't be reassigned through the GUI dialogue
179  bool fOverrideAssignments{false}; // override all other assignments to the same key?
180  bool is_inherited{false}; // set for assignments that were copied from a parent set without modification
181  bool fRefsResolved{false}; // set to true after sControlName and sKeyNames have been resolved to runtime values
182  int32_t iGUIGroup{0}; // in which this control is grouped in the gui
183  int32_t iControl{CON_None}; // the control to be executed on this key, i.e. the resolved sControlName
184  int32_t iPriority{0}; // higher priority assignments get handled first
185  int32_t iTriggerMode{CTM_Default};
186 
187  const C4PlayerControlAssignment *inherited_assignment{nullptr}; // valid for assignments that were copied from a parent: source assignment
188 
189 public:
191  TriggerKey()
192  {}
194 
195  void CompileFunc(StdCompiler *pComp);
196  void CopyKeyFrom(const C4PlayerControlAssignment &src_assignment);
197  bool ResolveRefs(class C4PlayerControlAssignmentSet *pParentSet, C4PlayerControlDefs *pControlDefs); // resolve references between assignments
198  bool IsComboMatched(const C4PlayerControlRecentKeyList &DownKeys, const C4PlayerControlRecentKeyList &RecentKeys) const; // check if combo is currently fulfilled (assuming TriggerKey is already matched)
199  void SetInherited(bool to_val) { is_inherited = to_val; }
200  void SetInheritedAssignment(const C4PlayerControlAssignment *to_val) { inherited_assignment = to_val; }
201  void ResetKeyToInherited();
202  bool IsKeyChanged() const;
203  void SetControlName(const char *control_name) { sControlName.Copy(control_name); }
204  void SetKey(const C4KeyCodeEx &key);
205 
206  bool operator ==(const C4PlayerControlAssignment &cmp) const; // doesn't compare resolved TriggerKey/iControl
207  bool operator <(const C4PlayerControlAssignment &cmp) const { return iPriority > cmp.iPriority; } // assignments are processed in DESCENDING priority!
208  const char *GetControlName() const { return sControlName.getData(); }
209  int32_t GetControl() const { return iControl; }
210  const char *GetGUIName(const C4PlayerControlDefs &defs) const;
211  const char *GetGUIDesc(const C4PlayerControlDefs &defs) const;
212  bool IsGUIDisabled() const;
213  int32_t GetGUIGroup() const;
214  bool IsRefsResolved() const { return fRefsResolved; }
215  void ResetRefsResolved() { fRefsResolved = false; } // Mark references to other assignments as not resolved
216  bool IsAlwaysUnhandled() const { return !!(iTriggerMode & CTM_AlwaysUnhandled); }
217  int32_t GetTriggerMode() const { return iTriggerMode; }
218  const C4KeyCodeEx &GetTriggerKey() const { return TriggerKey; }
219  bool HasCombo() const { return KeyCombo.size()>1; }
220  bool IsOverrideAssignments() const { return fOverrideAssignments; }
221  bool IsInherited() const { return is_inherited; }
222  const C4PlayerControlAssignment *GetInheritedAssignment() const { return inherited_assignment; }
223  StdStrBuf GetKeysAsString(bool human_readable, bool short_name) const;
224 };
225 
226 typedef std::vector<C4PlayerControlAssignment> C4PlayerControlAssignmentVec;
227 typedef std::vector<const C4PlayerControlAssignment *> C4PlayerControlAssignmentPVec;
228 
229 
230 // a set of key/mouse/gamepad assignments to all controls
232 {
233 private:
234  StdCopyStrBuf sName, sGUIName, sParentSetName;
235  C4PlayerControlAssignmentVec Assignments; // ordered by priority
236 
237  bool has_keyboard{true};
238  bool has_mouse{true};
239  bool has_gamepad{false};
240 
241 public:
244  void InitEmptyFromTemplate(const C4PlayerControlAssignmentSet &template_set); // copy all fields except assignments
245 
246  void CompileFunc(StdCompiler *pComp);
247  bool ResolveRefs(C4PlayerControlDefs *pControlDefs); // resolve references between assignments
248  void SortAssignments();
249 
251 
252  void MergeFrom(const C4PlayerControlAssignmentSet &Src, MergeMode merge_mode); // take over all assignments defined in Src
253  C4PlayerControlAssignment *CreateAssignmentForControl(const char *control_name);
254  void RemoveAssignmentByControlName(const char *control_name);
255 
256  const char *GetName() const { return sName.getData(); }
257  const char *GetGUIName() const { return sGUIName.getData(); }
258  bool IsWildcardName() const { return IsWildcardString(sName.getData()); }
259 
260  C4PlayerControlAssignment *GetAssignmentByIndex(int32_t index); // assignments are ordered by priority
261  C4PlayerControlAssignment *GetAssignmentByControlName(const char *szControlName);
263  void GetAssignmentsByKey(const C4PlayerControlDefs &rDefs, const C4KeyCodeEx &key, bool fHoldKeysOnly, C4PlayerControlAssignmentPVec *pOutVec, const C4PlayerControlRecentKeyList &DownKeys, const C4PlayerControlRecentKeyList &RecentKeys) const; // match only by TriggerKey (last key of Combo) if fHoldKeysOnly
264  void GetTriggerKeys(const C4PlayerControlDefs &rDefs, C4KeyCodeExVec *pRegularKeys, C4KeyCodeExVec *pHoldKeys) const; // put all trigger keys of keyset into output vectors
265 
266  bool operator ==(const C4PlayerControlAssignmentSet &cmp) const;
267 
268  C4Facet GetPicture() const; // get image to be drawn to represent this control set
269  // todo
270  bool HasKeyboard() const { return has_keyboard; }
271  bool HasMouse() const { return has_mouse; }
272  bool HasGamepad() const { return has_gamepad; }
273  int32_t GetLayoutOrder() const { return 0; } // returns position on keyboard (increasing from left to right) for viewport sorting
274  bool IsMouseControlAssigned(int32_t mouseevent) const;
275 };
276 
277 // list of C4PlayerControlAssignmentSet
279 {
280 private:
281  typedef std::list<C4PlayerControlAssignmentSet> AssignmentSetList;
282  AssignmentSetList Sets;
283  bool clear_previous{false};
284 
285 public:
288  void Clear();
289 
290  void CompileFunc(StdCompiler *pComp);
291  bool operator ==(const C4PlayerControlAssignmentSets &cmp) const;
292  bool ResolveRefs(C4PlayerControlDefs *pControlDefs); // resolve references between assignments
293  void SortAssignments();
294 
295  void MergeFrom(const C4PlayerControlAssignmentSets &Src, C4PlayerControlAssignmentSet::MergeMode merge_mode); // take over all assignments in known sets and new sets defined in Src
296 
298  void RemoveSetByName(const char *set_name);
299 
300  C4PlayerControlAssignmentSet *GetSetByName(const char *szName);
302  int32_t GetSetIndex(const C4PlayerControlAssignmentSet *set) const;
304  size_t GetSetCount() const { return Sets.size(); }
305 };
306 
307 // contents of one PlayerControls.txt file
309 {
310 private:
311  C4PlayerControlDefs ControlDefs;
312  C4PlayerControlAssignmentSets AssignmentSets;
313 public:
314  void Clear();
315  void CompileFunc(StdCompiler *pComp);
316  bool Load(C4Group &hGroup, const char *szFilename, C4LangStringTable *pLang);
317  bool Save(C4Group &hGroup, const char *szFilename);
318 
319  const C4PlayerControlDefs &GetControlDefs() const { return ControlDefs; }
320  const C4PlayerControlAssignmentSets &GetAssignmentSets() const { return AssignmentSets; }
321 };
322 
323 // runtime information about a player's control
325 {
326 public:
327  enum { MaxRecentKeyLookback = 3000, MaxSequenceKeyDelay = 800 }; // milliseconds: Time to press key combos
328 
333  };
334 
335 private:
336  C4PlayerControlDefs &ControlDefs; // shortcut
337 
338  // owner
339  int32_t iPlr{-1};
340 
341  // async values
342  C4PlayerControlAssignmentSet *pControlSet{nullptr}; // the control set used by this player - may be nullptr if the player cannot be controlled!
343  typedef std::list<C4KeyBinding *> KeyBindingList;
344  KeyBindingList KeyBindings; // keys registered into Game.KeyboardInput
345  C4PlayerControlRecentKeyList RecentKeys; // keys pressed recently; for combinations
346  C4PlayerControlRecentKeyList DownKeys; // keys currently held down
347  bool IsCursorPosRequested{false}; // set to true when a SendCursorPos-control had been issued
348 
349 public:
350  // sync values
351  struct CSync
352  {
354  {
355  C4KeyEventData DownState, MovedState; // control is down if DownState.iStrength>0
356  int32_t iDownFrame{0}, iMovedFrame; // frame when control was pressed
357  bool fDownByUser{false}; // if true, the key is actually pressed. Otherwise, it's triggered as down by another key
358  ControlDownState(const C4KeyEventData &rDownState, int32_t iDownFrame, bool fDownByUser)
360  bool IsDown() const { return DownState.iStrength>0; }
361 
363  void CompileFunc(StdCompiler *pComp);
364  bool operator ==(const ControlDownState &cmp) const;
365  };
366  typedef std::vector<ControlDownState> DownStateVec;
367  DownStateVec ControlDownStates; // indexed by C4PlayerControlID: Down-state of a control. 0=up, 100=down; values inbetween e.g. for gamepad sticks
368  typedef std::vector<int32_t> DisableStateVec;
369  DisableStateVec ControlDisableStates; // indexed by C4PlayerControlID: Disable-states of controls. >0 is disabled.
370 
371  const ControlDownState *GetControlDownState(int32_t iControl) const;
372  int32_t GetControlDisabled(int32_t iControl) const;
373  bool IsControlDisabled(int32_t iControl) const { return GetControlDisabled(iControl)>0; }
374  void SetControlDownState(int32_t iControl, const C4KeyEventData &rDownState, int32_t iDownFrame, bool fDownByUser);
375  void SetControlMovedState(int32_t iControl, const C4KeyEventData &rMovedState, int32_t iMovedFrame);
376  void ResetControlDownState(int32_t iControl);
377  bool SetControlDisabled(int32_t iControl, int32_t iVal);
378 
379  void InitDefaults(const C4PlayerControlDefs &ControlDefs);
380  void Clear();
381  void CompileFunc(StdCompiler *pComp);
382  bool operator ==(const CSync &cmp) const;
383  };
384 
385 private:
386  CSync Sync;
387 
388  // callbacks from Game.KeyboardInput
389  bool ProcessKeyEvent(const C4KeyCodeEx &pressed_key, const C4KeyCodeEx &matched_key, ControlState state, const C4KeyEventData &rKeyExtraData, bool reset_down_states_only=false, bool *clear_recent_keys=nullptr);
390  bool ProcessKeyDown(const C4KeyCodeEx &pressed_key, const C4KeyCodeEx &matched_key);
391  bool ProcessKeyUp(const C4KeyCodeEx &pressed_key, const C4KeyCodeEx &matched_key);
392  bool ProcessKeyMoved(const C4KeyCodeEx &pressed_key, const C4KeyCodeEx &matched_key);
393 
394  // execute single control. return if handled.
395  bool ExecuteControl(int32_t iControl, ControlState state, const C4KeyEventData &rKeyExtraData, int32_t iTriggerMode, bool fRepeated, bool fHandleDownStateOnly);
396  bool ExecuteControlAction(int32_t iControl, C4PlayerControlDef::Actions eAction, C4ID idControlExtraData, ControlState state, const C4KeyEventData &rKeyExtraData, bool fRepeated);
397  bool ExecuteControlScript(int32_t iControl, C4ID idControlExtraData, ControlState state, const C4KeyEventData &rKeyExtraData, bool fRepeated);
398 
399  // init
400  void AddKeyBinding(const C4KeyCodeEx &key, bool fHoldKey, int32_t idx);
401 
402  // helper function: get current cursor position of controlling player in GUI coordinates
403  // used e.g. to open menus at cursor pos
404  bool GetCurrentPlayerCursorPos(int32_t *x_out, int32_t *y_out, int32_t *game_x_out, int32_t *game_y_out);
405 
406 public:
407  C4PlayerControl();
409  void Clear();
410 
411  // first-time init call after player join
412  // not called again after control set change/savegame resume
413  // does DefaultDisabled controls
414  void Init();
415 
416  void CompileFunc(StdCompiler *pComp);
417 
418  void RegisterKeyset(int32_t iPlr, C4PlayerControlAssignmentSet *pKeyset); // register all keys into Game.KeyboardInput creating KeyBindings
419 
420  bool IsGlobal() const { return iPlr==-1; }
421  const CSync::ControlDownState *GetControlDownState(int32_t iControl) const
422  { return Sync.GetControlDownState(iControl); }
423 
424  // callback from control queue
425  void ExecuteControlPacket(const class C4ControlPlayerControl *pCtrl);
426 
427  // sync execution: Do keyrepeat, etc.
428  void Execute();
429 
430  // mouse input
431  bool DoMouseInput(uint8_t mouse_id, int32_t mouseevent, float game_x, float game_y, float gui_x, float gui_y, DWORD flags);
432 
433  // control enable/disable
434  bool SetControlDisabled(int ctrl, bool is_disabled) { return Sync.SetControlDisabled(ctrl, is_disabled); }
435  bool IsControlDisabled(int ctrl) const { return Sync.IsControlDisabled(ctrl); }
436 
437  // callback from C4GameControl when the next control packet is finalized
438  void PrepareInput();
439 
440 };
441 
442 
443 #endif // INC_C4PlayerControl
std::vector< C4PlayerControlAssignment > C4PlayerControlAssignmentVec
std::vector< C4KeyCodeEx > C4KeyCodeExVec
std::list< C4PlayerControlRecentKey > C4PlayerControlRecentKeyList
std::vector< const C4PlayerControlAssignment * > C4PlayerControlAssignmentPVec
@ CON_None
const float C4GFX_ZoomStep
uint32_t DWORD
bool IsWildcardString(const char *szString)
Definition: StdFile.cpp:363
Definition: C4Id.h:26
void SetInheritedAssignment(const C4PlayerControlAssignment *to_val)
void SetKey(const C4KeyCodeEx &key)
bool IsComboMatched(const C4PlayerControlRecentKeyList &DownKeys, const C4PlayerControlRecentKeyList &RecentKeys) const
const char * GetControlName() const
const C4PlayerControlAssignment * GetInheritedAssignment() const
const char * GetGUIName(const C4PlayerControlDefs &defs) const
StdStrBuf GetKeysAsString(bool human_readable, bool short_name) const
~C4PlayerControlAssignment()=default
void SetControlName(const char *control_name)
void CopyKeyFrom(const C4PlayerControlAssignment &src_assignment)
const char * GetGUIDesc(const C4PlayerControlDefs &defs) const
bool operator<(const C4PlayerControlAssignment &cmp) const
bool IsOverrideAssignments() const
void CompileFunc(StdCompiler *pComp)
int32_t GetTriggerMode() const
bool ResolveRefs(class C4PlayerControlAssignmentSet *pParentSet, C4PlayerControlDefs *pControlDefs)
const C4KeyCodeEx & GetTriggerKey() const
bool operator==(const C4PlayerControlAssignment &cmp) const
void SetInherited(bool to_val)
C4PlayerControlAssignment * GetAssignmentByControlName(const char *szControlName)
bool operator==(const C4PlayerControlAssignmentSet &cmp) const
bool ResolveRefs(C4PlayerControlDefs *pControlDefs)
void RemoveAssignmentByControlName(const char *control_name)
void MergeFrom(const C4PlayerControlAssignmentSet &Src, MergeMode merge_mode)
void GetAssignmentsByKey(const C4PlayerControlDefs &rDefs, const C4KeyCodeEx &key, bool fHoldKeysOnly, C4PlayerControlAssignmentPVec *pOutVec, const C4PlayerControlRecentKeyList &DownKeys, const C4PlayerControlRecentKeyList &RecentKeys) const
bool IsMouseControlAssigned(int32_t mouseevent) const
const char * GetGUIName() const
C4PlayerControlAssignment * GetAssignmentByControl(int32_t control)
void InitEmptyFromTemplate(const C4PlayerControlAssignmentSet &template_set)
C4PlayerControlAssignment * GetAssignmentByIndex(int32_t index)
C4PlayerControlAssignment * CreateAssignmentForControl(const char *control_name)
void GetTriggerKeys(const C4PlayerControlDefs &rDefs, C4KeyCodeExVec *pRegularKeys, C4KeyCodeExVec *pHoldKeys) const
void CompileFunc(StdCompiler *pComp)
const char * GetName() const
C4PlayerControlAssignmentSet * GetDefaultSet()
bool ResolveRefs(C4PlayerControlDefs *pControlDefs)
C4PlayerControlAssignmentSet * GetSetByName(const char *szName)
C4PlayerControlAssignmentSet * CreateEmptySetByTemplate(const C4PlayerControlAssignmentSet &template_set)
void MergeFrom(const C4PlayerControlAssignmentSets &Src, C4PlayerControlAssignmentSet::MergeMode merge_mode)
int32_t GetSetIndex(const C4PlayerControlAssignmentSet *set) const
bool operator==(const C4PlayerControlAssignmentSets &cmp) const
void CompileFunc(StdCompiler *pComp)
void RemoveSetByName(const char *set_name)
C4PlayerControlAssignmentSet * GetSetByIndex(int32_t index)
void CompileFunc(StdCompiler *pComp)
bool IsGlobal() const
C4ID GetExtraData() const
int32_t GetRepeatDelay() const
bool IsValid() const
int32_t GetInitialRepeatDelay() const
bool IsDefaultDisabled() const
const char * GetIdentifier() const
bool Execute(bool fUp, const C4KeyEventData &rKeyExtraData)
const char * GetGUIName() const
bool IsAsync() const
bool IsSyncObjectMenuControl() const
bool IsSync() const
bool operator==(const C4PlayerControlDef &cmp) const
~C4PlayerControlDef()=default
CoordinateSpace GetCoordinateSpace() const
bool IsHoldKey() const
Actions GetAction() const
bool IsSendCursorPos() const
const char * GetGUIDesc() const
C4PlayerControlDefs()=default
void MergeFrom(const C4PlayerControlDefs &Src)
int32_t GetControlIndexByIdentifier(const char *szIdentifier) const
bool operator==(const C4PlayerControlDefs &cmp) const
~C4PlayerControlDefs()=default
size_t GetCount() const
void CompileFunc(StdCompiler *pComp)
const C4PlayerControlDef * GetControlByIndex(int32_t idx) const
struct C4PlayerControlDefs::CInternalCons InternalCons
bool Load(C4Group &hGroup, const char *szFilename, C4LangStringTable *pLang)
bool Save(C4Group &hGroup, const char *szFilename)
void CompileFunc(StdCompiler *pComp)
const C4PlayerControlDefs & GetControlDefs() const
const C4PlayerControlAssignmentSets & GetAssignmentSets() const
void ExecuteControlPacket(const class C4ControlPlayerControl *pCtrl)
bool DoMouseInput(uint8_t mouse_id, int32_t mouseevent, float game_x, float game_y, float gui_x, float gui_y, DWORD flags)
bool SetControlDisabled(int ctrl, bool is_disabled)
bool IsGlobal() const
const CSync::ControlDownState * GetControlDownState(int32_t iControl) const
bool IsControlDisabled(int ctrl) const
void RegisterKeyset(int32_t iPlr, C4PlayerControlAssignmentSet *pKeyset)
void CompileFunc(StdCompiler *pComp)
const char * getData() const
Definition: StdBuf.h:442
void Copy()
Definition: StdBuf.h:467
C4KeyCode Key
bool operator==(const ControlDownState &cmp) const
ControlDownState(const C4KeyEventData &rDownState, int32_t iDownFrame, bool fDownByUser)
bool SetControlDisabled(int32_t iControl, int32_t iVal)
void SetControlMovedState(int32_t iControl, const C4KeyEventData &rMovedState, int32_t iMovedFrame)
std::vector< int32_t > DisableStateVec
int32_t GetControlDisabled(int32_t iControl) const
bool IsControlDisabled(int32_t iControl) const
void SetControlDownState(int32_t iControl, const C4KeyEventData &rDownState, int32_t iDownFrame, bool fDownByUser)
DownStateVec ControlDownStates
bool operator==(const CSync &cmp) const
void ResetControlDownState(int32_t iControl)
const ControlDownState * GetControlDownState(int32_t iControl) const
void CompileFunc(StdCompiler *pComp)
std::vector< ControlDownState > DownStateVec
DisableStateVec ControlDisableStates
void InitDefaults(const C4PlayerControlDefs &ControlDefs)
C4PlayerControlRecentKey(const C4KeyCodeEx &pressed_key, const C4KeyCodeEx &matched_key, C4TimeMilliseconds tTime)
C4TimeMilliseconds tTime
bool operator==(const C4KeyCodeEx &cmp)