﻿
── ■ │ WHAT IS THIS APPENDIX ABOUT? (v2.01.06) │ ■ ────────────────────────────────────────────────

View this document on GitHub: https://github.com/rng-guy/NFSMWBartender/blob/master/APPENDIX.md

This document contains the full TECHNICAL DETAILS AND LIMITATIONS of Bartender and its features,
and it also mentions any incompatible features of other .asi mods wherever they are relevant.
For a quick overview of what you may need to disable for Bartender to work, see the README.

You really ONLY NEED TO READ THIS DOCUMENT if
 • you have persistent issues with your game after installing / configuring Bartender, or
 • you are curious about the technicalities and limitations of Bartender or its features.

First, if Bartender's .asi file gets FALSELY FLAGGED AS A VIRUS by your antivirus software,
you will need to whitelist the file. If the flagging happens as you attempt to launch your
game with Bartender installed, the .asi loader will display a pop-up window with an error
message ("Error code: 225") before your antivirus likely (re)moves the .asi file.

Last, there are three POSSIBLE CAUSES FOR IN-GAME ISSUES you might encounter with Bartender:
 • features of other .asi mods that make changes to the same parts of the game as Bartender,
 • the quirks of how Bartender reads and processes parameters in its configuration files, or
 • the actual parameter values themselves that you define in Bartender's configuration files.

To help you SOLVE IN-GAME ISSUES with Bartender, the sections below address these questions:
 1) • What is there to know about Bartender's file parsing?
 2) • What is there to know about the "Basic" feature set?
 3) • What is there to know about the "Advanced" feature set?
 4) • What changed in each version of Bartender?






── ■ 1 - WHAT IS THERE TO KNOW ABOUT BARTENDER'S FILE PARSING? ■ ──────────────────────────────────

Bartender only recognises HEAT LEVELS from 1 to 10. If you want to use Bartender to customise
Heat levels above 10, you need to recompile it with the appropriate "maxHeatLevel" value yourself.

Bartender parses its configuration (.ini) files in PARAMETER GROUPS, indicated by "[GroupName]".
These groups each contain related parameters and give a logical structure in the configuration
files. Each group allows you to define values, either in relation to Heat levels or vehicles.

Bartender can handle any INVALID / MISSING PARAMETER GROUPS in its configuration files:
 • duplicate (e.g. another "[State:Busting]") and unknown groups are ignored, and
 • missing groups make Bartender count each of their would-be values as omitted.

Bartender can handle any INVALID VALUES you might define in its parameter groups:
 • duplicates (e.g. another "heat02" value) within parameter groups are ignored,
 • values of incorrect type (e.g. a string instead of a decimal) count as omitted,
 • negative values that should be positive are set to 0 instead of counting as omitted,
 • mismatched interval values (i.e. where "max" < "min") are each set to the lower value, and
 • comma-separated value pairs / tuples with too many or too few (valid) values count as omitted.

Some parameter groups allow you to define DEFAULT VALUES, indicated by "default" in place of
a Heat level or vehicle. These default values then apply to all Heat levels or vehicles for
which you don't define explicit values. Bartender parses such parameter groups in three steps:
 1) • If you omit it, the "default" value is set to the game's vanilla (i.e. unmodded) value.
 2) • All free-roam Heat levels (format: "heatXY") you omit are set to the "default" value.
 3) • All race Heat levels (format: "raceXY") you omit are set to their free-roam values.

Bartender can handle any INVALID VEHICLES you might define in its configuration files,
both as values themselves and as something for which you define other values. The sections
below mention how Bartender does this on a case-by-case basis, but a vehicle is invalid if
 • it doesn't exist in the game's database (i.e. lacks a VltEd node under "pvehicle"), or
 • it's of the wrong class (e.g. is a helicopter when Bartender expects a regular car).

The CLASS OF A VEHICLE depends on the "CLASS" VltEd parameter in its "pvehicle" node. Bartender
considers a "CLASS" value of "CHOPPER" to represent a helicopter, and every other value a car.
Most vanilla vehicles lack an explicit "CLASS" parameter in their "pvehicle" nodes because they
inherit one from parent nodes instead, but you can add one manually to overwrite it if you wish.






── ■ 2 - WHAT IS THERE TO KNOW ABOUT THE "BASIC" FEATURE SET? ■ ───────────────────────────────────

Regarding the "Basic" feature set AS A WHOLE:

 • The configuration (.ini) files for this feature set are located in "BartenderSettings\Basic".

 • The unedited configuration files for this feature set use the game's vanilla values.

 • You can disable this entire feature set by deleting all of its configuration files.

 • You can disable any feature of this set by deleting the file containing its parameter group.
   Fixes, however, don't have parameters and are tied to specific files implicitly instead.

 • To disable the shadow and Heat-level fixes, delete all configuration files of this feature set.

 • The Heat-level reset fix is incompatible with the "HeatLevelOverride" feature of the 
   "NFSMW ExtraOptions" mod by ExOptsTeam. To disable this ExtraOptions feature, edit its
   "NFSMWExtraOptionsSettings.ini" configuration file. If you do this, you can still change 
   the maximum available Heat level with VltEd: The "0xe8c24416" parameter of a given
   "race_bin_XY" VltEd node determines the maximum Heat level (1-10) at Blacklist rival #XY.

 • If you don't install the optional missing textures ("FixMissingTextures.end"), then the
   game won't display a number next to Heat gauges in menus for cars with Heat levels > 5.
   Whether you install these textures doesn't affect the Heat-level reset fix in any way.



Regarding COSMETIC FEATURES ("BartenderSettings\Basic\Cosmetic.ini"):

 • The cop-destruction string feature is incompatible with the "EnableCopDestroyedStringHook"
   feature of the "NFSMW Unlimiter" mod by nlgxzef. To resolve this conflict, either delete 
   Bartender's "[Vehicles:Strings]" parameter group or disable Unlimiter's version
   of the feature by editing its "NFSMWUnlimiterSettings.ini" configuration file.

 • You can use the "Binary" tool by MaxHwoy to edit the game's strings and add new ones.

 • For destruction strings, Bartender ignores vehicles and strings that don't exist in the game.

 • If you don't define a valid "default" string, string-less vehicles won't trigger notifications.

 • If you define no vehicle strings and no "default", Bartender disables its string feature.

 • You might hear cops use callsigns you didn't assign to them. This is vanilla behaviour:
   The game maintains a pool of "actors" that it constantly shuffles between all active vehicles.
   This is also the reason why you may still hear Cross or helicopter lines even if they are gone,
   and why dispatch may sometimes refer to Cross by the callsign of another unrelated vehicle.

 • The game automatically assigns the helicopter-exclusive callsign to all helicopters.

 • For callsigns, Bartender ignores vehicles that are helicopters or don't exist in the game. 
   Bartender also ignores all callsigns other than "patrol", "elite", "rhino", and "cross".

 • If you don't define a valid "default" callsign, Bartender uses "patrol" instead.

 • If you define no vehicle callsigns and no "default", Bartender disables its callsign feature.

 • You can define a playlist of up to 20 tracks using the game's four interactive pursuit themes. 
   By default, Bartender loops through this custom playlist from top to bottom in each pursuit.

 • For the pursuit-theme playlist, Bartender ignores themes that don't exist in the game.

 • If you don't define any valid tracks, Bartender disables all its playlist features.

 • Bartender can shuffle the first playlist track that plays in each pursuit,
   and / or shuffle the follow-up track(s) instead of playing them in order.

 • If you don't define any shuffle settings, Bartender shuffles the first track in each pursuit.

 • If you don't define a track length, the first track in each pursuit keeps playing forever.

 • Track transitions may take a few minutes (at worst) due to quirks of the audio scheduler.



Regarding GENERAL FEATURES ("BartenderSettings\Basic\General.ini"):

 • Deleting this file disables the fix for getting busted while the green "EVADE" bar fills.

 • The "0x1e2a1051" VltEd parameter defines how much passive bounty you gain after each interval.

 • The "DestroyCopBonusTime" VltEd parameter defines the time window for combo-bounty streaks.

 • Bartender sets all combo-bounty multiplier limits that are < 1 to 1 instead.

 • The red "BUSTED" bar fills when you drive slowly enough and are near a cop who can see you.
   Once the bar is full, the cops apprehend you and end the pursuit in their favour.

 • The cops' visual range limits the effective max. bust distance. The cops' visual range is
   defined by the "frontLOSdistance", "rearLOSdistance", and "heliLOSdistance" VltEd parameters.

 • The "BustSpeed" VltEd parameter defines the speed threshold for busting.
   
 • The green "EVADE" bar fills when you are not within line of sight of any cops. Once the bar
   is full, you enter "COOLDOWN" mode and need to stay hidden for a while to escape the pursuit.

 • The "evadetimeout" VltEd parameter defines how long you need to stay hidden in "COOLDOWN" mode.

 • The time you spend filling the green "EVADE" bar also counts towards how long you need to stay
   hidden in "COOLDOWN" mode. If the "EVADE" bar takes longer to fill, you escape instantly.

 • The two checks for whether a flipped cop should be destroyed are mutually independent:
   One check is damage-based, while the other is time-based and disregards vehicle damage.

 • The time-based flip check only happens at Heat levels for which you define a valid delay value.

 • Resets of flipped racers only happen at Heat levels for which you define a valid delay value.



Regarding GROUND SUPPORTS ("BartenderSettings\Basic\Supports.ini"):

 • Deleting this file disables the fix for the biases in the game's Strategy-selection process.

 • When the game requests a non-Strategy roadblock, a random roadblock cooldown begins.
   While this cooldown is active, the game cannot make more non-Strategy roadblock requests.

 • When the game requests a Strategy, a fixed-length Strategy cooldown begins.
   While this cooldown is active, the game cannot make more Strategy requests.

 • When the game requests a HeavyStrategy, it (re)sets the roadblock cooldown to a fixed value.

 • Not every request results in a successful spawn of whatever the game requested.

 • Bartender can prevent HeavyStrategy 3 requests from resetting the roadblock cooldown.
   This avoids the potential issue of roadblocks becoming much rarer than expected.

 • Strategy requests block each other: Whenever there is an active Strategy request, the game
   will not attempt to make more. You can change this with Bartender's "Advanced" feature set.

 • In the vanilla game, active roadblocks of any kind also block new HeavyStrategy 3 requests.
   Bartender can prevent this blocking, making HeavyStrategy 3 requests much more frequent.

 • Strategy requests end when their "Duration" VltEd parameters expire or their vehicles are gone.

 • Bartender fixes the game's implicit biases in its Strategy-selection process by forcing it
   to check every available Strategy before making a new request. The vanilla game instead
   goes through them in the same order as they are defined in VltEd, making the game
   much more likely to request whatever Strategy happens to come first there.

 • The "MinimumSupportDelay" VltEd parameter defines how much time needs to pass before
   the game can make non-Strategy roadblock and Strategy requests in a given pursuit.

 • Vehicles joining pursuits from roadblocks after some time is vanilla behaviour, but the
   age threshold usually makes it a rare event because most roadblocks despawn too early.

 • You shouldn't use low roadblock-age thresholds (< 20 seconds) for roadblock vehicles to join
   the pursuit: Too many vehicles joining can cause game instability, as they ignore spawn limits.

 • Age-based joining from roadblocks only happens at Heat levels for which you define valid age
   and distance values, and has no bearing on other means by which roadblock vehicles may join.

 • Roadblock vehicles can react to the pursuit entering "COOLDOWN" mode and / or spike-strip hits.
   For the former, one vehicle joins the pursuit; for the latter, all of them join the pursuit.

 • LeaderStrategy 5 spawns Cross by himself, while LeaderStrategy 7 spawns him with two henchmen.

 • You shouldn't use the replacement vehicles for Cross for any other cop in the game 
   unless you also use Bartender's "Advanced" feature set. Otherwise, these vehicles
   interfere with LeaderStrategy spawns whenever they are present in the pursuit.

 • Bartender replaces vehicles that don't exist in the game with whatever the vanilla game uses.

 • Bartender replaces vehicles that are helicopters with whatever the vanilla game uses.






── ■ 3 - WHAT IS THERE TO KNOW ABOUT THE "ADVANCED" FEATURE SET? ■ ────────────────────────────────

Regarding the "Advanced" feature set AS A WHOLE:

 • The configuration (.ini) files for this feature set are located in "BartenderSettings\Advanced".

 • The unedited configuration files for this feature set approximate the game's vanilla values.

 • You can disable this entire feature set by deleting all of its configuration files.

 • Bartender disables this feature set if you leave any free-roam "Chasers" spawn table empty.

 • Rarely, the engagement count above the pursuit board may appear to be inaccurate compared
   to how many cops are actually around you at a given moment. That is because Bartender's
   fix makes the engagement count track "Chasers" only, while disregarding any vehicles
   that join the pursuit through Strategy spawns, from roadblocks, or as helicopters.

 • For each Heat level, you should set a "FullEngagementCopCount" VltEd parameter > 0.
   Otherwise, Bartender may fail to update the displayed engagement count accurately.

 • If enabled, this feature set overrides the following "pursuitlevels" VltEd parameters:
   the "cops" array, "HeliFuelTime", "TimeBetweenHeliActive", and "SearchModeHeliSpawnChance".


   
Regarding COP (DE / RE)SPAWNING ("BartenderSettings\Advanced\Cars.ini"):

 • A minimum engagement count > 0 allows that many "Chasers" to (re)spawn without backup. This
   minimum count doesn't spawn cops beyond their "count" values or the global cop-spawn limit.

 • In "COOLDOWN" mode, the "NumPatrolCars" VltEd parameter overrides the min. engagement count.

 • The global cop-spawn limit determines whether the game may spawn new "Chasers" at any point.
   The game can spawn additional "Chasers" as long as the total amount of non-roadblock and
   non-helicopter cops that currently exist across all pursuits is less than this global
   limit. This also means that any active Strategy spawns or NPC pursuits can affect 
   how many more "Chasers" can still spawn in your pursuit (this is vanilla behaviour).

 • The global cop-spawn limit takes precedence over all other spawning-related parameters, except
   for the "NumPatrolCars" VltEd parameter outside of active pursuits (this is vanilla behaviour).

 • If you want to use global cop-spawn limits > 8 and / or make "Chasers" spawns independent
   of other vehicles, you must also install and configure the "NFSMW LimitAdjuster" mod (LA) by 
   Zolika1351. This is necessary because the vanilla game becomes unstable if there are too many
   vehicles present. To configure LA to work with Bartender, open LA's "NFSMWLimitAdjuster.ini"
   configuration file; there, set "PursuitCops" to 255 and disable every single cop-related feature
   under "[Options]". After configuring LA like this, use Bartender to set global cop-spawn limits.

 • "Chasers" will only flee at Heat levels for which you define valid flee-delay values.
   
 • Bartender uses the free-roam "Chasers" spawn tables (which must contain at least one vehicle) 
   in place of all free-roam "Roadblocks", "Events", and "Patrols" spawn tables you leave empty.

 • Bartender uses the free-roam spawn tables in place of all race spawn tables you leave empty.

 • Bartender ignores vehicles that are helicopters or don't exist in the game.

 • Bartender adds a "copmidsize" to each non-empty table that contains only ignored vehicles.

 • The "chance" values are weights (like in VltEd), not percentages. The actual spawn chance of
   a vehicle is its "chance" value divided by the sum of the "chance" values of all vehicles from
   the same spawn table. Whenever a vehicle reaches its "count" value (i.e. spawn cap), Bartender
   treats its "chance" value as 0 until there is room for further spawns of that vehicle again.

 • Bartender sets all "count" and "chance" values that are < 1 to 1 instead.

 • Bartender enforces the "count" values for "Chasers" for each active pursuit separately.
   For "Roadblocks" / "Events", Bartender enforces "count" values for each roadblock / event.
   "Patrols" lack "count" values because they technically don't belong to anything trackable.

 • Once they join the pursuit, "Events" and "Patrols" spawns also count as "Chasers" as far
   as membership (i.e. fleeing decisions) and the "count" values of "Chasers" are concerned.

 • The "Roadblocks" spawn tables don't apply to HeavyStrategy 4 roadblocks.

 • Each roadblock / event in the game requests a hard-coded number of vehicles. No roadblock
   formation in the game requests more than 5 vehicles, and no scripted event more than 8.

 • Bartender temporarily ignores the "count" values in a "Roadblocks" / "Events" spawn table
   whenever a roadblock / event requests more vehicles in total than they would otherwise allow.
   This ensures the game cannot get stuck trying to spawn a roadblock or start a scripted event.

 • Vehicles in "Roadblocks" spawn tables are not equally likely to spawn in every vehicle position 
   of a given roadblock formation. This is because the game processes roadblock spawns in a fixed,
   formation-dependent order, making it (e.g.) more likely for vehicles with low "count" and high
   "chance" values to spawn in any position that happens to be processed first. This doesn't apply
   to vehicles with "count" values of at least 5, as no roadblock consists of more than 5 cars.

 • Rarely, vehicles that are not in a "Roadblocks" spawn table will still show up in roadblocks.
   This is a vanilla bug: it usually happens when the game attempts to spawn a vehicle while it's
   processing a roadblock request, causing it to place the wrong car in the requested roadblock.
   Even more rarely than that, this bug can also happen with traffic cars or the helicopter.

 • The "Events" spawn tables also apply to the scripted patrols in prologue (DDay) race events.

 • The "Events" spawn tables don't apply to the very first scripted, pre-generated cop that
   spawns in a given free-roam event (e.g. a Challenge Series pursuit). Instead, this first cop
   is always of the type defined by the event's "CopSpawnType" VltEd parameter. This is because
   the game requests this vehicle before it loads any pursuit or Heat-level information, making
   it impossible for Bartender to know which spawn table to use for just this single vehicle.

 • You shouldn't use fast Heat transitions ("0x80deb840" VltEd parameter(s) set to < 5 seconds),
   else you might see a mix of cops from more than one "Events" spawn table appear in events with
   scripted, pre-generated cops. This happens because, depending on your loading times, the game
   might update the Heat level as it requests those spawns. You can avoid this issue by setting
   the event's "ForceHeatLevel" VltEd parameter to the target Heat level instead.

 • Bartender uses different spawn tables for each of the two patrol-spawn types in the game:
   "Patrols" tables replace the free patrols that spawn when there is no active pursuit,
   and "Chasers" tables replace the searching patrols that spawn in pursuits when you are
   in "COOLDOWN" mode. You can control the number of patrol spawns through the "NumPatrolCars"
   VltEd parameter, but there are two important quirks: Free patrol spawns ignore the global
   cop-spawn limit, while searching patrol spawns ignore the remaining engagement count.



Regarding HELICOPTER (RE)SPAWNING AND FUEL ("BartenderSettings\Advanced\Helicopter.ini"):

 • Bartender uses separate, random timers for (re)spawning the helicopter and setting its fuel.
   Each despawn context (e.g. the helicopter getting wrecked) has its own respawn-delay interval.

 • The helicopter only (re)spawns at Heat levels for which you define valid (re)spawn-delay values.

 • In a given pursuit, the helicopter must have a successful first spawn at some point before
   context-dependent respawns can happen. Such first spawns carry over across Heat transitions.
 
 • If you don't define valid respawn-delay values for some despawn context (e.g. getting wrecked),
   then the helicopter won't respawn if that context happens. If a transition to another Heat
   level with valid respawn-delay values takes place, however, the helicopter may respawn again.

 • The helicopter can only rejoin after losing you at Heat levels for which you define valid 
   rejoin-delay and minimum-fuel values. The helicopter can only rejoin if it loses you.

 • The helicopter rejoins with whatever amount of fuel it had left, minus the rejoin delay.
   If the helicopter were to rejoin with less fuel than the required minimum, it counts as
   having run out of fuel and triggers the appropriate respawn delay instead.

 • Whether an active helicopter may rejoin a given pursuit is unaffected by Heat transitions,
   as this is locked in as soon as it (re)spawns. This means a rejoining helicopter can keep
   rejoining the pursuit until it either gets wrecked or runs out of fuel. Its vehicle
   is also locked in to ensure it rejoins with the same model and overall properties.

 • Rejoining helicopters don't count towards the total number of helicopters deployed.

 • The helicopter only spawns with limited fuel at Heat levels for which you define valid
   fuel-time values. Unlimited fuel means the helicopter must either lose you or get wrecked.

 • The helicopter also (re)spawns in "COOLDOWN" mode according to its (re)spawn delays.

 • The helicopter only ever (re)spawns and rejoins in player pursuits.

 • Only one helicopter can ever be active at any given time. This is a game limitation;
   we could technically spawn more, but they would count as cars and behave very oddly.

 • The helicopter uses whatever HeliStrategy you set in VltEd.

 • Bartender replaces vehicles that don't exist in the game with "copheli".

 • Bartender replaces vehicles that aren't helicopters with "copheli".

   

Regarding STRATEGY REQUESTS ("BartenderSettings\Advanced\Strategies.ini"):

 • Defining low racer-speed thresholds for HeavyStrategy 3 spawns fixes the vanilla issue of
   them attempting to flee the pursuit instantly without trying to ram anything. This is because
   the vanilla game forces HeavyStrategy 3 spawns to flee if the racer's speed drops below the
   "CollapseSpeed" VltEd parameter at any point. At higher Heat levels, this can lead to many
   passive spawns because of higher "CollapseSpeed" values and far more aggressive cops.

 • LeaderStrategy Cross and / or his henchmen only become aggressive at Heat levels for which you
   define valid aggro-delay values. Henchmen, however, always become aggressive when Cross leaves.

 • Once aggressive, Cross and / or his henchmen act like regular cops and can join formations.
   Also, neither Cross nor his henchmen can return to being passive again until they despawn.

 • Aggro delays longer than a given LeaderStrategy's "Duration" VltEd parameter have no effect.

 • The aggro delays of any active LeaderStrategy are unaffected by Heat transitions,
   as their values are locked in as soon as the game requests said LeaderStrategy.

 • Resets of Cross' spawn flag only happen at Heat levels for which you define valid
   reset-delay values. The vanilla game never resets this flag if Cross gets wrecked.

 • Once Cross' spawn flag is reset, the game can attempt LeaderStrategy requests again.

 • For LeaderStrategy 7, the henchmen must also despawn first before the game can request
   another Strategy. You can circumvent this with Bartender's unblocking feature (see below).

 • Bartender can unblock the Strategy-request queue while there is still an active Strategy.
   Without unblocking, an active Strategy request prevents the game from making a new request.
   Unblocking allows multiple Strategy requests to spawn at the same time, and they each continue
   until either their "Duration" VltEd parameters expire or all their vehicles have despawned.

 • If enabled, Bartender unblocks the request queue after each successful Strategy spawn.

 • Bartender only unblocks requests at Heat levels for which you define valid unblock-delay values.

 • Unblock delays longer than a given Strategy's "Duration" VltEd parameter have no effect.

 • The unblock delays of any active Strategy are unaffected by Heat transitions,
   as their values are locked in as soon as the game spawns said Strategy.

 • Even with unblocking, no new LeaderStrategy can spawn while a LeaderStrategy Cross is present.

 • It is generally safe to use unblock delays of 0 for HeavyStrategy 4 and LeaderStrategy 5 / 7.

 • You shouldn't use short unblock delays for HeavyStrategy 3. Having too many overlapping
   HeavyStrategy 3 spawns can lead to game instability since they ignore all spawn limits.
   It's often better to just use a lower (~20 seconds) "Duration" VltEd parameter instead.






── ■ │ 4 - WHAT CHANGED IN EACH VERSION OF BARTENDER? │ ■ ─────────────────────────────────────────

v1.00.00: Initial release
      01: Revised "LIMITATIONS" section of README
      02: Revised multiple sections of README
      03: Yet another minor README revision
      04: README? More like "FIXME"
      05: Clarified "Events" spawns in "Cars.ini"
      06: Clarified string assignment in "Labels.ini"
      07: Clarified ignored VltEd parameters when "Advanced" feature set is enabled
      08: Corrected a few typos in README
      09: Clarified cooldowns in "Supports.ini" and helicopter spawns in "Helicopter.ini"
      10: Revised multiple .ini comments and enforced consistency
      11: Further clarified cooldowns in "Supports.ini"
      12: Improved formatting of .ini files and expanded "LIMITATIONS" section of README
      13: Added compatibility note for VltEd and other .asi mods in "LIMITATIONS" section of README
      14: Added compatibility note for Binary mods in "LIMITATIONS" section of README
      15: Added note about README structure
      16: Clarified stability of "NFSMW LimitAdjuster" in "LIMITATIONS" section of README

   01.00: Fixed a bug with vehicle names containing underscores
      01: Removed some superfluous memory patches

   02.00: Improved thread safety of cop-spawn interceptor functions
      01: Rephrased spawning-related entries in "LIMITATIONS" section of README
      02: Removed redundant push / pop instructions

   03.00: Fixed the Heat-level update in free-roam and a rare bug of the game miscounting cops
      01: Rephrased "LIMITATIONS" section of README yet again

   04.00: Added post-race pursuit hook and changed cop count to decrement after full despawns only
      01: Added workaround for vanilla bug of fleeing HeavyStrategy 3 spawns ("ADVANCED" set only)
      02: Improved phrasing and corrected some typos in README

   05.00: Added "count" support to custom "Roadblocks" and "Events" spawn tables
      01: Rephrased README to better reflect recent changes to both feature sets
      02: Restructured "LIMITATIONS" section of README and renamed both "General.ini" files
      03: Restructured and rephrased README some more
      04: Merged "Behaviour.ini" with "Cars.ini" file
      05: Clarified global cop-spawn limit in "LIMITATIONS" section of README and "Cars.ini" file
      06: Added missing number-format comment to "Others.ini" file

   06.00: Fixed incorrect labelling of roadblock vehicles joining pursuits after spike-strip hits
      01: Made terminology in README and .ini files files more consistent, and rephrased some parts

   07.00: Fixed Heavy / LeaderStrategy spawns not fleeing as per their "Duration" VltEd parameters
      01: Improved general performance of cop management functions for the "ADVANCED" set
      02: Clarified some ambiguous phrasing in "LIMITATIONS" section of README
      03: Clarified the different types of patrol spawns in README and "Cars.ini" file
      04: Rephrased parts of the README for what feels like the millionth time

   08.00: Added support for separate free-roam and race pursuit parameters
      01: Improved performance slightly and expanded "LIMITATIONS" section of README

   09.00: Added fixes for Heat levels above 5 resetting and missing menu textures in Career mode
      01: It's a bird! It's a plane! No, it's yet another fresh batch of phrasing corrections!
      02: Added information about enabling / disabling individual bug fixes to README
      03: Clarified logic of spawn-table copying in "LIMITATIONS" section of README
      04: Corrected mislabelled spawn tables in "LIMITATIONS" section of README
      05: Rephrased a couple more parts of the README to remove ambiguity
      06: Overhauled entire README and renamed parameter group in "Labels.ini" file
      07: Improved clarity of README by replacing most references with nouns

   10.00: Assigned correct spawn table to first cop spawn in Career milestone / bounty pursuits
      01: Improved readability of README by overhauling language and phrasing throughout
      02: Expanded all comments and also rearranged busting parameters in configuration files
      03: Further expanded file parsing and usage notes subsections in README
      04: Edited configuration files of "Advanced" feature set to use the game's vanilla values

   11.00: Fixed "Events" spawn tables not applying to scripted patrol spawns in prologue races
      01: Added missing reset hook for "Events" spawn tables between consecutive (prologue) races
      02: Made phrasing of comments in configuration files more internally consistent
      03: Clarified comments about "NFSMW LimitAdjuster" in "Cars.ini" file and README
      04: Improved performance slightly by removing redundant assembly instructions

   12.00: Added fix for vanilla helicopter shadows and further improved performance
      01: Improved performance even more by removing redundant re-hashing
      02: Fixed rare edge case of "Events" spawns temporarily blocking "Chasers" spawns
      03: Another performance improvement by reducing re-hashing even further

   13.00: Improved performance by rewriting and streamlining the internal file-parsing logic
      01: Added checks for whether vehicles in configuration files exist and are of the right class
      02: Improved and overhauled the documentation for (hopefully) the last god-damn time
      03: Improved consistency of the fix for less frequent support spawns in longer pursuits

   14.00: Added fix for the vanilla bug of HeavyStrategy 3 spawns fleeing pursuits too early
      01: Improved performance some more thanks to my newfound disregard for antivirus evasion
      02: Fixed a few minor inconsistencies in README and some usage comments
      03: Fixed HeavyStrategy 3 fix slowing cop spawns in longer pursuits

   15.00: Added fix for vanilla bug of active roadblocks blocking new HeavyStrategy 3 requests
   
   16.00: Added many more features and basically overhauled most of the mod's existing ones
      01: Added missing fix for Cross' priority-mode check in race pursuits
      02: Simplified and optimised a few common assembly functions
      03: Fixed rare issue of fewer traffic cars than usual spawning in pursuits
      04: Improved mod compatibility by making features in "Cosmetic.ini" separately disableable
      05: Corrected outdated references to now-renamed parameter groups in some usage comments

   17.00: Added feature to customise car-resetting behaviour for flipped racers
      01: Corrected some internal default values for various parameter groups
      02: Fixed minor issues with the mod's PRNG and some CTS calculations
      03: Extended customisation options for cops joining from roadblocks

   18.00: Simplified interactive-music feature and added support for independent "Chasers" spawns

 2.00.00: Overhauled most mod internals and expanded some helicopter-related features
      01: Made a few minor phrasing adjustments in README and some usage comments
      02: Streamlined and slightly improved a few mod internals further
      03: More work on mod internals and the interactive-music feature
      04: Rephrased README and a few outdated usage comment
      05: Yet more README and usage-comment changes

   01.00: Overhauled the non-player pursuit customisation and the interactive-music features
      01: Corrected a few minor oversights in "Cosmetic.ini" configuration file
      02: Further improved documentation and code for Strategy features
      03: Prettified assorted assembly code that nobody else reads
      04: Optimised and foolproofed some more assembly code
      05: Made even more OCD-fuelled assembly improvements
      06: Fixed an issue with scripted Heat changes in Career mode