Skip to content

Commit d0ea8f9

Browse files
committed
Revamped and Expanded CommandSetModifiers for Mouse & Keyboard (Parsing Format Changed) + Optimized CustomDamageTypes Parsing + Misc Comments Edits + Commented Out Debug Logs
1 parent fbb8ce4 commit d0ea8f9

18 files changed

Lines changed: 1015 additions & 292 deletions

File tree

GeneralsMD/Code/GameEngine/Include/Common/INI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ class INI
255255
static void parseChallengeModeDefinition( INI* ini );
256256
static void parseCustomDamageTypesDefinition( INI *ini );
257257
static void parseCustomRadiusDecalDefinition( INI *ini );
258+
static void parseMouseCommandModifierDefinition( INI *ini );
258259

259260
AsciiString getFilename( void ) const { return m_filename; }
260261
INILoadType getLoadType( void ) const { return m_loadType; }

GeneralsMD/Code/GameEngine/Include/GameClient/ControlBar.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class ControlBarResizer;
5959
class GameWindowTransitionsHandler;
6060
class DisplayString;
6161

62+
struct MouseModifierKeysList;
63+
6264
enum ProductionID CPP_11(: Int);
6365

6466
enum CommandSourceType CPP_11(: Int);
@@ -309,6 +311,17 @@ static const LookupListRec CommandButtonMappedBorderTypeNames[] =
309311
{ NULL, 0 }
310312
};
311313
static_assert(ARRAY_SIZE(CommandButtonMappedBorderTypeNames) == COMMAND_BUTTON_BORDER_COUNT + 1, "Incorrect array size");
314+
315+
struct CommandSetModifierEntry
316+
{
317+
std::vector<AsciiString> Keys;
318+
std::vector<AsciiString> CommandButtonsToTrigger;
319+
Bool KeyRequireEnabled;
320+
Bool IsSingular;
321+
Bool IsRandom;
322+
Bool StopsAtTop;
323+
};
324+
312325
//-------------------------------------------------------------------------------------------------
313326
/** Command buttons are used to load the buttons we place on throughout the command bar
314327
* interface in different context sensitive windows depending on the situation and
@@ -459,6 +472,7 @@ class CommandSet : public Overridable
459472
const AsciiString& getName() const { return m_name; }
460473
const CommandButton* getCommandButton(Int i) const;
461474
const AsciiString& getModifierForCommandButtonOverrideName(Int i, const AsciiString& key) const;
475+
const AsciiString& getOriginalButtonName(Int i) const { return m_originalButtonName[ i ]; }
462476

463477
// only for the control bar.
464478
CommandSet* friend_getNext() { return m_next; }
@@ -471,6 +485,7 @@ class CommandSet : public Overridable
471485
static void parseCommandButton( INI* ini, void *instance, void *store, const void *userData );
472486

473487
AsciiString m_name; ///< name of this command set
488+
AsciiString m_originalButtonName[ MAX_COMMANDS_PER_SET ];
474489
const CommandButton *m_command[ MAX_COMMANDS_PER_SET ]; ///< the set of command buttons that make this set
475490

476491
typedef std::vector<std::pair<AsciiString, AsciiString>> ModifierCommandType;
@@ -822,9 +837,13 @@ class ControlBar : public SubsystemInterface
822837

823838
//Int getRemainingSciencePointsAvailableToPurchase( Player* player ) const;
824839

825-
Bool checkForCommandSetModifierOverride(Bool checkPointedWindow, const std::vector<AsciiString>& keys, const CommandButton *commandButton = nullptr);
840+
Bool checkForCommandSetModifierOverride(CommandSetModifierEntry entry);
841+
Bool checkForCommandSetModifierOverrideMouse(MouseModifierKeysList keys, const CommandButton *commandButton);
842+
Bool checkForResetOverride(Bool &checkOverridePresent, Int &i, const AsciiString& presentButtonName, Bool isLastAvailableKey, GameWindow **button);
826843
CBCommandStatus processCommandSetModifierButtonClick( GameWindow *control, GadgetGameMessage gadgetMessage );
827844

845+
Bool isMouseWithinCommandButton(Int i, const ICoord2D *mousePos) const;
846+
828847
protected:
829848
void updateRadarAttackGlow ( void );
830849

GeneralsMD/Code/GameEngine/Include/GameClient/Gadget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ enum GadgetGameMessage CPP_11(: Int)
153153
GBM_DOUBLE_CLICKED_LEFT,
154154
GBM_DOUBLE_CLICKED_RIGHT,
155155
GBM_DOUBLE_CLICKED_MIDDLE,
156+
GBM_SCROLL_DOWN,
157+
GBM_SCROLL_UP,
156158

157159
// Slider messages
158160
GSM_SLIDER_TRACK,

GeneralsMD/Code/GameEngine/Include/GameClient/MetaEvent.h

Lines changed: 85 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -332,27 +332,33 @@ static const char* const TheCommandUsableInNames[] =
332332
};
333333

334334
// -------------------------------------------------------------------------------
335-
// ClickState sets for Command Set Override.
336-
enum ClickState CPP_11(: Int)
335+
// MouseState sets for Command Set Override.
336+
enum MouseState CPP_11(: Int)
337337
{
338-
CLICK_NONE = 0,
338+
STATE_NONE = 0,
339339
LEFT_CLICK,
340340
RIGHT_CLICK,
341341
MIDDLE_CLICK,
342342
LEFT_DOUBLE_CLICK,
343343
RIGHT_DOUBLE_CLICK,
344-
MIDDLE_DOUBLE_CLICK
344+
MIDDLE_DOUBLE_CLICK,
345+
SCROLL_DOWN,
346+
SCROLL_UP,
347+
348+
MOUSE_STATE_COUNT
345349
};
346350

347-
static const LookupListRec ClickNames[] =
351+
static const LookupListRec MouseStateNames[] =
348352
{
349-
{ "NONE", CLICK_NONE },
353+
{ "NONE", STATE_NONE },
350354
{ "LEFT_CLICK", LEFT_CLICK },
351355
{ "RIGHT_CLICK", RIGHT_CLICK },
352356
{ "MIDDLE_CLICK", MIDDLE_CLICK },
353357
{ "LEFT_DOUBLE_CLICK", LEFT_DOUBLE_CLICK },
354358
{ "RIGHT_DOUBLE_CLICK", RIGHT_DOUBLE_CLICK },
355359
{ "MIDDLE_DOUBLE_CLICK", MIDDLE_DOUBLE_CLICK },
360+
{ "SCROLL_DOWN", SCROLL_DOWN },
361+
{ "SCROLL_UP", SCROLL_UP },
356362
{ nullptr, 0 }
357363
};
358364

@@ -368,9 +374,13 @@ class MetaMapRec : public MemoryPoolObject
368374
MappableKeyModState m_modState; ///< the required state of the ctrl-alt-shift keys
369375
CommandUsableInType m_usableIn; ///< the allowed place the command can be used in
370376
// Next fields are added for Key mapping Dialog
371-
AsciiString m_commandModifierKey;
372-
ClickState m_commandModifierClickToTrigger;
373-
MappableKeyCategories m_category; ///< This is the catagory the key falls under
377+
std::vector<AsciiString> m_commandModifierKeys;
378+
std::vector<AsciiString> m_commandModifierButtonsToTrigger;
379+
Bool m_commandModifierNeedsButtonEnabled;
380+
Bool m_commandModifierIsSingular;
381+
Bool m_commandModifierIsRandom;
382+
Bool m_commandModifierStopsAtTop;
383+
MappableKeyCategories m_category; ///< This is the category the key falls under
374384
UnicodeString m_description; ///< The description string for the keys
375385
UnicodeString m_displayName; ///< The display name of our command
376386
};
@@ -396,26 +406,83 @@ class MetaEventTranslator : public GameMessageTranslator
396406
virtual GameMessageDisposition translateGameMessage(const GameMessage *msg);
397407
};
398408

409+
struct MouseModifierKeysList
410+
{
411+
std::vector<AsciiString> Keys;
412+
std::vector<AsciiString> KeysButtonNeedsEnable;
413+
std::vector<AsciiString> KeysSingular;
414+
std::vector<AsciiString> KeysRandom;
415+
std::vector<AsciiString> KeysStopsAtTop;
416+
417+
MouseModifierKeysList()
418+
{
419+
Keys.clear();
420+
KeysButtonNeedsEnable.clear();
421+
KeysSingular.clear();
422+
KeysRandom.clear();
423+
KeysStopsAtTop.clear();
424+
}
425+
};
426+
427+
// ------------------------------------------------------------------------------------------------
428+
class MouseModifierKeyTemplate
429+
{
430+
friend class MetaMap;
431+
private:
432+
MouseState m_mouseState;
433+
Bool m_keyRequireEnabled;
434+
Bool m_isSingular;
435+
Bool m_isRandom;
436+
Bool m_stopsAtTop;
437+
std::vector<AsciiString> m_keys;
438+
std::vector<AsciiString> m_commandButtonsToTrigger;
439+
440+
public:
441+
MouseModifierKeyTemplate()
442+
{
443+
m_mouseState = STATE_NONE;
444+
m_keyRequireEnabled = FALSE;
445+
m_isSingular = FALSE;
446+
m_isRandom = FALSE;
447+
m_stopsAtTop = FALSE;
448+
m_keys.clear();
449+
m_commandButtonsToTrigger.clear();
450+
}
451+
452+
void reset()
453+
{
454+
m_mouseState = STATE_NONE;
455+
m_keyRequireEnabled = FALSE;
456+
m_isSingular = FALSE;
457+
m_isRandom = FALSE;
458+
m_stopsAtTop = FALSE;
459+
m_keys.clear();
460+
m_commandButtonsToTrigger.clear();
461+
}
462+
463+
static void parseMouseModifierKeyTemplate(INI* ini, void *instance, void * store, const void* /*userData*/);
464+
};
465+
399466
//-----------------------------------------------------------------------------
400467
class MetaMap : public SubsystemInterface
401468
{
402469
friend class MetaEventTranslator;
403470

404471
private:
472+
MouseModifierKeyTemplate mouseModifierKeyParser;
405473
MetaMapRec *m_metaMaps;
474+
406475
std::vector<MappableKeyType> m_doubleDownKeysVec;
407-
std::vector<AsciiString> m_leftClickCommandModifiersMeta;
408-
std::vector<AsciiString> m_rightClickCommandModifiersMeta;
409-
std::vector<AsciiString> m_middleClickCommandModifiersMeta;
410-
std::vector<AsciiString> m_leftDoubleClickCommandModifiersMeta;
411-
std::vector<AsciiString> m_rightDoubleClickCommandModifiersMeta;
412-
std::vector<AsciiString> m_middleDoubleClickCommandModifiersMeta;
476+
477+
typedef std::hash_map< AsciiString, MouseModifierKeysList, rts::hash<AsciiString>, rts::equal_to<AsciiString> > MouseModifierKeySpecificMap;
478+
MouseModifierKeysList m_mouseModifierKeysUniversal[MOUSE_STATE_COUNT];
479+
MouseModifierKeySpecificMap m_mouseModifierKeysSpecific[MOUSE_STATE_COUNT];
413480

414481
protected:
415482
GameMessage::Type findGameMessageMetaType(const char* name);
416483
MetaMapRec *getMetaMapRec(GameMessage::Type t);
417484
void pushDoubleDownKeyList(MappableKeyType m);
418-
void setClickCommandModifiersMeta( ClickState clickType, const AsciiString& key );
485+
void doMouseCommandModifierParsing();
419486

420487
public:
421488

@@ -427,13 +494,14 @@ class MetaMap : public SubsystemInterface
427494
void update() { }
428495

429496
static void parseMetaMap(INI* ini);
497+
static void parseMouseCommandModifierDefinition(INI* ini);
430498

431499
// TheSuperHackers @info Function to generate default key mappings
432500
// for actions that were not found in a CommandMap.ini
433501
static void generateMetaMap();
434502

435503
const MetaMapRec *getFirstMetaMapRec() const { return m_metaMaps; }
436-
const std::vector<AsciiString>& getClickCommandModifiersMeta( ClickState clickType ) const;
504+
MouseModifierKeysList getMouseCommandModifiersMeta( MouseState mouseInput, const AsciiString& commandButtonName ) const;
437505
Bool hasDoubleDownKey(MappableKeyType m) const;
438506
};
439507

GeneralsMD/Code/GameEngine/Include/GameLogic/Armor.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,6 @@ class ArmorTemplate
7171
static void parseArmorCoefficients( INI* ini, void *instance, void* /* store */, const void* userData );
7272
static void parseArmorMultiplier( INI* ini, void *instance, void* /* store */, const void* userData );
7373
static void parseArmorBonus(INI* ini, void* instance, void* /* store */, const void* userData);
74-
static void parseDefaultDamage(INI* ini, void*/*instance*/, void* /* store */, const void* /*userData*/);
75-
static void parseCustomDamageType(INI* ini, void*/*instance*/, void* /* store */, const void* /*userData*/);
76-
static void parseLinkDamageType(INI* ini, void*/*instance*/, void* /* store */, const void* /*userData*/);
77-
static void parseLinkCustomDamageTypes(INI* ini, void*/*instance*/, void* /* store */, const void* /*userData*/);
7874

7975
protected:
8076

@@ -168,15 +164,19 @@ class ArmorStore : public SubsystemInterface
168164
CustomDamageType m_customDamageTypeParse;
169165
AsciiString m_customDamageTypeParseNext;
170166

171-
Bool findNameInTypesList(NameKeyType nameKey, Real &damage, const CustomDamageTypeVec& coefficients, DamageType &linkDamageType);
167+
Bool findNameInTypesList(NameKeyType nameKey, Real &damage, const CustomDamageTypeVec& coefficients, DamageType &linkDamageType) const;
172168
//Bool isNameInTypesList(NameKeyType nameKey) const;
173-
std::vector<NameKeyType> GetLinkInTypesList(NameKeyType nameKey);
169+
const std::vector<NameKeyType>& GetLinkInTypesList(NameKeyType nameKey) const;
174170
//DamageType GetDeclaredLinkDamageType(NameKeyType nameKey);
175171
//Real GetDeclaredCoefficient(NameKeyType nameKey);
176172

177173
static void parseArmorDefinition(INI* ini);
178174
static void parseArmorExtendDefinition(INI* ini);
179175
static void parseCustomDamageTypesDefinition(INI* ini);
176+
static void parseCustomDamageType(INI* ini, void* instance, void* /* store */, const void* /*userData*/);
177+
static void parseDefaultDamage(INI* ini, void* instance, void* /* store */, const void* /*userData*/);
178+
static void parseLinkDamageType(INI* ini, void* instance, void* /* store */, const void* /*userData*/);
179+
static void parseLinkCustomDamageTypes(INI* ini, void* instance, void* /* store */, const void* /*userData*/);
180180

181181
private:
182182

GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ enum CrushSquishTestType CPP_11(: Int)
183183
TEST_CRUSH_OR_SQUISH
184184
};
185185

186+
typedef std::vector<std::pair<Int, AsciiString>> CommandModifiersVec;
187+
186188

187189
// ---------------------------------------------------
188190
/**
@@ -898,9 +900,10 @@ class Object : public Thing, public Snapshot
898900
void setNeedUpdateTurretPositioning(Bool set);
899901

900902
const CommandButton *getCommandModifierOverrideForSlot( Int slotNum, AsciiString commandSetName = AsciiString::TheEmptyString ) const;
901-
Bool registerModiferCommandOverrideWithinCommandSet( Int slotNum, const AsciiString& commandButtonName, Bool doRemove, AsciiString commandSetName = AsciiString::TheEmptyString );
902-
Bool getDoRemoveCommandOverrideWithinCommandSet( Int slotNum, const AsciiString& commandButtonName, AsciiString commandSetName = AsciiString::TheEmptyString ) const;
903-
//void removeModiferCommandOverrideWithinCommandSet( Int slotNum, AsciiString commandSetName = AsciiString::TheEmptyString );
903+
Bool hasModiferCommandOverrideWithinCommandSet( Int slotNum, const AsciiString& commandButtonName, AsciiString commandSetName = AsciiString::TheEmptyString ) const;
904+
Bool registerModiferCommandOverrideWithinCommandSet( Int slotNum, const AsciiString& commandButtonName, AsciiString commandSetName = AsciiString::TheEmptyString );
905+
Bool removeModiferCommandOverrideWithinCommandSet( Int slotNum, AsciiString commandButtonName = AsciiString::TheEmptyString, AsciiString commandSetName = AsciiString::TheEmptyString );
906+
Bool processModiferCommandOverrideWithinCommandSet( Bool doRemove, Int slotNum, const AsciiString& commandButtonName, AsciiString commandSetName = AsciiString::TheEmptyString );
904907

905908

906909
const AsciiString& getGenericInvalidCursorName() const;
@@ -1177,7 +1180,6 @@ class Object : public Thing, public Snapshot
11771180

11781181
Coord3D m_currentTargetCoords; ///< weapon's current target position. Need xfer in case if continuous laser
11791182

1180-
typedef std::vector<std::pair<Int, AsciiString>> CommandModifiersVec;
11811183
typedef std::hash_map< AsciiString, CommandModifiersVec, rts::hash<AsciiString>, rts::equal_to<AsciiString> > CommandSetModifiersMap;
11821184
CommandSetModifiersMap m_controlBarModifiersApplied; ///< By applying Modifers, we can alter the one command shown in a command set
11831185

GeneralsMD/Code/GameEngine/Source/Common/INI/INI.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ static const BlockParse theTypeTable[] =
9595
{ "ChallengeGenerals", INI::parseChallengeModeDefinition },
9696
{ "CommandButton", INI::parseCommandButtonDefinition },
9797
{ "CommandMap", INI::parseMetaMapDefinition },
98+
{ "CommandMouseModifier", INI::parseMouseCommandModifierDefinition },
9899
{ "CommandSet", INI::parseCommandSetDefinition },
99100
{ "ControlBarScheme", INI::parseControlBarSchemeDefinition },
100101
{ "ControlBarResizer", INI::parseControlBarResizerDefinition },

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,7 @@ void CommandSet::parseCommandButton( INI* ini, void *instance, void *store, cons
10081008

10091009
// save it
10101010
buttonArray[ buttonIndex ] = commandButton;
1011-
1011+
self->m_originalButtonName[ buttonIndex ] = AsciiString( token );
10121012
}
10131013

10141014
}
@@ -1020,7 +1020,10 @@ CommandSet::CommandSet(const AsciiString& name) :
10201020
m_next(NULL)
10211021
{
10221022
for( Int i = 0; i < MAX_COMMANDS_PER_SET; i++ )
1023+
{
10231024
m_command[ i ] = nullptr;
1025+
m_originalButtonName[ i ].clear();
1026+
}
10241027

10251028
m_modifierCommandMap.clear();
10261029
}

0 commit comments

Comments
 (0)