AllCops:
  TargetRubyVersion: "3.0"
  NewCops: enable

#===============================================================================
# Layout
#===============================================================================

# We don't need empty lines in methods to separate "return if"s from later code.
Layout/EmptyLineAfterGuardClause:
  Enabled: false

# Extra whitespace often helps to make code more presentable.
Layout/ExtraSpacing:
  AllowForAlignment: true
  AllowBeforeTrailingComments: true

# Looks better than having hash elements shifted way to the right just to line
# up with the hash's opening bracket.
Layout/FirstHashElementIndentation:
  EnforcedStyle: consistent

# In a hash with multiple values (one per line), prefer the => to be lined up
# and text to otherwise be left-aligned.
Layout/HashAlignment:
  EnforcedHashRocketStyle: table
  EnforcedColonStyle: table

# This interferes with the presentation of some code, notably registered procs.
Layout/MultilineMethodCallBraceLayout:
  Enabled: false

# This means hashes and arrays are written the same way, rather than hashes
# needing to be written like { foo => bar } while arrays are like [foo, bar].
Layout/SpaceInsideHashLiteralBraces:
  EnforcedStyle: no_space

#===============================================================================
# Lint
#===============================================================================

# Some methods and blocks will have unused arguments. That's fine.
Lint/UnusedBlockArgument:
  Enabled: false
Lint/UnusedMethodArgument:
  Enabled: false

#===============================================================================
# Metrics
#===============================================================================

# Yes, Essentials has classes/modules/methods that are too big and complex.
# That's just how it is.
Metrics:
  Enabled: false

#===============================================================================
# Naming
#===============================================================================

# This cop forbids class/module names with underscores in them. Having
# underscores isn't the end of the world.
Naming/ClassAndModuleCamelCase:
  Enabled: false

# Script files are given names that look reasonable in the list of script
# sections in RMXP, and are all numbered. They won't be camel_case.
Naming/FileName:
  Enabled: false

# Disabled for sanity's sake. While this is a cop we want to obey, fixing all
# this is a gargantuan task that may never be completed, and we don't need
# rubocop telling us about the 4000+ instances of camelCase method names.
Naming/MethodName:
  Enabled: false

# Disabled for sanity's sake. While this is a cop we want to obey, fixing all
# this is a gargantuan task that may never be completed, and we don't need
# rubocop telling us about the 1500+ instances of camelCase parameter names.
Naming/MethodParameterName:
  Enabled: false

# Disabled for sanity's sake. While this is a cop we want to obey, fixing all
# this is a gargantuan task that may never be completed, and we don't need
# rubocop telling us about the 10000+ instances of camelCase variable names.
Naming/VariableName:
  Enabled: false

#===============================================================================
# Security
#===============================================================================

# Script event conditions and script switches are eval'd, amongst other things.
Security/Eval:
  Enabled: false

# Plenty of things are loaded via Marshal.
Security/MarshalLoad:
  Enabled: false

#===============================================================================
# Style
#===============================================================================

# List the attr_reader/writer/accessor variables however you want.
Style/AccessorGrouping:
  Enabled: false

# The assign_to_condition style looks awful, indenting loads of lines and
# increasing the separation between variable and value being assigned to it.
# Having said that, using "assign_inside_condition" flags every instance of
# conditional assignment using a one-line ternary operator, so this cop has been
# disabled because such assignment is fine.
Style/ConditionalAssignment:
  Enabled: false
  EnforcedStyle: assign_inside_condition

# Check with yard instead.
Style/Documentation:
  Enabled: false

# This is just shorthand that looks bad due to the lack of an "end" to a "def".
Style/EndlessMethod:
  EnforcedStyle: disallow

# It's a choice between format and sprintf. We already make use of sprintf and
# the translatable _ISPRINTF, so...
Style/FormatString:
  EnforcedStyle: sprintf

# Prefer sprintf("%s", "Hello") over sprintf("%<greeting>s", greeting: "Hello")
# because it should be easy enough to see which token is which, and it saves
# space.
Style/FormatStringToken:
  EnforcedStyle: unannotated

# String literals are not frozen by default, which makes this comment a
# pointless bit of boilerplate that we neither need nor want.
Style/FrozenStringLiteralComment:
  Enabled: false

# RMXP and Essentials use lots of global variables.
Style/GlobalVars:
  Enabled: false

# Mixing the styles within a hash just looks silly.
Style/HashSyntax:
  EnforcedStyle: no_mixed_keys

# Sometimes you want to clearly separate sets of code, one per "paradigm".
Style/IfInsideElse:
  Enabled: false
  AllowIfModifier: true

# The alernative is ->(x) { x } which is less English than "lambda". This style
# makes lambda definitions require the word "lambda".
Style/Lambda:
  EnforcedStyle: lambda

# unless just adds mental gymnastics trying to figure out what it actually
# means. I much prefer if !something.
Style/NegatedIf:
  Enabled: false

# .zero?, .positive? and .negative? are more wordy than == 0, > 0 and < 0. They
# also aren't consistent with other value comparisons, e.g. x > 42.
Style/NumericPredicate:
  EnforcedStyle: comparison

# Following this just means that calls to an affected method need to know what
# that method calls its parameters, which is ridiculous. Keep things short and
# simple.
Style/OptionalBooleanParameter:
  Enabled: false

# has_key? and has_value? are far more readable than key? and value?
Style/PreferredHashMethods:
  Enabled: false

# Explicit returns help to show whether a method returns a value.
Style/RedundantReturn:
  Enabled: false

# Enforcing the names of variables? To single letter ones? Just no.
Style/SingleLineBlockParams:
  Enabled: false

# Single line methods use up less space, and they're easier to list next to each
# other and see that they behave similarly.
Style/SingleLineMethods:
  Enabled: false

# This requires writing array[n..] instead of array[n..-1], and I think endless
# ranges look bad.
Style/SlicingWithRange:
  Enabled: false

# Single quotes being faster is hardly measurable and only affects parse time.
# Enforcing double quotes reduces the times where you need to change them
# when introducing an interpolation or an apostrophe. Use single quotes only if
# their semantics are needed.
Style/StringLiterals:
  EnforcedStyle: double_quotes

# This cop requires arrays of symbols/text to be written like %i[a b c]. We
# don't need that nonsense. ["a", "b", "c"] is clearer and introduces no
# additional syntax to confuse people.
Style/SymbolArray:
  EnforcedStyle: brackets
Style/WordArray:
  EnforcedStyle: brackets

# Allows procs to be written like { |obj| obj.something } which is clearer.
Style/SymbolProc:
  AllowMethodsWithArguments: true

# Parentheses around the condition in a ternary operator helps to differentiate
# it from the true/false results.
Style/TernaryParentheses:
  EnforcedStyle: require_parentheses

# This prefers "x += 1 while x < 10" and "x += 1 until x == 10". This hides
# loops, which is not good.
Style/WhileUntilModifier:
  Enabled: false
