Static Switching System Changelog
Latest:
f573f825 - DOC: Cod3x as the OpenMW Lua scripting biblea780dcd7 - FIX: Fuck YAML
feddef3a - DOCS: Take the nuclear option
Version 1.0:
a7235b8f - SITE: Add SSS logo to its main pagebb245dcf - CLEANUP: Add `more` tag to SSS root page
f28a80b8 - FEAT: New icons for SSS
f4fcaa7e - DOC: Still not good enough, but it is now.
6e8ed567 - CLEANUP: Actually, no
8cb1b0d6 - DOC: Add SSS Nexus Page
52ace48f - FIX: Correct paths in SSS docs for compatibility modules
9b329688 - FIX: Missing templates
6dd7ee75 - FIX: Fucking clanker
a1f1951f - FEAT: Add 13 more compatibility modules derived from real world research
e2685aa3 - FIX: Small handful of correctness bugs and performance fixes for final release
4df82dd9 - CLEANUP: Improve SSS dependency documentation
b2187575 - FEAT: Add a series of ridiculous SSS modules
93656716 - FEAT: Add day_of_week to instance modifier schema
fc78d225 - FIX: Make the create action use accumulated instead of current object transform
ab8b0237 - FEAT: Add self replacement special case to `replace` option and add isRespawning condition
ee3f1a56 - DOC: Heroic documentation commit on SSS, YOLO
32bd1f0b - FIX: Correct transform/teleport interop
bf4ee946 - CLEANUP: Finalize module ordering and remove uninstall support
df1e9077 - CLEANUP: Always return bool from some conditionHandlers to shut up LLS
339f0586 - FIX: Formatting, YAML annotations, schema bugs, and replace `Tagger` references with `FlexTag` ones
e59a0f11 - FEAT: Make SSS explicitly depend upon H3
c28e5c39 - CLEANUP: Add more tags, nexus info, bump version in SSS
c609083d - FIX: Use non-allocating version of randomGen.range in SSS
7e581c8f - PERF: batchCache objectRecord, all handlers use it
f90eb2b6 - FEAT: has_enchantment + enchantment conditions
1cc220b0 - FEAT: Add Dynamic Dungeon Traps module
5ff5c996 - FEAT: target_disposition condition
46e3af1b - CLEANUP: Accidental commit
9b5200ea - FIX: creature_type schema — string enum only
1beebb91 - FEAT: is_dead, creature_type, race conditions
a0f2b2b1 - FIX: auto-exclude replace spawns, clean mudcrab module
099a75a7 - FEAT: create action auto-excludes spawns from same module
274c11c8 - FIX: falsy condition/action values filtered by sortByType, generated_object
a29a67ee - FIX: mudcrab module — generated_object filter back
68d40aeb - FIX: generated_record + generated_object, mudcrab filter
aae252ba - FEAT: Tagger addTag/removeTag + eventHandler + SSS tag actions
01d1b845 - FEAT: has_tag + cell_tag — Tagger mod integration
2b8e7cc4 - FEAT: Initial caius randomizer module
71aff83d - FIX: teleport cell resolution, time_of_day wrapping ranges
7c7d3936 - CLEANUP: Update priorityOrder comment
aa1bb0d4 - CLEANUP: Reformat slightly, silence linter warnings
e95c816e - FEAT: activate_by_player, remove_lua_script, global_set, teleport
4a3d08e9 - FEAT: add_lua_script action — attach Lua scripts to objects
f8538a6a4 - FIX: AND_LIST_CONDITIONS for global_value, has_mwscript StrLower
6d275753 - FEAT: global_value condition — MWScript global variable gate
3288f685 - FEAT: player_spell + target_spell conditions with batchCache
7c05a67d - FEAT: has_lua_script + has_mwscript conditions, fix numericRange schema
b7017802 - FEAT: dynamic stat conditions — health/magicka/fatigue gates
b3be5093 - FIX: resolvedName local, stepIndex→revIdx stale ref, doc revert
a50757f2 - FIX: loadReplacementChains param type SSSReplacementChainsSaved
7cfedfc3 - CLEANUP: linter fixes in staticReplacements + util
55e980af - DOCS: add SSSModuleIdentity and StaticUtil classes
fc579fb5 - CLEANUP: Patch linter errors
e6221943 - CLEANUP: Reformat util.lua slightly
452dbcf5 - CLEANUP: remove unused StrFind from util.lua
04d14336 - CLEANUP: run formatter, fix placement of diagnostic-disable
32ebc276 - FIX: forward-declare util functions called before definition
bf0ae7f1 - REFACTOR: local functions + return table pattern in util
01277119 - STYLE: stylua pass after localization sweep
0d7e0c66 - PERF: localize string methods in util, logger, globalSettings
544b854c - PERF: localize string.format in validation
4428eb76 - PERF: localize logger + string methods in staticReplacements
e2c5addc - FIX: localize :upper in conditionHandlers
3b63f6cb - PERF: localize logger + string methods in moduleCatalog
064a26ed - PERF: localize string methods in conditionHandlers
1f0cdc76 - PERF: localize logger, strFormat, object.id in instanceModifiers
dee4d7a2 - CLEANUP: scope logger to do-block in global.lua
387781f4 - PERF: localize logger.debug/info in global.lua
d6eccfd3 - FIX: trap schema, playsound anyOf, create indent, validation table
111c021a - FIX: playsound uses core.sound.playSound3d/File3d, remove ambient
c39952ac - FIX: entry.id→keyId/trapId, playsound priority, key/trap doc shape
46cb5b2f - FIX: shouldApplyChance assert, key/trap array shape, pre-lower IDs
77e6b431 - FEAT: has_key/has_trap conditions + key/trap/set_ownership/playsound actions
26843604 - FEAT: attribute/skill conditions — player and target stat gates
12eb5b34 - FEAT: module priority tiers — deterministic load order
4c817e46 - DOCS: fix batchCache return types — use Cod3x userdata types
0a55dea9 - DOCS: move batchCache fields to doc.lua
940fe460 - PERF: batchCache module — cache expensive C++ calls per activation batch
a8eab6dc - CLEANUP: Less indexing into userdata types
253429a6 - PERF: cache isLocked, hoist getRefNum, pre-lower cell names
fc86a065 - FIX: string.format→:format
b2f84588 - STYLE: stylua pass on SSS
d3195610 - PERF: ipairs→numeric for in staticReplacements.lua
6c900158 - PERF: ipairs→numeric for in global.lua and util.lua
cbf55fde - PERF: ipairs→numeric for in moduleCatalog.lua
aa28c235 - PERF: ipairs→numeric for in instanceModifiers.lua
d40b0f1a - PERF: ipairs→numeric for in conditionHandlers.lua
27957304 - PERF: strip redundant :lower() from pre-lowered condition values
f96124dd - PERF: pre-lowercase YAML string conditions at module load time
41b84e30 - FEAT: faction_owner_rank condition — object owner faction rank gate
5079fe22 - FEAT: owner_id condition — object owner NPC record ID match
55c51a02 - FEAT: faction_owner_id condition — object owner faction match
85a71f64 - FEAT: Add a new module for harder locks
15954dc5 - FEAT: action-level chance — gate entire action blocks by probability
67ea209d - FEAT: module-level once — block all rules after first application
74678c43 - FIX: Early-out in lock_level condition for objects with no .type
233f7d64 - FEAT: lock_level action — lock/unlock doors and containers
e36d17f5 - FIX: time_of_day — compute hour from game time seconds
667e5c39 - FIX: Guards and doc clarity for new condition handlers
f385ca78 - FEAT: target_level, time_of_day, player/target_faction, target_class, player_equipped
06d9d3c5 - FEAT: player_level and current_weather condition handlers
b0cf23e2 - FIX: Normalize count.min to 1 on range tables before assert
ee193ad5 - FIX: Assert min <= max on count range tables (AON review)
e56e8342 - FEAT: Count ranges for add/remove/create — random item quantities
a5f8633e - FEAT: create action — spawn objects at trigger position with transform overrides
1d046569 - FIX: Pass object not modifyTarget to delete handler
b2bb4fe1 - FEAT: Move delete action into actionHandlers.lua
e175f4c6 - FEAT: Move disable action into actionHandlers.lua
0daec633 - FEAT: Move transform action into actionHandlers.lua
c81cb427 - FIX: Move ["not"] handler outside table constructor to fix nil upvalue
51e43c6a - FIX: Add all missing condition types to CONDITIONPRIORITY
31f611b5 - FIX: Prevent infinite replace cycle in Sixth House corruption rules
8ae401d6 - FIX: Restore unconditional Rule 7, cut 7c, target both +0/+2 in corruption phase
3233ddc8 - FEAT: has_journal condition, Sixth House tomb corruption lifecycle
52328a91 - FEAT: Web wobble and diseased rats to Tomb Spice-Up
4b5976de - CLEANUP: Only run leveled list replacement once for creatures in tombspiceup
a17e24f8 - CLEANUP: Run formatter on global.lua
75597547 - FIX: Remove capitalize from object_type condition; add Rule 7 for leveled list upgrade
faf6defa - FEAT: Add loot shuffle and harder creature spawns to Tomb Spice-Up
aac2a6e5 - CLEANUP: Update Tomb Spice-Up comment to reflect disable-only, mention onObjectActive limitation
6df5d1b5 - FIX: Remove enable action from replacer JSON schema
74515ce0 - DOC: Remove enable @field, document onObjectActive limitation on disable
71028b43 - FIX: Remove enable from ACTIONPRIORITY in moduleCatalog
77565204 - FIX: Remove enable action from instanceModifiers
ffd76ec5 - CLEANUP: Slightly better formatting in tomb spice-up
0710fa22 - FIX: Only execute light disablement once, ever
87afc921 - FIX: Don't try to enable objects in tomb spice-up because disabled objects do not trigger OnObjectActive
ed51afeb - FEAT: record_id condition now uses Lua patterns, enabling ^/$ anchors
6d7f3db0 - FIX: Extend urn record id schema
449d0ade - FIX: tighten urn match to _urn to avoid catching every furn_* record
930aca31 - CLEANUP: Only do scale transforms on bone/skull refs in tombs
f0223261 - FEAT: Add Tomb Spice-Up example module
b01c6cd2 - SSS: cell_match condition, enable action, chance on disable/enable
8e57680b - FIX: move glassEbonyRemoval out of the default data directory
1cc8c831 - FIX: Correct logging when no modifiers apply
d64b9268 - FEAT: Add Glass and Ebony Removal instance module
2b591a41 - FEAT: Support array-form remove action with capping count
d7011121 - FEAT: Annotate 'not' field on SSSConditionData for LuaLS
4ccc74f7 - FEAT: Implement 'not' condition handler for condition negation
87cb25e3 - FEAT: Declare 'not' as a valid condition key in the YAML replacer schema
a242557a - FEAT: Wire logger into global flow for activation/save/load tracing
e8018c28 - FEAT: Wire logger into static replacements for replacement decision tracing
4166820f - FEAT: Wire logger into instance modifiers for condition/action tracing
476d2762 - FEAT: Wire logger into module catalog for load-time tracing
a4c7a405 - FEAT: Register StaticSwitcherEnableDebug checkbox setting
d1fdbf4a - FEAT: Create SSSLogger module with deferred-format debug logging
b32ffc78 - FEAT: Convert Caius bottle variety to once='per_cell' with expanded pool
4ce7c15d - FIX: Clear per-cell tracking at start of new activation batch
2948a62c - FEAT: Add once='per_cell' tracking to instance modifiers
e0d1b088 - FEAT: Replace ref_num with content_file_target condition
7e29a94b - FEAT: Add wildlife variety pack instance modifier example
902a5332 - FEAT: Add diminutive armored Caius instance modifier example
cb7fbce2 - FEAT: Add creature scale randomizer instance modifier example
aa0f6b14 - FEAT: Add advanced static replacement example with ignore_records
3e68d671 - FIX: Move DisableModule flag clearing to onLoad handler
8df494f6 - FIX: Filter YAML/yml extension in VFS data scan
f731970a - CLEANUP: Remove dead getChanceValue after single-roll change
a7aaba79 - FIX: Change double→single roll in shouldApplyChance
3dccb8e6 - FEAT: Rename name condition to nameMatch
9af82255 - FEAT: Add runtime YAML validation module
95e987d9 - FIX: Normalize require path casing to match Scripts/ directory
7c809fae - FEAT: Add door-based region fallback for interior cells
f1798b6a - FEAT: Add SSS instance unequip action
96eddcb3 - FEAT: Add SSS instance equip action
63adf85d - STYLE: Format SSS Lua scripts
c1267959 - FEAT: Add SSS instance remove action
17d1bc94 - FEAT: Add SSS instance add action
79eac01f - FEAT: Add SSS instance delete action
50bce16e - FEAT: Add SSS instance disable action
e71dae67 - FEAT: Add SSS instance has name condition
a0c6ad4d - FEAT: Add SSS instance worldspace condition
a37f250e - FEAT: Add SSS instance generated condition
657eaed4 - FEAT: Add SSS instance scale condition
195fa914 - FEAT: Add SSS instance quasi exterior condition
5720b5d2 - FEAT: Add SSS instance exterior condition
a75e4ed5 - FEAT: Add SSS instance mesh condition
a5c39489 - FEAT: Add SSS instance region condition
ab62bdab - DOCS: Document SSS static region filters
4c26bcc6 - FEAT: Add SSS static region filters
024be2bf - DOCS: Document unconditional SSS static modules
2148c306 - FEAT: Allow unconditional SSS static replacements
7b5c8907 - FIX: Guard SSS uninstall checkbox value
fd53eb30 - FIX: Limit SSS uninstall list to static modules
5ec07295 - FIX: Correct SSS randomGen require casing
df452487 - FIX: Guard SSS interface uninstall requests
f5aeffee - FIX: Avoid SSS save quit on invalid uninstall
595b10e0 - FIX: Migrate SSS override record keys
e5218f3b - FIX: Preserve unresolved SSS replacement keys
aceb782e - FIX: Preserve unresolved SSS once cache keys
edfceb28 - CLEANUP: Use SSS module ID terminology
a2f67cd8 - DOCS: Document canonical SSS module IDs
a25c02fa - CLEANUP: Clarify SSS settings module IDs
2d7fad64 - FEAT: Migrate SSS replacement module keys
4638e584 - FEAT: Wire SSS replacement module resolver
fa72502c - FEAT: Allow SSS replacement module key resolution
53a9610d - FEAT: Migrate SSS once cache module keys
85d508b0 - FEAT: Resolve legacy SSS module keys
19fabd4f - FEAT: Add canonical SSS module identities
f2354a86 - CLEANUP: Move example module into root examples/ directory
3296562e - CLEANUP: Remove hardcoded exception for example module
a908f31e - CLEANUP: Use shared SSS GObject check in once cache
48be715f - CLEANUP: Use shared SSS GObject check in replacements
c298efa2 - CLEANUP: Centralize SSS GObject checks
bcc5259f - CLEANUP: Simplify SSS GObject type check
01692d09 - FIX: Accept OpenMW GObject type metadata shapes
e0ccdfc2 - FIX: Relink loaded SSS replacement chain edges
9d340176 - DOCS: Clarify minimal SSS chain save entries
716d1655 - FIX: Save minimal SSS replacement chain entries
33a044bf - DOCS: Clarify SSS chain save DTOs
98b89637 - FIX: Save SSS replacement chain DTOs
8136850c - FIX: Sanitize persisted SSS replacement chains
a533d06e - FEAT: Allow SSS delete queue cancellation
648a98ef - DOCS: Annotate SSS replacement chains
a3df6755 - FEAT: Use chain-aware SSS uninstall
52b4bc68 - FEAT: Allow chain-aware SSS uninstall
f7209bb2 - FEAT: Persist SSS replacement chains
f1154b9f - FEAT: Add deterministic SSS replacement chain tracking
64a50912 - FIX: Guard against duplicate SSS replacements
2d08e23b - FIX: Correct newly-created records from StaticReplacement modules to correctly copy all fields for relevant record types
16ccf3e7 - FIX: Correct corner case in mesh path loading/capitalization
bf8a2621 - DOCS: Annotate SSS once cache state
ba83d686 - FEAT: Persist SSS once cache state
2f77fbec - FEAT: Rebuild SSS once cache from saved objects
26188cf4 - FIX: Correctly accumulate scale modifications
e4e76c92 - CLEANUP: typo
9ec07b6c - FIX: ConditionHandlers should check cell name OR id
11dc3f25 - FIX: Remove objects from the queue regardless of whether they're valid or not to prevent infinite delete queues
9950f9ab - FIX: Don't attempt to re-enable invalid objects
683df066 - CLEANUP: Remove assert and fix DeleteManager annotation in globalSettings.lua
ff68d39a - CLEANUP: Localize/annotate LJ extension functions
cee82813 - CLEANUP: Remove unused values/locals
36f3a843 - FEAT: Allow doing static replacement for objects of any type, and create the same object type upon each replacement
bc95d1af - CLEANUP: Update schema to correctly handle or-lists
cf8903f1 - CLEANUP: Remove unnecessary print statement
07d603f1 - FIX: Correct stale module catalog data
bd4c9268 - FIX: Replace `match` instances with `find` ones
0c1d5b18 - FIX: Validate objects before disabling them too
5309fed9 - CLEANUP: Localize functions in deletemanager
ee64a24b - FIX: Correct field lookup order in DeleteManager
692c86d0 - FIX: Add cell and coords to CONDITIONPRIORITY so they aren't discarded
21cb7073 - FIX: Initialize target scale from actual reference scale instead of 1.0
a9dd6f39 - CLEANUP: Use object cell, not name, when replacing
dda756f6 - CLEANUP: Update schema file
91f41c4c - CLEANUP: Precompute action hashes for instance modifiers at load time
69bea002 - FIX: Allow unconditional instance modifiers
ef4bc5c1 - CLEANUP: Localize values and fix modulo correctness in util.lua
6fafc240 - CLEANUP: Localize global functions in globalSettings.lua
7477894e - CLEANUP: Further minor/semantic optimization in processActiveObject
e65079cc - FEAT: Batch object replacements so we can get more done in a single tick, but in a bounded fashion
39e4316f - CLEANUP: Slightly less work in processActiveObject
3d69117f - FIX: Allow optional gridIndices or celLNameMatches in staticReplacements
96977b23 - CLEANUP: Allow ping-pong between activating/disabling relevant instances
98437759 - FEAT: Add `composedReplacements` to the SSS interface
36db656d - FIX: Correct throw attempting to index a field that doesn't exist
58c30a91 - FIX: Don't attempt to load modules until after state injection
32f1115e - CLEANUP: Instead of replacing every object simultaneously, place them into a queue for deletion/replacement to spread work across ticks
c6e42ac1 - CLEANUP: Clarify SSS transform accumulation
ef1c35e9 - CLEANUP: Extract SSS transform application
4f24faa0 - CLEANUP: Extract SSS scale calculation
a113a99e - CLEANUP: Extract SSS replacement application
1dd73df3 - CLEANUP: Further optimize in getRotationValue
3009d51c - CLEANUP: Fix annotations throughout SSS
b91cc23d - CLEANUP: Extract instance modifiers into a dedicated module
f8d22dcb - CLEANUP: Formatting, improve annotations
8cabfd36 - CLEANUP: Migrate module catalog/loading into a dedicated source unit
b4c78e4a - CLEANUP: Migrate classic static modules into their own source unit
8137b7d4 - CLEANUP: Silence unnecessary diagnostic
7c965830 - CLEANUP: Less indentation in onUpdate
a6ded3b2 - FIX: DeleteManager annotations and return
dec6e6b8 - FIX: Correct deleteManager queue storage
b41f951a - CLEANUP: Silence some noise from lacking rubic0n annotations
1b506949 - CLEANUP: Migrate object deletion into a dedicated object
4398a55e - CLEANUP: Remove unused modules in globalSettings
4053fd03 - FIX: Move subscribe handler for module removal back to main global script
37e95aa3 - CLEANUP: Less goto pls
dc1f961e - FIX: Instance modules would always return truthy and break OnObjectActive
0e63986a - CLEANUP: Use PascalCase for some symbols
62149a39 - FIX: Actually import actionHandlers
299aa497 - CLEANUP: Formatting again
b80de54c - CLEANUP: Localize type
bb90c659 - CLEANUP: Damn assert again
67a6f72f - CLEANUP: Move actionHandlers into a dedicated file
c4af1d30 - CLEANUP: Formatting
1b751594 - CLEANUP: Migrate module removal functions and associated settings into their own globally-scoped script
2d91e9f4 - CLEANUP: Remove more unused stuff
0078f8c5 - CLEANUP: Remove some unused stuff in global
17ecaa8b - CLEANUP: Remove global functions and only use OnObjectActive
79b6e5ab - CLEANUP: Move most of the work from the menu script in static switcher to the global
c4f2967e - CLEANUP: Don't allocate a new table when scanning for replacement modules if we never actually need a replacement module anyway
8f31bfcd - CLEANUP: Further localize vars in StaticSwitcher
cb92af21 - CLEANUP: Use numeric indexing in world.cells instead of ipairs iteration
b0d418e9 - CLEANUP: DO NOT USE GOTO
75868fb3 - FIX: Copy values from the correct table
2f276dcd - CLEANUP: Localize pcall
40c21a51 - CLEANUP: Less table allocations
99420aaf - CLEANUP: Formatter run, localize sendMenuEvent
0ea54bad - FIX: Use Cod3x annotations for ReplacedObjectData/ObjectDeleteData
c97fef32 - CLEANUP: Preallocate replacement tables
7b2610b7 - CLEANUP: Further localize some functions, better Cod3x annotations, extract conditionHandlers into their own file
62804b4f - CLEANUP: Improve type annotations for StaticSwitcher based on latest Cod3x
16812dc7 - CLEANUP: Actually don't bother to keep an extra table around just for that
3ec7792c - CLEANUP: Track and allocate state separately in SSS
7cb5a731 - CLEANUP: Move some SSS modules into H3 since there were already repeated instances of duplicate code and szudzik is already used elsewhere
13a0b087 - CLEANUP: Remove strings module and localize all the values since that's overcomplicated and silly
94065a0c - CLEANUP: Better annotations in staticSwitcher/global.lua, unfuck gameobject table keys
a29a77d3 - CLEANUP: Better annotations for staticSwitcher/util.lua, drop the strings table immediately after it's used
8f16a77c - CLEANUP: Localize math functions in szudzik.lua to minimize global lookups in cold paths
a869eabf - FEAT: Covert all template content to st4sh content. Based on old squashed commits
f432a618 - CLEANUP: Migrate to zola site structure