#ifndef MACRO_CONFIG_INT
#error "The config macros must be defined"
#define MACRO_CONFIG_INT(Name, ScriptName, Def, Min, Max, Save, Desc) ;
#define MACRO_CONFIG_COL(Name, ScriptName, Def, Save, Desc) ;
#define MACRO_CONFIG_STR(Name, ScriptName, Len, Def, Save, Desc) ;
#endif

// Dummy Hammer tweaks
MACRO_CONFIG_INT(ClDummyHammerNextPrevWeaponFix, cm_dummy_hammernextprevweaponfix, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Fix extra +nextweapon/+prevweapon inputs for hammerfly (requires a map reload to prevent botting)")

// Cursor visibility
MACRO_CONFIG_INT(ClCursorVisibility, cm_cursor_visibility, 0, 0, 3, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show other players cursors (2 to show own team only, 3 to show only when in spectator)")

// Nameplate parts
MACRO_CONFIG_INT(ClNameplateCheckpoint, cm_nameplate_checkpoint, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the teleport checkpoint on the nameplate (2 to show even if there are no checkpoints)")
MACRO_CONFIG_COL(ClNameplateCheckpointColorOwn, cm_nameplate_checkpoint_colorown, 4278190335, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Color of own nameplate teleport checkpoint")
MACRO_CONFIG_COL(ClNameplateCheckpointColorOther, cm_nameplate_checkpoint_colorother, 4278190335, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Color of other nameplate teleport checkpoint")
MACRO_CONFIG_INT(ClNameplateCheckpointShowZero, cm_nameplate_checkpointshowzero, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show checkpoint 0 on the nameplate (2 to show transparent)")
MACRO_CONFIG_INT(ClNameplateXSub, cm_nameplate_xsub, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the fractional part of player x coordinates on the nameplate (2 to only show symbols)")
MACRO_CONFIG_INT(ClNameplateXSubSymbolDelay, cm_nameplate_xsubsymboldelay, 5, 0, 50, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How many ticks a player must be still to show a symbol")
MACRO_CONFIG_INT(ClNameplateXSubSymbolWalled, cm_nameplate_xsubsymbolwalled, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show '⇤'/'⇥' when left/right walled (requires cm_nameplate_xsub)")
MACRO_CONFIG_INT(ClNameplateXSubSymbolCentered, cm_nameplate_xsubsymbolcentered, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show '|' when centered (requires cm_nameplate_xsub)")
MACRO_CONFIG_COL(ClNameplateXSubColorOwn, cm_nameplate_xsub_colorown, 4278190335, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Color of own nameplate x coordinates")
MACRO_CONFIG_COL(ClNameplateXSubColorOther, cm_nameplate_xsub_colorother, 4278190335, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLALPHA, "Color of other nameplate x coordinates")
MACRO_CONFIG_INT(ClNameplateWeapons, cm_nameplate_weapons, 0, 0, 3, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show weapons on the nameplate (0 to disable, 1 to show on others, 2 to show on self, 3 to show on all)")
MACRO_CONFIG_INT(ClNameplateCapabilities, cm_nameplate_capabilities, 0, 0, 3, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show capabilities on the nameplate (0 to disable, 1 to show on others, 2 to show on self, 3 to show on all)")
MACRO_CONFIG_INT(ClNameplateDirectionBottom, cm_nameplate_direction_bottom, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to show directions on top of or below the player")

// Chat unfocus
MACRO_CONFIG_INT(ClChatUnfocused, cm_chat_unfocused, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Prevent chat messages from fading out when unfocused (window is inactive, menu is open, or chat has not been rendered for 5 seconds)")
MACRO_CONFIG_INT(ClChatUnfocusedFadeTime, cm_chat_unfocusedfadetime, 1, 0, 14, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "How long it takes chat messages to fade out when no longer unfocused")
MACRO_CONFIG_INT(ClChatUnfocusedIdleTime, cm_chat_unfocusedidletime, 10, 0, 300, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "How long no input needs to have been made to be considered unfocused")
MACRO_CONFIG_INT(ClChatShowTimestamps, cm_chat_showtimestamps, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Show timestamps on chat messages")
MACRO_CONFIG_STR(ClChatShowTimestampsFormat, cm_chat_showtimestamps_format, 256, "[%H:%M:%S]", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "The format of timestamps on chat messages")
MACRO_CONFIG_INT(SndChatBackground, snd_chat_background, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable regular chat sound when the game is in the background, even if snd_chat or snd_team_chat are off")

// Auto team
MACRO_CONFIG_INT(ClAutoTeamLog, cm_autoteam_log, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Log the player followed when using cm_autoteam")

// Gun sound attenuation
MACRO_CONFIG_INT(ClGunSoundAttenuation, cm_gunsoundattenuation, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Whether to attenuate the sound of the pistol firing")
MACRO_CONFIG_INT(ClGunSoundAttenuationPerPlayer, cm_gunsoundattenuation_perplayer, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Whether to attenuate gun sounds globally or per player")
MACRO_CONFIG_INT(ClGunSoundAttenuationInterval, cm_gunsoundattenuation_interval, 10, 1, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "How long to remember shots were fired (1/10)")
MACRO_CONFIG_INT(ClGunSoundAttenuationShotCountStandard, cm_gunsoundattenuation_shotcountstandard, 4, 1, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "How many shots causes the maximum attenuation")
MACRO_CONFIG_INT(ClGunSoundAttenuationShotCountJetpack, cm_gunsoundattenuation_shotcountjetpack, 7, 1, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "How many shots causes the maximum attenuation")
MACRO_CONFIG_INT(ClGunSoundAttenuationVolumeStandard, cm_gunsoundattenuation_volumestandard, 100, 0, 1000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "The minimum volume for gun sounds for players without jetpack (1/1000)")
MACRO_CONFIG_INT(ClGunSoundAttenuationVolumeJetpack, cm_gunsoundattenuation_volumejetpack, 200, 0, 1000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "The minimum volume for gun sounds for players with jetpack (1/1000)")
MACRO_CONFIG_INT(ClGunSoundAttenuationCurveStandard, cm_gunsoundattenuation_curvestandard, -1000, -1000, 1000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "The curve to use for gun sound volume for players without jetpack (0: x, 100: x^2, -100: sqrt(x))")
MACRO_CONFIG_INT(ClGunSoundAttenuationCurveJetpack, cm_gunsoundattenuation_curvejetpack, 0, -1000, 1000, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "The curve to use for gun sound volume for players with jetpack (0: x, 100: x^2, -100: sqrt(x))")

// Prediction time
MACRO_CONFIG_INT(ClShowpredShowPeak, cm_showpred_showpeak, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to show the peak prediction time (requires cl_showpred)")
MACRO_CONFIG_INT(ClShowpredColor, cm_showpred_color, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to color the prediction time display based on the difference between the current prediction time and the average (requires cl_showpred)")
MACRO_CONFIG_INT(ClShowpredLength, cm_showpred_length, 50, 1, 50, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How long prediction times are tracked for cm_showpred_showpeak and cm_showpred_color (1/10)")
MACRO_CONFIG_INT(ClShowpredExtremePred, cm_showpred_extremepred, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Attempts to exaggerate changes in ping for cm_showpred_color (probably badly)")
MACRO_CONFIG_INT(ClShowpredWorstDiff, cm_showpred_worstdiff, 10, 1, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The difference in prediction time that produces the most red color (requires cm_showpred_color)")
MACRO_CONFIG_INT(ClShowpredShowMargin, cm_showpred_showmargin, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to show the prediction margin (requires cl_showpred)")

// Auto race recording
MACRO_CONFIG_INT(ClAutoRaceRecordDeleteOld, cm_auto_race_record_delete_old, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Delete worse demos when a better demo is recorded for a race")
MACRO_CONFIG_INT(ClDemoNameTeam, cm_demo_name_team, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Use the combined name of your team's members for demos")

// Splits
MACRO_CONFIG_INT(ClSplits, cm_splits, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to track splits (requires a map reload)")
MACRO_CONFIG_INT(ClSplitsTrackDummy, cm_splits_trackdummy, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to track splits for dummies")
MACRO_CONFIG_INT(ClSplitsForceAny, cm_splits_forceany, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to force all runs to be in the any rank category")
MACRO_CONFIG_INT(ClSplitsResetAfterDeath, cm_splits_resetafterdeath, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to reset the splits after a death")
MACRO_CONFIG_INT(ClSplitsResetAfterFinishDeath, cm_splits_resetafterfinishdeath, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to reset the splits after a death after crossing the finish line")
MACRO_CONFIG_INT(ClSplitsComparisonSource, cm_splits_comparisonsource, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The source to use for the comparison time (0: best run, 1: best segment total, 2: best segment segmented)")
MACRO_CONFIG_INT(ClSplitsComparisonForceCategory, cm_splits_comparisonforcecategory, 0, 0, 4, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to always use ranks from a certain category for the comparison time (1: any, 2: team, 3: dummy, 4: solo)")
MACRO_CONFIG_INT(ClShowhudSplits, cm_showhud_splits, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show ingame HUD (Splits) (2 to show on maps with no splits)")
MACRO_CONFIG_INT(ClSplitsDisplaySegmentTime, cm_splits_displaysegmenttime, 0, 0, 3, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to show split times as run time or segment time (0: both run, 1: check segment and total run, 2: check run and total segment, 3: both segment)")
MACRO_CONFIG_INT(ClSplitsNameFormat, cm_splits_nameformat, 0, 0, 4, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The format of split names (0: from → to, 1: from, 2: to, 3/4: same as 1/2 if segments are in order else same as 0)")
MACRO_CONFIG_INT(ClSplitsMaxRowsInRun, cm_splits_maxrowsinrun, 5, 0, 26, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The number of splits to show while in a run")
MACRO_CONFIG_INT(ClSplitsMaxRowsBeforeRun, cm_splits_maxrowsbeforerun, 26, 0, 26, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The number of splits to show before starting a run")
MACRO_CONFIG_INT(ClSplitsMaxRowsAfterRun, cm_splits_maxrowsafterrun, 26, 0, 26, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The number of splits to show after finishing a run")
MACRO_CONFIG_INT(ClSplitsAlwaysShowFinalSplit, cm_splits_alwaysshowfinalsplit, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to always show the final split")
MACRO_CONFIG_INT(ClSplitsMaximumCurrentCheck, cm_splits_maximumcurrentcheck, 10, -1, 86400, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The maximum current split check time to show in seconds (-1 to always show)")
MACRO_CONFIG_INT(ClSplitsShowMap, cm_splits_showmap, 1, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the current map on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowSplits, cm_splits_showsplits, 1, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the splits on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowCategory, cm_splits_showcategory, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the current rank category on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowTimer, cm_splits_showtimer, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the run timer on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowLastSegment, cm_splits_showlastsegment, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the previous segment time on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowFurthest, cm_splits_showfurthest, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the furthest segment on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowSumOfBest, cm_splits_showsumofbest, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the sum of best segments on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowCurrentPace, cm_splits_showcurrentpace, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the current pace on the splits HUD")
MACRO_CONFIG_INT(ClSplitsShowBestPossible, cm_splits_showbestpossible, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the best possible finish time on the splits HUD")
MACRO_CONFIG_INT(ClSplitsLabels, cm_splits_labels, 1, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to show labels for items on the splits HUD (0: no, 1: small, 2: full size)")
MACRO_CONFIG_INT(ClSplitsX, cm_splits_x, 22, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Horizontal position of splits as percentage of screen width")

// Hook/weapon collision lines
MACRO_CONFIG_INT(ClHookCollAlwaysAlpha, cm_hook_coll_always_alpha, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Alpha of always rendered hook collision lines (0 disabled, 100 fully visible)")

// Hookthrough entities
MACRO_CONFIG_INT(ClEntityHookthroughEnable, cm_entityhookthrough_enable, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable transparent hookthrough tiles (0: none, 1: only new hookthrough, 2: old and new hookthrough)(requires a map reload)")
MACRO_CONFIG_INT(ClEntityHookthroughAlpha, cm_entityhookthrough_alpha, 50, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Alpha of hookthrough tiles")
MACRO_CONFIG_COL(ClEntityHookthroughColor, cm_entityhookthrough_color, 255, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Color to blend with hookthrough tiles")
MACRO_CONFIG_INT(ClEntityHookthroughHide, cm_entityhookthrough_hide, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to hide tiles causing hookthrough (2 to hide some old hookthrough)")

// Antiping/prediction
MACRO_CONFIG_INT(ClPredictionTeleportTiles, cm_prediction_teleporttiles, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to predict teleport tiles")
MACRO_CONFIG_INT(ClPredictionMarginAdjust, cm_prediction_margin_adjust, 0, 0, 300, CFGFLAG_CLIENT | CFGFLAG_SAVE, "The maximum amount to adjust the prediction margin upwards on lag spikes (0 to disable)")

// Low level stuff
MACRO_CONFIG_INT(ClIntraTick, cm_intratick, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable intra tick")

// Special skins
MACRO_CONFIG_STR(ClNinjaSkin, cm_ninja_skin, 24, "x_ninja", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Skin of tees with ninja (requires a client restart to change)")
MACRO_CONFIG_STR(ClFreezeSkin, cm_freeze_skin, 24, "x_ninja", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Skin of frozen tees (blank to use cm_freeze_color instead) (requires a client restart to change)")
MACRO_CONFIG_STR(ClDeepFreezeSkin, cm_deepfreeze_skin, 24, "x_ninja", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Skin of deep frozen tees (blank to use cm_deepfreeze_color instead) (requires a client restart to change)")
MACRO_CONFIG_STR(ClLiveFreezeSkin, cm_livefreeze_skin, 24, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Skin of live frozen tees (blank to use cm_livefreeze_color instead) (requires a client restart to change)")
MACRO_CONFIG_STR(ClSpecSkin, cm_spec_skin, 24, "x_spec", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Skin of spec indicators (requires a client restart to change)")
MACRO_CONFIG_COL(ClFreezeColor, cm_freeze_color, 127, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Color of frozen tees (only used if cm_freeze_skin is blank)")
MACRO_CONFIG_COL(ClDeepFreezeColor, cm_deepfreeze_color, 63, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Color of deep frozen tees (only used if cm_deepfreeze_skin is blank)")
MACRO_CONFIG_COL(ClLiveFreezeColor, cm_livefreeze_color, 255, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Color of live frozen tees (only used if cm_livefreeze_skin is blank)")
MACRO_CONFIG_INT(ClFNGNinjaToFrozen, cm_fng_ninjatofrozen, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Convert players with ninja to frozen players on FNG servers")
MACRO_CONFIG_INT(ClFNGDeepFrozenToFrozen, cm_fng_deepfrozentofrozen, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Convert deep frozen players to frozen players on FNG servers")

// Self colored lasers
MACRO_CONFIG_INT(ClLaserSelfColor, cm_laser_self_color, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to color lasers matching the player that fired them")

// Inactive stuff
MACRO_CONFIG_INT(ClInactiveConditions, cm_inactive_conditions, 0, 0, 7, CFGFLAG_CLIENT | CFGFLAG_SAVE, "What conditions are considered inactive (add 1 for menu open, add 2 for editor open, add 4 for game window is not focused)")
MACRO_CONFIG_INT(ClInactivePause, cm_inactive_pause, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to /pause when gameplay is not focused")
MACRO_CONFIG_INT(ClInactiveZzz, cm_inactive_zzz, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to send zzz emotes if players are nearby when gameplay is not focused")

// Paused move notification
MACRO_CONFIG_INT(ClPausedMoveNotifyTimeout, cm_pausedmove_notifytimeout, 0, 0, 60, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How long the player should be still for before notifications for being moved while paused are allowed again. 0 to disable notifications for being moved while paused.")

// HUD
MACRO_CONFIG_INT(ClScoreHudSelfOnly, cm_scorehud_selfonly, 0, 0, 3, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Whether to only show the local player's score in the score HUD (0: never, 1: time scores, 2: point scores, 3: always)")
MACRO_CONFIG_INT(ClMovementInformationCompact, cm_movementinformation_compact, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "When enabled, makes the movement information HUD more compact")
