S3maphore Changelog
Latest:
da6944b2 - CLEANUP: Integrate silence track handling into the onUpdate call chain48455ca3 - 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 structurebf7f6bc4 - 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 clearedaa8d31ac - 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 isValidCallbackd30a4b05 - 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 sounds6e91ba18 - 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.54cd61fb28 - 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.52:
f82bc8f0 - S3MAPHORE: C H A N G E L O G8bb62e6a - 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 thema6d59fd3 - 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 readme4814cf69 - 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