Latest:f573f825 - DOC: Cod3x as the OpenMW Lua scripting bible

a780dcd7 - FIX: Fuck YAML

feddef3a - DOCS: Take the nuclear option

Version 1.0:a7235b8f - SITE: Add SSS logo to its main page

bb245dcf - 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