89 return sIdentifier == cmp.sIdentifier
90 && sGUIName == cmp.sGUIName
91 && sGUIDesc == cmp.sGUIDesc
92 && fGlobal == cmp.fGlobal
93 && fIsHoldKey == cmp.fIsHoldKey
94 && iRepeatDelay == cmp.iRepeatDelay
95 && iInitialRepeatDelay == cmp.iInitialRepeatDelay
96 && fDefaultDisabled == cmp.fDefaultDisabled
97 && idControlExtraData == cmp.idControlExtraData
98 && fSendCursorPos == cmp.fSendCursorPos
99 && eAction == cmp.eAction;
116 clear_previous =
false;
131 if (Src.clear_previous) Defs.clear();
133 for (
const auto & SrcDef : Src.Defs)
139 Defs[iPrevIdx] = SrcDef;
144 Defs.push_back(SrcDef);
153 if (idx<0 || idx>=int32_t(Defs.size()))
return nullptr;
159 for (DefVecImpl::const_iterator i = Defs.begin(); i != Defs.end(); ++i)
160 if (
SEqual((*i).GetIdentifier(), szIdentifier))
161 return i-Defs.begin();
169 for (DefVecImpl::const_iterator i = Defs.begin(); i != Defs.end(); ++i)
171 const char *szIdtf = (*i).GetIdentifier();
172 if (szIdtf && *szIdtf && !
SEqual(szIdtf,
"None"))
195 if (!sKeyName) UpdateKeyName();
200 void C4PlayerControlAssignment::KeyComboItem::UpdateKeyName()
203 sKeyName.Copy(Key.ToString(
false,
false));
235 if (inherited_assignment)
CopyKeyFrom(*inherited_assignment);
241 if (!inherited_assignment)
return true;
243 return KeyCombo != inherited_assignment->KeyCombo || fComboIsSequence != inherited_assignment->fComboIsSequence;
250 KeyCombo[0].Key = key;
251 KeyCombo[0].Key.fRepeated =
false;
252 KeyCombo[0].sKeyName.Clear();
253 fComboIsSequence =
false;
260 KeyCombo = src_assignment.KeyCombo;
261 TriggerKey = src_assignment.TriggerKey;
262 fComboIsSequence = src_assignment.fComboIsSequence;
263 if (!src_assignment.fRefsResolved) fRefsResolved =
false;
269 static int32_t recursion_check = 0;
270 if (recursion_check > 10)
272 LogFatal(
FormatString(
"Maximum recursion limit reached while resolving player control assignments of set %s in assignment for key %s. This is probably due to a circular control chain.", pParentSet->
GetName(),
GetControlName()).getData());
279 KeyComboVec NewCombo;
280 for (
auto & rKeyComboItem : KeyCombo)
282 const char *szKeyName = rKeyComboItem.sKeyName.getData();
285 bool is_key_reference =
false;
286 int last_shift_delim_pos;
287 if (szKeyName && *szKeyName)
289 if ((last_shift_delim_pos=
SCharLastPos(
'+', szKeyName)) > -1) szKeyName += last_shift_delim_pos+1;
290 if (
SEqual2(szKeyName,
"CON_"))
292 is_key_reference =
true;
296 if (is_key_reference)
304 if (!pRefAssignment->
IsRefsResolved())
if (!pRefAssignment->
ResolveRefs(pParentSet, pControlDefs)) { --recursion_check;
return false; }
307 DWORD ref_shift = rKeyComboItem.Key.dwShift;
310 for (
auto assignment_combo_item : pRefAssignment->KeyCombo)
312 assignment_combo_item.Key.dwShift |= ref_shift;
313 NewCombo.push_back(assignment_combo_item);
318 NewCombo.insert(NewCombo.end(), pRefAssignment->KeyCombo.begin(), pRefAssignment->KeyCombo.end());
324 LogF(
"WARNING: Control %s of set %s contains reference to unassigned control %s.",
GetControlName(), pParentSet->
GetName(), rKeyComboItem.sKeyName.getData());
333 LogF(R
"(WARNING: Control %s of set %s contains undefined key "%s".)", GetControlName(), pParentSet->GetName(), szKeyName);
336 NewCombo.push_back(rKeyComboItem);
342 if (KeyCombo.size() > 1 && !fComboIsSequence)
345 for (
auto & i : KeyCombo)
347 if (i.Key.Key == K_CONTROL_L || i.Key.Key == K_CONTROL_R) shift |=
KEYS_Control;
348 if (i.Key.Key == K_SHIFT_L || i.Key.Key == K_SHIFT_R) shift |=
KEYS_Shift;
349 shift |= i.Key.dwShift;
351 for (
auto & i : KeyCombo) i.Key.dwShift |= shift;
354 for (
auto & i : KeyCombo) i.Key.FixShiftKeys();
356 if (KeyCombo.size()) TriggerKey = KeyCombo.back().
Key;
else TriggerKey =
C4KeyCodeEx();
358 fRefsResolved =
true;
367 if (fComboIsSequence)
372 auto i = KeyCombo.rbegin()+1;
373 for (
auto ri = RecentKeys.rbegin(); i!=KeyCombo.rend(); ++ri)
376 if (ri == RecentKeys.rend())
return false;
382 const KeyComboItem &k = *i;
396 for (
const auto & k : KeyCombo)
399 for (
const auto & dk : DownKeys)
401 if (dk.matched_key == k.Key) { fFound =
true;
break; }
403 if (!fFound)
return false;
413 return KeyCombo == cmp.KeyCombo
414 && sControlName == cmp.sControlName
415 && sGUIName == cmp.sGUIName
416 && sGUIDesc == cmp.sGUIDesc
417 && fGUIDisabled == cmp.fGUIDisabled
418 && iTriggerMode == cmp.iTriggerMode
419 && iPriority == cmp.iPriority;
427 if (!KeyCombo.size())
return result;
429 KeyComboVec::const_iterator i=KeyCombo.begin();
430 result.
Take(i->Key.ToString(human_readable, short_name));
432 while (++i != KeyCombo.end())
434 result.
AppendChar(fComboIsSequence ?
',' :
'+');
435 result.
Append(i->Key.ToString(human_readable, short_name));
446 if (sGUIName ==
"None")
return "";
482 sName.
Copy(template_set.sName);
483 sGUIName.
Copy(template_set.sGUIName);
484 sParentSetName.
Copy(template_set.sParentSetName);
485 has_keyboard = template_set.has_keyboard;
486 has_mouse = template_set.has_mouse;
487 has_gamepad = template_set.has_gamepad;
508 for (
const auto & SrcAssignment : Src.Assignments)
512 if (merge_mode !=
MM_LowPrio && SrcAssignment.IsOverrideAssignments())
515 bool any_remaining =
true;
516 while (any_remaining)
518 any_remaining =
false;
519 for (C4PlayerControlAssignmentVec::iterator j = Assignments.begin(); j != Assignments.end(); ++j)
520 if (
SEqual((*j).GetControlName(), SrcAssignment.GetControlName()))
523 if (fSelfIsReleaseKey == fIsReleaseKey)
525 Assignments.erase(j);
526 any_remaining =
true;
535 bool any_override =
false;
536 for (
auto & Assignment : Assignments)
537 if (
SEqual(Assignment.GetControlName(), SrcAssignment.GetControlName()))
540 if (fSelfIsReleaseKey == fIsReleaseKey)
546 Assignment.CopyKeyFrom(SrcAssignment);
547 Assignment.SetInherited(
false);
552 if (any_override)
continue;
555 Assignments.push_back(SrcAssignment);
559 Assignments.back().SetInherited(
true);
560 Assignments.back().SetInheritedAssignment(&SrcAssignment);
567 Assignments.emplace_back();
568 Assignments.back().SetControlName(control_name);
569 return &Assignments.back();
574 for (C4PlayerControlAssignmentVec::iterator i = Assignments.begin(); i != Assignments.end(); ++i)
575 if (
SEqual((*i).GetControlName(), control_name))
577 Assignments.erase(i);
585 for (
auto & Assignment : Assignments)
586 Assignment.ResetRefsResolved();
588 for (
auto & Assignment : Assignments)
589 if (!Assignment.IsRefsResolved())
590 if (!Assignment.ResolveRefs(
this, pDefs))
599 std::sort(Assignments.begin(), Assignments.end());
604 if (index<0 || index>=int32_t(Assignments.size()))
return nullptr;
605 return &Assignments[index];
610 for (
auto & Assignment : Assignments)
611 if (
SEqual(Assignment.GetControlName(), szControlName))
621 for (
auto & Assignment : Assignments)
622 if (Assignment.GetControl() == control)
631 return Assignments == cmp.Assignments
632 && sName == cmp.sName;
639 for (
const auto & rAssignment : Assignments)
641 const C4KeyCodeEx &rAssignmentTriggerKey = rAssignment.GetTriggerKey();
642 if (!(rAssignmentTriggerKey.
Key == key.
Key))
continue;
644 if (!fHoldKeysOnly)
if (rAssignmentTriggerKey.
dwShift != key.
dwShift)
continue;
647 if (!pCtrl)
continue;
654 else if (rAssignment.HasCombo())
658 if (!rAssignment.IsComboMatched(DownKeys, RecentKeys))
continue;
661 pOutVec->push_back(&rAssignment);
669 for (
const auto & rAssignment : Assignments)
674 const C4KeyCodeEx &rKey = rAssignment.GetTriggerKey();
675 if (std::find(pHoldKeys->begin(), pHoldKeys->end(), rKey) == pHoldKeys->end()) pHoldKeys->push_back(rKey);
679 for (
const auto & rAssignment : Assignments)
684 const C4KeyCodeEx &rKey = rAssignment.GetTriggerKey();
685 if (std::find(pHoldKeys->begin(), pHoldKeys->end(), rKey) == pHoldKeys->end())
686 if (std::find(pRegularKeys->begin(), pRegularKeys->end(), rKey) == pRegularKeys->end())
687 pRegularKeys->push_back(rKey);
728 return Sets == cmp.Sets && clear_previous == cmp.clear_previous;
734 if (Src.clear_previous) Sets.clear();
736 for (
const auto & SrcSet : Src.Sets)
739 bool fIsWildcardSet = SrcSet.IsWildcardName();
755 Sets.push_back(SrcSet);
761 for (
auto & DstSet : Sets)
765 DstSet.MergeFrom(SrcSet, merge_mode);
774 for (
auto & Set : Sets)
775 if (!Set.ResolveRefs(pDefs))
return false;
781 for (
auto & Set : Sets)
782 Set.SortAssignments();
787 for (
auto & Set : Sets)
796 if (Sets.empty())
return nullptr;
797 return &Sets.front();
804 for (AssignmentSetList::const_iterator i = Sets.begin(); i != Sets.end(); ++i,++index)
813 if (index < 0 || index >= (int32_t)Sets.size())
return nullptr;
815 AssignmentSetList::iterator i = Sets.begin();
823 Sets.back().InitEmptyFromTemplate(template_set);
829 for (AssignmentSetList::iterator i = Sets.begin(); i != Sets.end(); ++i)
830 if (
SEqual(set_name, (*i).GetName()))
855 if (!CompileFromBuf_LogWarn<StdCompilerINIRead>(*
this, Buf, szFilename))
return false;
863 if (!DecompileToBuf_Log<StdCompilerINIWrite>(*
this, &Buf, szFilename))
return false;
864 hGroup.
Add(szFilename, Buf,
false,
true);
871 AssignmentSets.
Clear();
898 if (iControl < 0 || iControl >= int32_t(
ControlDownStates.size()))
return nullptr;
912 if (iControl < 0)
return;
923 if (iControl < 0)
return;
933 if (iControl < 0)
return false;
945 if (pDownState && pDownState->
IsDown())
986 Sync.InitDefaults(ControlDefs);
1008 assert(pControlSet);
1009 pControlSet->GetAssignmentsByKey(ControlDefs, matched_key, state !=
CONS_Down, &Matches, DownKeys, RecentKeys);
1011 bool cursor_pos_added =
false;
1013 for (C4PlayerControlAssignmentPVec::const_iterator i = Matches.begin(); i != Matches.end(); ++i)
1016 assert(pAssignment);
1017 int32_t iControlIndex = pAssignment->
GetControl();
1018 const C4PlayerControlDef *pControlDef = ControlDefs.GetControlByIndex(iControlIndex);
1019 if (pControlDef && pControlDef->
IsValid() && !Sync.IsControlDisabled(iControlIndex) && (state ==
CONS_Down || pControlDef->
IsHoldKey()))
1024 if (pControlDef->
IsAsync() && !pControlPacket)
1027 if (ExecuteControl(iControlIndex, state, rKeyExtraData, pAssignment->
GetTriggerMode(), pressed_key.
IsRepeated(), reset_down_states_only))
1038 int32_t extra_trigger_mode = 0;
1044 int32_t x, y, game_x, game_y;
1046 if (GetCurrentPlayerCursorPos(&x, &y, &game_x, &game_y))
1049 cursor_key_data.vp_x = x; cursor_key_data.vp_y = y;
1050 cursor_key_data.game_x = game_x; cursor_key_data.game_y = game_y;
1054 IsCursorPosRequested =
true;
1055 cursor_pos_added =
true;
1077 if (std::find(DownKeys.begin(), DownKeys.end(), pressed_key) == DownKeys.end()) DownKeys.push_back(RKey);
1080 bool clear_recent_keys =
false;
1083 if (clear_recent_keys)
1086 RecentKeys.push_back(RKey);
1096 C4PlayerControlRecentKeyList::iterator i = find(DownKeys.begin(), DownKeys.end(), pressed_key);
1097 if (i != DownKeys.end()) DownKeys.erase(i);
1113 bool fHandleDownStateOnly =
false;
1134 fHandleDownStateOnly =
true;
1145 bool C4PlayerControl::ExecuteControl(int32_t iControl,
ControlState state,
const C4KeyEventData &rKeyExtraData, int32_t iTriggerMode,
bool fRepeated,
bool fHandleDownStateOnly)
1149 if (!pControlDef || Sync.IsControlDisabled(iControl))
return false;
1152 const CSync::ControlDownState *pCtrlDownState = Sync.GetControlDownState(iControl);
1153 bool fWasDown = pCtrlDownState ? pCtrlDownState->IsDown() :
false;
1162 if (!pControlDef->
IsHoldKey())
return false;
1163 if (state ==
CONS_Up)
return false;
1170 KeyExtraData.iStrength = 0;
1171 Sync.SetControlDownState(iControl, KeyExtraData,
Game.
FrameCounter,
false);
1181 Sync.SetControlDownState(iControl, KeyExtraData,
Game.
FrameCounter,
false);
1191 Sync.SetControlDownState(iControl, KeyExtraData,
Game.
FrameCounter,
false);
1205 if (!fWasDown)
return false;
1219 fRepeated = fWasDown;
1223 if (fHandleDownStateOnly)
return false;
1225 bool fHandled = ExecuteControlAction(iControl, eAction, pControlDef->
GetExtraData(), state, KeyExtraData, fRepeated);
1241 C4Menu *pCursorMenu =
nullptr;
1245 if (!pPlr)
return false;
1255 return ExecuteControlScript(iControl, idControlExtraData, state, rKeyExtraData, fRepeated);
1279 default:
return false;
1283 bool C4PlayerControl::ExecuteControlScript(int32_t iControl,
C4ID idControlExtraData,
ControlState state,
const C4KeyEventData &rKeyExtraData,
bool fRepeated)
1304 x = rKeyExtraData.
vp_x; y = rKeyExtraData.
vp_y;
1321 for (
size_t i=0; i<ControlDefs.GetCount(); ++i)
1324 if (pControlDownState && pControlDownState->
IsDown())
1329 if (iCtrlRepeatDelay)
1333 if (iFrameDiff && iFrameDiff >= iCtrlInitialRepeatDelay)
1335 if (!((iFrameDiff-iCtrlInitialRepeatDelay) % iCtrlRepeatDelay))
1346 C4PlayerControlRecentKeyList::iterator irk;
1347 for (irk = RecentKeys.begin(); irk != RecentKeys.end(); ++irk)
1352 if (irk != RecentKeys.begin()) RecentKeys.erase(RecentKeys.begin(), irk);
1362 pControlSet =
nullptr;
1363 for (
auto & KeyBinding : KeyBindings)
delete KeyBinding;
1364 KeyBindings.clear();
1368 IsCursorPosRequested =
false;
1374 pControlSet = pKeyset;
1380 pControlSet->
GetTriggerKeys(ControlDefs, &RegularKeys, &HoldKeys);
1382 for (C4KeyCodeExVec::const_iterator i = RegularKeys.begin(); i != RegularKeys.end(); ++i) AddKeyBinding(*i,
false, idx++);
1383 for (C4KeyCodeExVec::const_iterator i = HoldKeys.begin(); i != HoldKeys.end(); ++i) AddKeyBinding(*i,
true, idx++);
1387 void C4PlayerControl::AddKeyBinding(
const C4KeyCodeEx &key,
bool fHoldKey, int32_t idx)
1404 mouseevent_data.
iStrength = 100*is_down;
1405 mouseevent_data.
vp_x = uint32_t(gui_x);
1406 mouseevent_data.
vp_y = uint32_t(gui_y);
1407 mouseevent_data.
game_x = uint32_t(game_x);
1408 mouseevent_data.
game_y = uint32_t(game_y);
1412 result = ProcessKeyDown(mouseevent_keycode, mouseevent_keycode);
1414 result = ProcessKeyUp(mouseevent_keycode, mouseevent_keycode);
1418 bool C4PlayerControl::GetCurrentPlayerCursorPos(int32_t *x_out, int32_t *y_out, int32_t *game_x_out, int32_t *game_y_out)
1421 if (pControlSet && pControlSet->
HasMouse())
1431 if (!plr)
return false;
1433 if (!cursor_obj)
return false;
1435 if (!vp)
return false;
1436 int32_t game_x = cursor_obj->
GetX(), game_y=cursor_obj->
GetY();
1437 *game_x_out = game_x; *game_y_out = game_y;
1444 *x_out = int32_t(gui_x); *y_out = int32_t(gui_y);
1450 if (IsCursorPosRequested)
1452 int32_t x, y, game_x, game_y;
1454 if (GetCurrentPlayerCursorPos(&x, &y, &game_x, &game_y))
1475 IsCursorPosRequested =
false;
const BYTE COM_MenuSelect
const BYTE COM_MenuEnterAll
const BYTE COM_MenuShowText
C4Def * C4Id2Def(C4ID id)
#define PSF_PlayerControl
C4AulScriptEngine ScriptEngine
C4MouseControl MouseControl
C4GraphicsResource GraphicsResource
bool LogF(const char *strMessage,...)
bool LogFatal(const char *szMessage)
std::vector< C4KeyCodeEx > C4KeyCodeExVec
std::list< C4PlayerControlRecentKey > C4PlayerControlRecentKeyList
std::vector< const C4PlayerControlAssignment * > C4PlayerControlAssignmentPVec
const float C4GFX_ZoomStep
void CompileFunc(C4Real &rValue, StdCompiler *pComp)
void AddDbgRec(C4RecordChunkType eType, const void *pData, int iSize)
C4Value C4VInt(int32_t i)
bool SEqual2(const char *szStr1, const char *szStr2)
int SCharLastPos(char cTarget, const char *szInStr)
bool SEqual(const char *szStr1, const char *szStr2)
StdSTLContainerAdapt< C > mkSTLContainerAdapt(C &rTarget, StdCompiler::Sep eSep=StdCompiler::SEP_SEP)
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
bool WildcardMatch(const char *szWildcard, const char *szString)
C4PropListStatic * GetPropList()
void RegisterGlobalConstant(const char *szName, const C4Value &rValue)
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
void AddHead(C4PacketType eType, C4ControlPacket *pCtrl)
const C4KeyEventData & GetExtraData() const
C4PlayerControl::ControlState GetState() const
DECLARE_C4CONTROL_VIRTUALS void AddControl(int32_t iControl, int32_t iTriggerMode)
const ControlItemVec & GetControlItems() const
void SetExtraData(const C4KeyEventData &new_extra_data)
C4Facet GetPhase(int iPhaseX=0, int iPhaseY=0)
C4KeyboardInput & KeyboardInput
C4PlayerControlAssignmentSets PlayerControlUserAssignmentSets
bool Add(const char *filename, const char *entry_name)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
void ReplaceStrings(StdStrBuf &rBuf)
bool GetLastCursorPos(int32_t *x_out_gui, int32_t *y_out_gui, int32_t *x_out_game, int32_t *y_out_game) const
class C4ObjectMenu * Menu
int32_t GetControl() const
void SetKey(const C4KeyCodeEx &key)
bool IsComboMatched(const C4PlayerControlRecentKeyList &DownKeys, const C4PlayerControlRecentKeyList &RecentKeys) const
int32_t GetGUIGroup() const
const char * GetControlName() const
const char * GetGUIName(const C4PlayerControlDefs &defs) const
StdStrBuf GetKeysAsString(bool human_readable, bool short_name) const
void CopyKeyFrom(const C4PlayerControlAssignment &src_assignment)
const char * GetGUIDesc(const C4PlayerControlDefs &defs) const
bool IsKeyChanged() const
void CompileFunc(StdCompiler *pComp)
int32_t GetTriggerMode() const
bool IsGUIDisabled() const
bool ResolveRefs(class C4PlayerControlAssignmentSet *pParentSet, C4PlayerControlDefs *pControlDefs)
@ CTM_HandleDownStatesOnly
bool operator==(const C4PlayerControlAssignment &cmp) const
void ResetKeyToInherited()
bool IsRefsResolved() const
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
C4PlayerControlAssignment * GetAssignmentByControl(int32_t control)
void InitEmptyFromTemplate(const C4PlayerControlAssignmentSet &template_set)
C4Facet GetPicture() const
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)
C4ID GetExtraData() const
int32_t GetRepeatDelay() const
int32_t GetInitialRepeatDelay() const
bool IsDefaultDisabled() const
@ CDA_ObjectMenuTextComplete
const char * GetGUIName() const
bool operator==(const C4PlayerControlDef &cmp) const
CoordinateSpace GetCoordinateSpace() const
Actions GetAction() const
bool IsSendCursorPos() const
const char * GetGUIDesc() const
void MergeFrom(const C4PlayerControlDefs &Src)
void UpdateInternalCons()
int32_t GetControlIndexByIdentifier(const char *szIdentifier) 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)
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)
void RegisterKeyset(int32_t iPlr, C4PlayerControlAssignmentSet *pKeyset)
void CompileFunc(StdCompiler *pComp)
void CountControl(ControlType eType, int32_t iID, int32_t iCntAdd=1)
std::shared_ptr< class C4GamePadOpener > pGamepad
C4Player * Get(int iPlayer) const
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
static C4TimeMilliseconds Now()
void ChangeZoom(float by_factor)
C4TargetFacet last_game_draw_cgo
C4Viewport * GetViewport(int32_t player_nr, C4Viewport *prev=nullptr)
virtual bool Separator(Sep eSep=SEP_SEP)
virtual bool Default(const char *szName)
void Value(const T &rStruct)
virtual void NameEnd(bool fBreak=false)
void excNotFound(const char *szMessage,...)
virtual bool isDeserializer()
virtual bool isRegistry()
virtual bool Name(const char *szName)
const char * getData() const
void AppendChar(char cChar)
void Append(const char *pnData, size_t iChars)
static C4KeyCodeEx FromC4MC(int8_t mouse_id, int32_t button, DWORD param, bool *is_down=nullptr)
C4KeyEventData MovedState
void CompileFunc(StdCompiler *pComp)
bool operator==(const ControlDownState &cmp) const
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
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)
int32_t CON_ObjectMenuOKAll
int32_t CON_ObjectMenuSelect
int32_t CON_ObjectMenuCancel