Latest:da6944b2 - CLEANUP: Integrate silence track handling into the onUpdate call chain

48455ca3 - FIX: When constructing an updatingSettingsTable, copy all values out of the original table and into the shadow table, if an original table was provided

9e9054c7 - CLEANUP: Improve handling in MusicManager.skipTrack

3b18afed - CLEANUP: Localize more stuff in updateCellHasCombatTargets

a9ae2546 - CLEANUP: Reduce userdata lookups in updateCellHasCombatTargets

215a5d6e - CLEANUP: Rearrange and simplify the onUpdate handler chain for readability and SPEEEEEEEEED

e485c601 - FEAT: Switch from using direct events for track change handling to the explicit handler pattern the OpenMW API uses

622d946d - FEAT: Add new reason states for playlist and track changes

f8570e5c - CLEANUP: Make a dedicated EventData table and start importing H3 modules

037b099a - CLEANUP: Shut up the LLS

8f69d9dc - CLEANUP: Further optimize door iterations by using localized squared lengths and not even bothering to execute any real code during cell transitions

7eb88b00 - FIX: Correct string replacement throw lol

845076e7 - CLEANUP: Migrate the implementation of combat target detection into the player script so that we can use the `nearby` module

41f29745 - CLEANUP: Consolidate all the parts of the global onUpdate into one big function

be876db8 - CLEANUP: Remove useless interface functions

3c0baa74 - FEAT: (Slightly) further optimize the main onFrame by integrating sound enablement checks into the dispatcher system

3a6187ff - CLEANUP: Further optimize global script with preallocated tables

c6bcea5f - CLEANUP: We can use onUpdate now since it runs when the world is paused; update variable names to reflect that and use the onUpdate handler

84b05158 - CLEANUP: Refactor since this does literally nothing else

8e32406e - CLEANUP: This is no longer necessary since cell transitions are handled by the global script

3395023f - CLEANUP: Don't do cell change tracking in the player script at all anymore and only do it in the global script

6fd1f3de - FIX: Add a unified makeReadOnly impl with better support for recursion and also allows optionally copying the table and throwing on invalid keys

8f5ac17f - FEAT: Add a deep copy function to music utils

142535f0 - FIX: Un-break the builtin playlists since they no longer rely on api specific code

4e9781f2 - FEAT: Add a new, `isExploring` setting, for explore playlists to use which allows the separate disablement of explore playlists, just like battle ones

9fc7f208 - CLEANUP: Correct type annotations for combatTargets

7986f7a2 - CLEANUP: Register the special playlist differently, so the LLS recognizes it

cb67eab1 - FIX: Since we don't immediately play music anymore, we have to return when events are queued, otherwise we play music twice when turning playback back ON after it having been disabled

1f9e2b33 - CLEANUP: Flush old vars/forceSkip earlier to ensure toggling music doesn't accidentally preserve old state

9ad98fb8 - CLEANUP: Simplify the boolean logic around switching tracks a bit

78c267f4 - CLEANUP: Only actually stream music as a final response to the S3maphoreTrackChanged eventHandler, for better compatibility

f08b902f - CLEANUP: Do cell change tracking in the global script

3e154971 - CLEANUP: Clear the queued event data after it's been emitted

3828c1ed - CLEANUP: This is no longer needed as upon death a special track plays and switches out the onFrame function

0505d091 - CLEANUP: Hoist queued events and handle music enable/disablement entirely in the async handler

7f0ee292 - FIX: Always load the special playlist as it is the only one which MUST exist

c6a5f85e - FIX: Correct a bad reference to the local playlistsTracksOrder

d4717111 - CLEANUP: So I guess that whole thing can just go away

959b2c12 - CLEANUP: So I guess we never actually return the original table then

93a75a7a - CLEANUP: Further optimize updating settings tables and fix MWSE behavior again

7f18c086 - CLEANUP: Further optimize updating settings groups and fix the MWSE behavior as well

60066f4e - FIX: Improve write behavior of updating settings tables

93dbae40 - FIX: Don't presume the existence of Explore and Battle playlists anymore

fc1b9819 - CLEANUP: Use rawget instead

c14d45db - FIX: Correct a throw when writing values to auto-updating setting tables that aren't in the settings group

541bd34c - CLEANUP: Gate all debug logs behind an explicit check that debug logging is enabled to avoid unnecessary and expensive :format calls

a944e017 - CLEANUP: There's a DebugEnable setting too

2ca5088b - FIX: Wrong variable in failed lookup error for makeStrictReadOnly __index function. Also, error on level 2

adc742b4 - FIX: Move @class annotation so the assignment on construction doesn't cause complaints

c50f9936 - CLEANUP: Fix type annotations for interrupt modes

b358cb51 - FIX: Remove fightingActors as it now only exists as a property of the PlaylistState

1f18efd2 - CLEANUP: Major refactor of the core module to remove a bunch of stuff and account for it all being in dedicated files

e3501182 - CLEANUP: Refactor PlaylistRules to not require constructor arguments and instead directly import and assign relevant stuff

c8f12793 - FIX: Un-break the silence manager by constructing the auto-settings table with a prebuilt one that includes the updateSilenceParams function instead of trying to update it after the fact which doesn't work

b57c252b - FIX: Un-break the playlist loader by importing the music manager and constructing our own Playback table

29b5d2c9 - CLEANUP: Useless comment

68b8c941 - CLEANUP: Hoist the print override into its own function

2a33023e - FEAT: Migrate MusicManager into its own file separate from the core

4a1d9c1e - FEAT: Add a dedicated file for the core settings, which is API agnostic and cacheable

962f59bb - CLEANUP: Add a dedicated file for Playlist state

4a027a83 - FIX: Correct stack overflow in makeStrictReadOnly __index function lol

c9ca6c2c - FEAT: Add some bad annotations for GameObject, which don't actually have anything

829759fe - CLEANUP: Queued event name is optional, and will now be used to determine whether to send one as the main table is cached

2246f817 - CLEANUP: Improve type annotations and also make the state change reasons enum strict read only

882e40ad - FEAT: When assigning values to auto-updating setting tables, update the associated setting group as well (OpenMW only)

1eefa94a - CLEANUP: None of these actually get used

cac75d94 - CLEANUP: Hide tes3 global somewhere

e172fc2f - FIX: But we actually have to give an MCM path

14367139 - FEAT: Make the updating settings table constructor accept an (optional) input table for better ergonomics

5968e34a - CLEANUP: This is now API agnostic

e3f12582 - FEAT: Make auto updating table constructor work in MWSE too

86675d49 - CLEANUP: Actually the playlist loader really only needs to be a single file

ed9b5602 - CLEANUP: Add a dedicated module for checking if we're in OpenMW or not and use it when needed

053d1206 - CLEANUP: Improve type annotations for read only tables, and make an updating settings table constructor

f74292cf - CLEANUP: Migrate the rest of the coroutine loader into its own file, which returns the core loader function

92052801 - CLEANUP: Refactor silence manager not to have external dependencies and be prepped for MWSE deployment

cec95881 - CLEANUP: Simplify the silenceManager setup since none of the necessary stuff is actually stateful, that whole constructor function thing was pretty dumb

eb8f2f53 - CLEANUP: Migrate the enums into their own files

e41cbaa2 - CLEANUP: Start migrating the loader into its own directory, starting with the environment

cc73405b - CLEANUP: Rename helpers to musicUtil in core

f3b43faa - CLEANUP: Seriously, fix alphabetization in musicUtil

492f6afc - CLEANUP: Alphabetize, organize, and rearrange musicUtil

fb6582d0 - CLEANUP: Make a new StrictReadOnly function and don't throw on regular read-only tables.

db828cf8 - CLEANUP: Fix the _ENV annotations as that doesn't work in Lua 5.1

d0aed0c4 - CLEANUP: Nullify the contents of the original `helpers` module and migrate it to scripts/s3/music/util

e118ca9f - CLEANUP: Switch core to use `@module` for types instead of an actual require

23845787 - FIX: Correct a throw caused by not passing a prefix to deepToString

bef3c247 - FIX: We start with 0 playlists now because the builtins are dehardcoded

450d9eec - CLEANUP: More consistent style of require statements

9612eb2a - FEAT: Add lua-based makeReadOnly for cross-platform-ness

28004034 - CLEANUP: Remove some unused vars in core

Version 0.63:f432a618 - CLEANUP: Migrate to zola site structure

bf7f6bc4 - CLEANUP: Shuffle around helpers.lua so engine-specific code can be switched out as needed

e7b37b19 - CLEANUP: Import deepToString directly for portability

284d42c1 - CLEANUP: Remove require from playlist env

0e771b61 - FIX: Correct throws when playing special playlist

979de271 - IFX: Minor corrections to TR playlists, make the regional playlists work indoors

ff96a881 - FIX: Correct some region names in PC Playlists

3185f952 - FIX: Add molag ruhn region to TR playlists

1ed7bd69 - FIX: Un-break single track playlists

6a4785e9 - FIX: Correct nil table indices when combat starts and caches are (attempted) to be cleared

09658cab - CLEANUP: Update MUSE Regions for new syntax

38695804 - FIX: Switch from match to find (again) to correct issue with accidentlaly matching special characters

b14e7cbe - FIX: Correct redoran combat rule

390ef28c - CLEANUP: S3maphore changelog 0.61 (again)

8db068d5 - FIX: Better implementation of PlaylistPriority.Never, improve annotations for isValidCallback

6df9f97c - DOC: S3maphore changelog 0.61

058f1f8b - FIX: Never set playlists with `PlaylistPriority.never` as active

4dedae8a - FIX: Correct value for PlaylistPriority.Never

d6d5ad6a - FIX: Actually exclude .gitkeep from tracklists

2676bf53 - CLEANUP: Correct exclusions in docs

6d48bc0a - CLEANUP: Update redoran playlist format, use faction rule

fdec021b - CLEANUP: Correct typo in redoran folder name

69350f27 - DOC: Changelog for s3maphore 0.6

b280025f - FEAT: Add initial impl for soule sounds

792bda77 - CLEANUP: Make muse daedric use public tileset

a33d5e54 - CLEANUP: Update inns & Taverns playlist to properly use env

9dd99254 - FEAT: Make daedric tileset public

018c8e9c - DOC: make playback an optional input

2636f55a - FIX: Don't use exteriorgrid module anymore

21826447 - FEAT: Add playlist exclusions

8770bda5 - CLEANUP: Use the nearestRegion in region rules

1c78f2e9 - FEAT: Add a rule for exteriorGrid

ee31ab59 - FEAT: Add celId field, minor optimization in usage of cell field when doing cell transitions

2c61a384 - FEAT: Add region tracking which also parses load doors

e07596a6 - DOC: Add S3maphoreCellChangeData annotations

9ac27384 - CLEANUP: Minor optimization in global script, annotate functions

66c92eaf - FEAT: Add support for the soule sounds taverns playlists

6ac773b1 - FRAT: Add credits.txt for bgi inor

c502019a - FEAT: Add bgi Inor module (with permissions)

d381a55e - FEAT: Add better music system redone module

06c90e35 - FEAT: Add a new rule for trader types

f186b0a2 - FIX: Add an isValidCallback to alt orethan regions to prevent it from actually being used

c50895fb - FEAT: Add two new priority levels for `Class` and `MerchantType`

b6ccaa24 - FEAT: Add a rule for checking class of specific targets

e653f945 - CLEANUP: note for later in core regarding fallback playlists

373e2630 - CLEANUP: Add OAAB dwemer objects to global dwemer tileset and remove it from the MUSE Dwemer list

7e25a8c8 - CLEANUP: Add gitkeep files for every module

69340e5d - FEAT: Update documentation for 0.60

d3f8f2fe - FIX: Check combat states in MUSE Tombs

4cfcbd9a - FIX: Minor corrections to silence configuration localization

473f81f2 - FEAT: Add provincial music playlists

51d31d5c - CLEANUP: Actually finish playlistChance docstring

e3bdc88e - CLEANUP: Migrate TR playlists to folder-based /w fallback

872c0222 - FEAT: Add a new priority level, NEVER, for playlists which are only meant to be used as fallbacks

95c3661f - CLEANUP: Lower required api revisioin for actor.lua to 91

bec3f26a - CLEANUP: Minor formatting change in silenceManager

77e7fcfb - CLEANUP: Use screenSize instead of layer size for the banner

9df7789d - CLEANUP: Migrate builtin playlists into a dedicated playlist file

c277f268 - FEAT: Provide ipairs and pairs in the builtin playlist environment

552ecd06 - CLEANUP: Pass the fully-constructed helpers module into the silenceManager instead of requiring it locally

eca1ac67 - CLEANUP: Migrate strings from helpers into the staticStrings module, plus some additional cleanup of helpers.lua

a97b2cb6 - FIX: Don't load .gitkeep files into playlist track orders

ac992a0a - FIX: In the *rare* case that a new playlist uses the same track as another, do not restart the same track when changing playlists

c608f379 - CLEANUUP: Enforce that CombatTargetTypeMatches is a hashset

59fe8e44 - CLEANUP: Document the new rules

e55c2ca5 - FIX: don't require a minimum value for combatTargetFaction

9a7d9cac - CLEANUP: Simplify the vampirism rule

6a25edbf - FEAT: Add a vampire clan rule

c65c3344 - FEAT: Add an ice tileset

8f6e661c - CLEANUP: Move initialization finished string into staticstrings

617d34cd - FIX: Only update silenceParams if the playlist has *not* changed

4c4ed54d - CLEANUP: Don't iterate all three possible dynamic stats in dynamicStatThreshold, only ones the rule provides

d03681e2 - FEAT: Migrate loose types into a dedicated meta file

fad5de71 - FEAT: Add target type rule, for checking whether specific varieties of enemies are being fought

96cd6c77 - CLEANUP: Migrate playlist skip string into staticStrings

392a6594 - CLEANUP: Load aux_util much earlier in core

b681f7e4 - FIX: Forgot to commit strings for levelDifference rule!

b9b2eb25 - FEAT: Add swedish translations for silence settings by ya boi lysol

1a3e9536 - FEAT: Disable playback entirely when holding shift while pressing F8, and use events both for skipping tracks and toggling music

6a09a5a4 - FIX: Disallow using dynamicStatThreshold rules on 0.49 as it requires onHit handlers due to being cursed

eba29337 - FEAT: Pull in the built-in actor script as well, and use it to invalidate combat target caches onHit

ca7f32ab - FEAT: Add an eventHandler for clearing combat target caches, and an interface function to get a read-only copy of the state

5a50c23e - FEAT: Add a per-target cache clearing function to allow keeping caching for dynamic stats whilst also allowing the rule to work.

b03e41ce - FEAT: Add a dynamicStat rule to check remaining health/magicka/fatigue (normalized)

9d360262 - CLEANUP: Clear combat caches when a specific actor leaves combat, prior to the new cache key being generated

a46851e2 - FEAT: Add level difference rule

6f2b1cc6 - CLEANUP: Alphabetize constructor locals in playlistRules

56e53eb6 - FEAT: Pass static strings into playlist rules upon construction

9a5d2290 - CLEANUP: Annotate switchPlaylist function

041550f1 - CLEANUP: Proper annotations for Muse Tomb playlist, update to built in environment

aa3ab024 - FIX: Register chapel playlists after the town ones, so the registrationOrder is higher and they override properly

57d81bd7 - CLEANUP: Use `match` instea of `find` in cellNameMatch

3c9164f6 - FEAT: Implement silence "tracks" between all playback options

e289c255 - IMPROVEMENT: Micro-optimization of built-in playlist rules

0a503c13 - FIX: Don't log warnings about a fallback playlist not being registered if the fallback playlist is actually just nil

fe0c62e0 - FEAT: Add some enemies from CRF to muse dwemer

c0cc9e31 - CLEANUP: I guess this is a slightly better way to enable playlists on init

02f2cbb8 - FIX: Only load localization files that actually exist

3fc990db - CLEANUP: Only have one chance setting instead of a min and max

ade6a5b3 - FIX: Correct bad return value in combatTargetExact rule

23944268 - FEAT: Add a settings group for silence parameters

bf2ce7c3 - FEAT: Use fallback tracks when initializing playlists

229f87c4 - CLEANUP: use format method instead of string.format

c77eff5a - FEAT: Begin implementing fallback playlists

0740f118 - CLEANUP: Migrate most strings from core into a dedicated file

0e080fb3 - CLEANUP: Fix playlistpriority annotations so we stop using the wrong thing

e101034a - CLEANUP: Hoist some strings in helpers out of their respective local functions

4994c096 - CLEANUP: Fix priority usage on vanilla playlists

c807f939 - FEAT: Switch hlaalu playlist to use the new faction combat target rule

32f9b873 - FEAT: Add a rule for checking the faction of relevant combat targets

79927704 - CLEANUP: Improve annotations for timeOfDay rule

5152459b - FEAT: The upper bound for rules using NumericPresenceMaps should be optional

62ccb3a1 - CLEANUP: Migrate hlaalu playlist onto s3maphore ENV

3c662335 - FIX: Don't attempt to index the cell when the script first loads, since we're not in a cell on the first frame.

22cc93fb - CLEANUP: Correct type annotations for StaticList

23fc0710 - FIX: localStatics are not strings and not whole-ass gameObjects, so attempting to index to read the recordId starts fires

59499deb - CLEANUP: Micro-optimization on some playlists. transition more playlists onto using the built-in environment

ecb494f8 - CLEANUP: Annotations for Faction are `Faction`, not `Factional`

69dbf86c - CLEANUP: Annotate S3maphoreEnv in muse hlaalu playlist

53719f64 - FIX: Syntax fixes and rearrangements in muse sixth house playlists. Also use the dagoth ur rule instead of the regular sixth house combat one for dagoth ur.

f90513ae - FIX: Correct a bug in timeOfDay formula where it did not work after the first day of playtime due to not getting the actual number of hours in a day, only the number of hours played

75b76db4 - FEAT: Add general dungeon playlist

be7986f4 - CLEANUP: Fix typo in NumericPresenceMap

e1f6a1e5 - CLEANUP: Add battlemod to playlistpriority annotations

416510bb - CLEANUP: Annotate playlistpriority in env

26864dc5 - CLEANUP: Use env in secrets of the crystal city

b5e8c2a7 - Re-export tilesets in the builtin environment

599e53e4 - s3maphore chnagelog 0.54

76444059 - FIX: Correct sheogorad region name

fad6771b - FIX: Correct a bug where fadeOut wasn't assigned properly when switching tracks (Thanks Sikreci)

5516acba - FIX: Always assign registrationOrder field, only increment if not already registered

0c0cf13d - Merge branch 'lysol-sv-250609' into 'master

9c79444f - CLEANUP: Wasn't supposed to commit that lol

29e19365 - Update file sv.yaml

8e20bc87 - Merge branch s3ctors-s3cret-st4sh:master into lysol-sv-250609

897e6001 - FEAT: Migrate Drizzy playlists into s3maphore

76b3b9f5 - Update file sv.yaml

878bf5bd - CLEANUP: Reformat S3maphore document headings

8666a197 - CLEANUP: Refactor all readmes for the new format

3e3d632d - FEAT: Add Daggerfall guild music

fbb58925 - S3maphore changelog 0.53

5b934db1 - FEAT: Switch to embedded Lua records

eefd3821 - S3MAPHORE: C H A N G E L O G

529d3072 - FEAT: Implement Caching for Combat Targets

e6cb1051 - FEAT: Add combat playlists to SHOTN and switch to the builtin environment

ed217251 - FEAT: Implement caching for journal rules

463f652f - FIX: only send the musicStopped event once if music is disabled

47a3c155 - FEAT: Instead of `require`ing playlist files directly, pull them in using util.loadCode to provide a curated environment

1a30b981 - FEAT: Overhaul the core to support not skipping tracks under certain conditions.

a626e871 - FIX: Only send the S3maphoreMusicStopped event once when no new playlist is selected

68c00473 - FIX: `old ebonheart` was allowed and disallowed in MUSE empire

1dac6f4a - FEAT: Add a journal-based playlist rule

0f9baca8 - FIX: When did that get broken?

4dff883d - FEAT: Re-export all playback rules through the player interface

5b42e17d - FEAT: Implement weather tracking in PlaybackState via an mwscript hook

ba691616 - FIX: Oops, need to call that function

259d5bae - FIX: Remove all references to the original StaticList variable and actually unfuck tileset playlists

ab1e831e - FIX: Correct assignment order for result of getStaticsInCell

3424106f - FIX: Deduplicate static data

f7eebd18 - FIX: Oops, broke literally every static rule lol

19893c48 - FEAT: Add whether the player is underwater or not to the PlaylistState

017cdc33 - CLEANUP: Annotate tavernOrCellRule properly

de3c07dd - FIX: Add empty music dirs to fix BAIN detection

83148177 - FEAT: Track cell and combat target changes using events, removing more performance costs and making the script overall more robust.

42eb93ae - FEAT: Add the `NoInterrupt` global setting, which functions the same as the playlist-level one but acts on all playlists and can be in turn overridden by the `force` parameter.

bfca0670 - FIX: Correct naming scheme for azura's coast region folder

e321f07b - CLEANUP: Slightly increase vertical banner res

cf132e63 - FIX: Scale banner based on layer size and not screen size

6a6f122e - FEAT: Add english localization for Songbook playlists

12164045 - FIX: Improve naming of l10n contexts

2f4790ec - FEAT: Add a setting to disable combat music completely

1f650802 - FEAT: Add a dedicated button For resetting playlists Which actually works

b96bc36f - FIX: Except storing the gameObjects as keys doesn't work for whatever reason

c6fa9bcc - FEAT: Remove interior-only limitation for tileset rules

ba9d90c0 - FIX: Also treat actor names as literal strings

0b6cfa7b - FIX: Store the gameObject reference to combat targets instead of just their .id, cutting combat target ops down dramatically

58b1327c - FIX: Close massive performance hole in combat target matches

ecf7bc75 - FIX: Nil check in core

30cb803d - FEAT: Add telvanni combat playlist, add updated cell list from telvanni expansion

f8e88c4e - CLEANUP: Remove forgotten track table

a78029df - FIX: Move muse caves to the proper location

2718b102 - FEAT: Split SHOTN tracks into separate playlists based on folders, so they're both more unique and extendable

7b4d4680 - FEAT: Also add the songbook cover

8a4adbe3 - FEAT: Bake songbook of the north in directly

bf97ad54 - FEAT: Add Muse Cave playlist

8bcc2852 - CLEANUP: better annotations for staticContentFile. Always return true if a match was found or false if not, instead of relying on the inner tbale value (confusing)

cc91f1f6 - CLEANUP: Better distinguish Imperial and Empire playlists

6e9c5e74 - FIX: Correct priority on grey meadows playlist

437b02cd - FIX: Correct paths of PC playlists

0957befb - FIX: Allow using the original captaincreepy pack OR the DM compatibility pack for Inns & Taverns

c9dba99c - FIX: Bump inns and taverns priority slightly lower to avoid conflicts with captaincreepy's other playlist

9013a857 - FIX: Add support for CaptainCreepy's imperial MUSE playlist

9760f707 - FEAT: Add remaining MUSE playlists that weren't ported by DM

ef76ca60 - CLEANUP: Switch PC playlists to use directory format

15bfbd6a - FIX: Correct some missing `randomize` parms

ca8ef5e1 - FEAT: Add a global interface which enables generating hashsets for exact matches

8ed64229 - FIX: Correct cell names for Inns & Taverns playlists

b0f3984e - FEAT: Implement MUSE Vivec playlist (why is this a thing?)

39b91688 - FIX: Add some missing enemies from the latest MUSE Tombs update

827f59fc - CLEANUP: Don't check the dwemer tileset outdoors

492bdf88 - FIX: Only emit the MusicStopped event once if no valid playlist was found

13a1ac25 - FIX: Play hlaalu music in narsis catacomb entrances and tombs in the rest

1c0ebe9e - FIX: Use the correct default setting value for playlist selection

33be7f5a - FIX: Correct MUSE Playlist IDs so that the music/ directory isn't manually prepended

618de230 - FIX: Correct cell name matches where the name has special characters

5f25c9f1 - FIX: Correct a bug where battle and explore playlists would be inactive if not set manually

015a67e2 - FIX: Correct id for inns and taverns playlist

4086add0 - CLEANUP: Rename `templates` to `99 Templates`

387ab4a6 - CLEANUP: Merge inns and taverns playlists into a single playlist and fix priority conflict with TR playlist

828b7396 - FIX: Correctly replicate MUSE playlists, some filters added and track specifications removed

28c07f24 - FEAT: Add playlists for Inns & Taverns, nordic Lands, and Elder Scrolls Adventures - Redguard

fb31720f - CLEANUP: Add a compatibility section

73ebfa7f - FIX: Correct a bug where setting values could not persist due to recursion when trying to deactivate them

bb0a7332 - CLEANUP: Explain localization too

f18d8188 - Merge branch 'master' into 'master

880d27b7 - FEAT: Add the icons to the repo and readme

27878f79 - FEAT: Also document the special playlist

f8cdea3d - CLEANUP: Imrpove docstrings and fix a dumb bug preventing disablement of builtin playlists

2fdd2de8 - FEAT: Add documentation for s3maphore

19dc5a3f - FEAT: Add a setting to control display of the track banner FIX: Increase track banner height just a bit

cfed25d6 - FEAT: Implement tileset rules for TR cave playlist and add other suggestiohs from @Ronik

52f4e188 - FIX: Correct paths for aanthirin tracks

2e953e41 - FIX: Correct registered playlists array actually being writable

19c785bc - FIX: Correct TR Dwemer track paths

b079ac79 - FEAT: Migrate TR Dwemer playlist onto tileset rule

705a2048 - FEAT: Add ronik's cave static dataset and migrate the PC Cave playlist onto it

e3912fa4 - FEAT: Migrate PC Crypt, barrow, and ayleid playlists onto tileset detection

43255922 - CLEANUP: General reformatting and refuckulation

41cffc9b - FEAT: Add a skip track button

76625106 - CLEANUP: Remove dead settings, pad the playlist name strings, and localize all setting values

70fe50f4 - CLEANUP: Don't show the track name banner by default

5b00dbaf - FEAT: Add a debug logging function, remove some dead code for building the playback table

47d519c0 - FEAT: Add an interface function and event to deal with playing tracks from the `special` playlist

dec42dbf - FEAT: Support L10N Localization strings for all playlist ids and track names

84e747cf - CLEANUP: Use a constructor function for PlaylistRules so it always has a reference to playlist state which need never be reassigned

e39e0ab4 - CLEANUP: Make some playlist rule functions more concise, fix a bad docstring

d4c48d4f - FIX: Don't run the checks for combat targets if you aren't even in combat

f0285018 - FIX: Refactor static collection to use the cache appropriately and use string primitives instead of gameobjects

2725f254 - FIX: Give TR playlists which conflict with MUSE ones a higher priority

59c6a90c - CLEANUP: Migrate all playlists to the playlist priority enum and merge priorities together

b504fbbb - FEAT: Add updated L10n strings for settings and add track translations as well

6e618cca - CLEANUP: Remove playlist priority listing so the enum can actually be used

ef035534 - FEAT: Add rickoff playlist to starwind trackset

98044714 - FIX: This one too, damnit

2008306c - FIX: All dirs must be lowercase

b2ca2b43 - Add eXperimental Computing Facility for logos

Version 0.62:bd4ebdb8 - FIX: Correct nil table indices when combat starts and caches are (attempted) to be cleared

aa8d31ac - CLEANUP: Update MUSE Regions for new syntax

b3bd1ca4 - FIX: Switch from match to find (again) to correct issue with accidentlaly matching special characters

a3a76ef5 - FIX: Correct redoran combat rule

0d2017f0 - CLEANUP: S3maphore changelog 0.61 (again)

Version 0.61:62bf05a9 - FIX: Better implementation of PlaylistPriority.Never, improve annotations for isValidCallback

d30a4b05 - DOC: S3maphore changelog 0.61

18c34367 - FIX: Never set playlists with `PlaylistPriority.never` as active

3dff91dd - FIX: Correct value for PlaylistPriority.Never

c44e5295 - FIX: Actually exclude .gitkeep from tracklists

b9e383bf - CLEANUP: Correct exclusions in docs

869a4d0a - CLEANUP: Update redoran playlist format, use faction rule

5f8345de - CLEANUP: Correct typo in redoran folder name

0511a2e6 - DOC: Changelog for s3maphore 0.6

Version 0.6:af8c1972 - FEAT: Add initial impl for soule sounds

6e91ba18 - CLEANUP: Make muse daedric use public tileset

52c2d32a - CLEANUP: Update inns & Taverns playlist to properly use env

72bd74cf - FEAT: Make daedric tileset public

d46d73cd - DOC: make playback an optional input

c9b2353d - FIX: Don't use exteriorgrid module anymore

9af4c6e0 - FEAT: Add playlist exclusions

638e88b7 - CLEANUP: Use the nearestRegion in region rules

afd5739f - FEAT: Add a rule for exteriorGrid

0ee3f6ad - FEAT: Add celId field, minor optimization in usage of cell field when doing cell transitions

0fc1e0db - FEAT: Add region tracking which also parses load doors

b761ca3e - DOC: Add S3maphoreCellChangeData annotations

09795d7a - CLEANUP: Minor optimization in global script, annotate functions

908edc19 - FEAT: Add support for the soule sounds taverns playlists

10bb4b9b - FRAT: Add credits.txt for bgi inor

572e2eb5 - FEAT: Add bgi Inor module (with permissions)

18567980 - FEAT: Add better music system redone module

3865405a - FEAT: Add a new rule for trader types

31681baf - FIX: Add an isValidCallback to alt orethan regions to prevent it from actually being used

869e320e - FEAT: Add two new priority levels for `Class` and `MerchantType`

e267b64f - FEAT: Add a rule for checking class of specific targets

3d9f2e6c - CLEANUP: note for later in core regarding fallback playlists

afa0885e - CLEANUP: Add OAAB dwemer objects to global dwemer tileset and remove it from the MUSE Dwemer list

835d2f7b - CLEANUP: Add gitkeep files for every module

96e44e45 - FEAT: Update documentation for 0.60

13fa4ca6 - FIX: Check combat states in MUSE Tombs

041c8434 - FIX: Minor corrections to silence configuration localization

ec07c30a - FEAT: Add provincial music playlists

e90eadf4 - CLEANUP: Actually finish playlistChance docstring

af928cf8 - CLEANUP: Migrate TR playlists to folder-based /w fallback

e0cd8560 - FEAT: Add a new priority level, NEVER, for playlists which are only meant to be used as fallbacks

69764d25 - CLEANUP: Lower required api revisioin for actor.lua to 91

2116979f - CLEANUP: Minor formatting change in silenceManager

82abcf1f - CLEANUP: Use screenSize instead of layer size for the banner

afe026b9 - CLEANUP: Migrate builtin playlists into a dedicated playlist file

195b9a69 - FEAT: Provide ipairs and pairs in the builtin playlist environment

a0eb404f - CLEANUP: Pass the fully-constructed helpers module into the silenceManager instead of requiring it locally

eec9e80a - CLEANUP: Migrate strings from helpers into the staticStrings module, plus some additional cleanup of helpers.lua

f0c8573f - FIX: Don't load .gitkeep files into playlist track orders

83b52488 - FIX: In the *rare* case that a new playlist uses the same track as another, do not restart the same track when changing playlists

20135557 - CLEANUUP: Enforce that CombatTargetTypeMatches is a hashset

70c22745 - CLEANUP: Document the new rules

5fb58df4 - FIX: don't require a minimum value for combatTargetFaction

9060b6a5 - CLEANUP: Simplify the vampirism rule

8b7dc424 - FEAT: Add a vampire clan rule

519377a1 - FEAT: Add an ice tileset

4a19c0f9 - CLEANUP: Move initialization finished string into staticstrings

ad5d37d8 - FIX: Only update silenceParams if the playlist has *not* changed

0c232401 - CLEANUP: Don't iterate all three possible dynamic stats in dynamicStatThreshold, only ones the rule provides

5c85c3c1 - FEAT: Migrate loose types into a dedicated meta file

4589bf26 - FEAT: Add target type rule, for checking whether specific varieties of enemies are being fought

2d3dd028 - CLEANUP: Migrate playlist skip string into staticStrings

f9b73afd - CLEANUP: Load aux_util much earlier in core

dfba3e1c - FIX: Forgot to commit strings for levelDifference rule!

c6d760ec - FEAT: Add swedish translations for silence settings by ya boi lysol

d72bd6b4 - FEAT: Disable playback entirely when holding shift while pressing F8, and use events both for skipping tracks and toggling music

7d7ed947 - FIX: Disallow using dynamicStatThreshold rules on 0.49 as it requires onHit handlers due to being cursed

ed6fdf14 - FEAT: Pull in the built-in actor script as well, and use it to invalidate combat target caches onHit

b2575601 - FEAT: Add an eventHandler for clearing combat target caches, and an interface function to get a read-only copy of the state

c356075a - FEAT: Add a per-target cache clearing function to allow keeping caching for dynamic stats whilst also allowing the rule to work.

f14dc231 - FEAT: Add a dynamicStat rule to check remaining health/magicka/fatigue (normalized)

ea548f10 - CLEANUP: Clear combat caches when a specific actor leaves combat, prior to the new cache key being generated

be46f38c - FEAT: Add level difference rule

d22d075d - CLEANUP: Alphabetize constructor locals in playlistRules

43fbf801 - FEAT: Pass static strings into playlist rules upon construction

42d3c98e - CLEANUP: Annotate switchPlaylist function

0fe6b1dc - CLEANUP: Proper annotations for Muse Tomb playlist, update to built in environment

953d63f3 - FIX: Register chapel playlists after the town ones, so the registrationOrder is higher and they override properly

dd25ec11 - CLEANUP: Use `match` instea of `find` in cellNameMatch

76d65d89 - FEAT: Implement silence "tracks" between all playback options

33deb5d7 - IMPROVEMENT: Micro-optimization of built-in playlist rules

1171f783 - FIX: Don't log warnings about a fallback playlist not being registered if the fallback playlist is actually just nil

db7cc32f - FEAT: Add some enemies from CRF to muse dwemer

616b5f2c - CLEANUP: I guess this is a slightly better way to enable playlists on init

6ffe50bf - FIX: Only load localization files that actually exist

f31869f8 - CLEANUP: Only have one chance setting instead of a min and max

f8530a0d - FIX: Correct bad return value in combatTargetExact rule

e0342e5d - FEAT: Add a settings group for silence parameters

6da73a8d - FEAT: Use fallback tracks when initializing playlists

824da9b8 - CLEANUP: use format method instead of string.format

dd9eb71a - FEAT: Begin implementing fallback playlists

9f17793b - CLEANUP: Migrate most strings from core into a dedicated file

f61276e8 - CLEANUP: Fix playlistpriority annotations so we stop using the wrong thing

8ca403c4 - CLEANUP: Hoist some strings in helpers out of their respective local functions

e6abfd58 - CLEANUP: Fix priority usage on vanilla playlists

c15b9781 - FEAT: Switch hlaalu playlist to use the new faction combat target rule

a9c44397 - FEAT: Add a rule for checking the faction of relevant combat targets

c8c7a876 - CLEANUP: Improve annotations for timeOfDay rule

465f2ca0 - FEAT: The upper bound for rules using NumericPresenceMaps should be optional

834b6c71 - CLEANUP: Migrate hlaalu playlist onto s3maphore ENV

b61ef033 - FIX: Don't attempt to index the cell when the script first loads, since we're not in a cell on the first frame.

fe6531ae - CLEANUP: Correct type annotations for StaticList

57e5e5c0 - FIX: localStatics are not strings and not whole-ass gameObjects, so attempting to index to read the recordId starts fires

82f85772 - CLEANUP: Micro-optimization on some playlists. transition more playlists onto using the built-in environment

8b58acfc - CLEANUP: Annotations for Faction are `Faction`, not `Factional`

1ecf672c - CLEANUP: Annotate S3maphoreEnv in muse hlaalu playlist

d0159c3d - FIX: Syntax fixes and rearrangements in muse sixth house playlists. Also use the dagoth ur rule instead of the regular sixth house combat one for dagoth ur.

21fc7088 - FIX: Correct a bug in timeOfDay formula where it did not work after the first day of playtime due to not getting the actual number of hours in a day, only the number of hours played

88926987 - FEAT: Add general dungeon playlist

91a1b585 - CLEANUP: Fix typo in NumericPresenceMap

6a065041 - CLEANUP: Add battlemod to playlistpriority annotations

9ac37f9c - CLEANUP: Annotate playlistpriority in env

43185f45 - CLEANUP: Use env in secrets of the crystal city

af7663ed - Re-export tilesets in the builtin environment

Version 0.54:f66a40ac - s3maphore chnagelog 0.54

cd61fb28 - FIX: Correct sheogorad region name

44ef62cd - FIX: Correct a bug where fadeOut wasn't assigned properly when switching tracks (Thanks Sikreci)

0e7964d1 - FIX: Always assign registrationOrder field, only increment if not already registered

bcc562a8 - Merge branch 'lysol-sv-250609' into 'master

87b76f35 - CLEANUP: Wasn't supposed to commit that lol

10dbbdf3 - Update file sv.yaml

a84b945a - Merge branch s3ctors-s3cret-st4sh:master into lysol-sv-250609

b7483271 - FEAT: Migrate Drizzy playlists into s3maphore

cded70fb - Update file sv.yaml

e0aec460 - CLEANUP: Reformat S3maphore document headings

c277fb62 - CLEANUP: Refactor all readmes for the new format

fb6dedd8 - FEAT: Add Daggerfall guild music

Version 0.53:7a30cbe4 - S3maphore changelog 0.53

60aefc55 - FEAT: Switch to embedded Lua records

Version 0.52:f82bc8f0 - S3MAPHORE: C H A N G E L O G

8bb62e6a - FEAT: Implement Caching for Combat Targets

59d0500f - FEAT: Add combat playlists to SHOTN and switch to the builtin environment

c3d4ca61 - FEAT: Implement caching for journal rules

47ef1567 - FIX: only send the musicStopped event once if music is disabled

61ca871a - FEAT: Instead of `require`ing playlist files directly, pull them in using util.loadCode to provide a curated environment

be10e9e6 - FEAT: Overhaul the core to support not skipping tracks under certain conditions.

4568a147 - FIX: Only send the S3maphoreMusicStopped event once when no new playlist is selected

e8ca4427 - FIX: `old ebonheart` was allowed and disallowed in MUSE empire

b53b1b91 - FEAT: Add a journal-based playlist rule

acaf6620 - FIX: When did that get broken?

4685cd20 - FEAT: Re-export all playback rules through the player interface

c8b7b1d0 - FEAT: Implement weather tracking in PlaybackState via an mwscript hook

dc1e7fa8 - FIX: Oops, need to call that function

e5e7654b - FIX: Remove all references to the original StaticList variable and actually unfuck tileset playlists

d4d3fd5f - FIX: Correct assignment order for result of getStaticsInCell

ae30abfc - FIX: Deduplicate static data

94b20a7a - FIX: Oops, broke literally every static rule lol

db814a41 - FEAT: Add whether the player is underwater or not to the PlaylistState

bc0e592b - CLEANUP: Annotate tavernOrCellRule properly

97fadfb5 - FIX: Add empty music dirs to fix BAIN detection

2ffda26e - FEAT: Track cell and combat target changes using events, removing more performance costs and making the script overall more robust.

da11ba67 - FEAT: Add the `NoInterrupt` global setting, which functions the same as the playlist-level one but acts on all playlists and can be in turn overridden by the `force` parameter.

c0e435e3 - FIX: Correct naming scheme for azura's coast region folder

78f68409 - CLEANUP: Slightly increase vertical banner res

c12bb5dd - FIX: Scale banner based on layer size and not screen size

37d37bec - FEAT: Add english localization for Songbook playlists

68c7560e - FIX: Improve naming of l10n contexts

fc48a746 - FEAT: Add a setting to disable combat music completely

fd8ea0e5 - FEAT: Add a dedicated button For resetting playlists Which actually works

e8bc4558 - FIX: Except storing the gameObjects as keys doesn't work for whatever reason

4c15a8c5 - FEAT: Remove interior-only limitation for tileset rules

6645fefa - FIX: Also treat actor names as literal strings

b3fb3c16 - FIX: Store the gameObject reference to combat targets instead of just their .id, cutting combat target ops down dramatically

a9ea5e8a - FIX: Close massive performance hole in combat target matches

7803532b - FIX: Nil check in core

d675515e - FEAT: Add telvanni combat playlist, add updated cell list from telvanni expansion

f7ecbe19 - CLEANUP: Remove forgotten track table

173287b7 - FIX: Move muse caves to the proper location

a6ac5e55 - FEAT: Split SHOTN tracks into separate playlists based on folders, so they're both more unique and extendable

083696b5 - FEAT: Also add the songbook cover

ee3a6168 - FEAT: Bake songbook of the north in directly

3f7be318 - FEAT: Add Muse Cave playlist

2590822d - CLEANUP: better annotations for staticContentFile. Always return true if a match was found or false if not, instead of relying on the inner tbale value (confusing)

1c10db04 - CLEANUP: Better distinguish Imperial and Empire playlists

e8c02290 - FIX: Correct priority on grey meadows playlist

1bad26ea - FIX: Correct paths of PC playlists

8bed422f - FIX: Allow using the original captaincreepy pack OR the DM compatibility pack for Inns & Taverns

c8b1a44a - FIX: Bump inns and taverns priority slightly lower to avoid conflicts with captaincreepy's other playlist

471bf784 - FIX: Add support for CaptainCreepy's imperial MUSE playlist

c04bc1aa - FEAT: Add remaining MUSE playlists that weren't ported by DM

ec72fd0a - CLEANUP: Switch PC playlists to use directory format

da63ba9a - FIX: Correct some missing `randomize` parms

32f76f3f - FEAT: Add a global interface which enables generating hashsets for exact matches

6a32c561 - FIX: Correct cell names for Inns & Taverns playlists

d1ff756e - FEAT: Implement MUSE Vivec playlist (why is this a thing?)

7a2ebe16 - FIX: Add some missing enemies from the latest MUSE Tombs update

90bc2617 - CLEANUP: Don't check the dwemer tileset outdoors

64a95ce1 - FIX: Only emit the MusicStopped event once if no valid playlist was found

5d6160ea - FIX: Play hlaalu music in narsis catacomb entrances and tombs in the rest

8a1bf6e8 - FIX: Use the correct default setting value for playlist selection

8a7722e0 - FIX: Correct MUSE Playlist IDs so that the music/ directory isn't manually prepended

156e0947 - FIX: Correct cell name matches where the name has special characters

1e418737 - FIX: Correct a bug where battle and explore playlists would be inactive if not set manually

5153003b - FIX: Correct id for inns and taverns playlist

8c6807e8 - CLEANUP: Rename `templates` to `99 Templates`

b224eeaf - CLEANUP: Merge inns and taverns playlists into a single playlist and fix priority conflict with TR playlist

c0b9eb2b - FIX: Correctly replicate MUSE playlists, some filters added and track specifications removed

b7959f78 - FEAT: Add playlists for Inns & Taverns, nordic Lands, and Elder Scrolls Adventures - Redguard

0e165800 - CLEANUP: Add a compatibility section

Version 0.51:07158ead - FIX: Correct a bug where setting values could not persist due to recursion when trying to deactivate them

a6d59fd3 - CLEANUP: Explain localization too

89e05f4b - Merge branch 'master' into 'master

79c2c621 - Add eXperimental Computing Facility for logos

Version 0.5:11bc8140 - FEAT: Add the icons to the repo and readme

4814cf69 - FEAT: Also document the special playlist

fdbe00aa - CLEANUP: Imrpove docstrings and fix a dumb bug preventing disablement of builtin playlists

35097615 - FEAT: Add documentation for s3maphore

5a9a96a1 - FEAT: Add a setting to control display of the track banner FIX: Increase track banner height just a bit

7e9bb15b - FEAT: Implement tileset rules for TR cave playlist and add other suggestiohs from @Ronik

14561ba6 - FIX: Correct paths for aanthirin tracks

b983eeba - FIX: Correct registered playlists array actually being writable

dde47549 - FIX: Correct TR Dwemer track paths

3873d7a2 - FEAT: Migrate TR Dwemer playlist onto tileset rule

b515494e - FEAT: Add ronik's cave static dataset and migrate the PC Cave playlist onto it

73ba1ed3 - FEAT: Migrate PC Crypt, barrow, and ayleid playlists onto tileset detection

f3dd6b10 - CLEANUP: General reformatting and refuckulation

add8fd27 - FEAT: Add a skip track button

fa771f29 - CLEANUP: Remove dead settings, pad the playlist name strings, and localize all setting values

f8f96024 - CLEANUP: Don't show the track name banner by default

19a93ec7 - FEAT: Add a debug logging function, remove some dead code for building the playback table

7129b417 - FEAT: Add an interface function and event to deal with playing tracks from the `special` playlist

da66c65a - FEAT: Support L10N Localization strings for all playlist ids and track names

5e6b2919 - CLEANUP: Use a constructor function for PlaylistRules so it always has a reference to playlist state which need never be reassigned

9641f41b - CLEANUP: Make some playlist rule functions more concise, fix a bad docstring

4c50042d - FIX: Don't run the checks for combat targets if you aren't even in combat

043a6b18 - FIX: Refactor static collection to use the cache appropriately and use string primitives instead of gameobjects

3eafa79e - FIX: Give TR playlists which conflict with MUSE ones a higher priority

32c5f478 - CLEANUP: Migrate all playlists to the playlist priority enum and merge priorities together

492c37d6 - FEAT: Add updated L10n strings for settings and add track translations as well

8253cff7 - CLEANUP: Remove playlist priority listing so the enum can actually be used

9519d988 - FEAT: Add rickoff playlist to starwind trackset

e000aced - FIX: This one too, damnit

598a59e6 - FIX: All dirs must be lowercase