Progress will be laughably obsolete by the end of the weekend.



But, soon!



; =============; Fundament.ini; =============; Global and character-specific copies of this file are loaded when Fundament; initializes. The global file is loaded first, allowing the character-specific; file to contain overrides. Global configuration is located in Data\ini\.; Character-specific configuration is located in a subdirectory with your; character's name. For instance, Bendu Olo's configuration files are found in; Data\ini\Bendu Olo\. Nothing bad happens if either file is missing.;; You can do a lot of things here, but none of them are mandatory.;; The Basics; ----------; At the most basic level, you can change GMSTs, Oblivion.ini settings and; skill advancement rates. You can also directly load another configuration; file, which has access to all the same functions.;; Fundament.ini operations consist of setting a few quest variables, then; triggering a stage script which processes them. The first step is to set one; of four variables to the name of the thing you want to operate on. If more; than one of these variables contains a non-empty string, the operation will; be skipped.;; To change the value of the game setting iTrainingCostMult -; set fd.GMST to sv_Construct "iTrainingCostMult";; To change the setting "fGamma" in the "Display" section of Oblivion.ini -; set fd.Ini to sv_Construct "fGamma:Display";; To change the advancement ("use") rate for the Acrobatics skill -; set fd.Use to sv_Construct "Acrobatics";; To load global AND character-specific copies of "Awesome.ini" -; set fd.File to sv_Construct "Awesome";; For every operation except File, you also need to set a value. (If you don't,; it defaults to zero.) -; set fd.Value to 3.14159; ; Finally, each skill actually has two separate use rate settings which apply; to different uses of the skill. They're numbered 0 and 1, and use rate 0 is; configured by default. If you want to configure use rate 1 instead:; set fd.Which to 1;; Once you've set up an operation, this command executes it:; SetStage fd 1;; All variables are then reset, and you can perform another operation.;;; ==============; Advanced Usage; ==============;; Assertions; ----------; The instructions above are enough to handle most situations, but internally; Fundament is doing much more than just setting values. When you perform one; of the operations above, you're actually creating an "assertion" which is; recorded with a tag (by default, the base name of the file it came from) and; a priority (default 0). One use rate, GMST or ini setting can have any number; of assertions, but each tag is unique; if a new assertion is received with; the same tag as an existing one, the old one is replaced. To determine the; "canonical" value of a setting, Fundament runs through the list and picks; the assertion with the highest priority. If two or more are tied, the most; recent one is used.;; It might seem like overkill, but other mods can make assertions in their; scripts, either by being dependent on Fundament and calling its internal; functions, or through this same configuration system using RunScriptLine; commands. Other mods also have access to Fundament's records about what each; setting should be. This allows situational changes to be made during gameplay; without causing confusion about the base value of a setting. This facilitates; compatibility and eliminates potential bugs.;; Multipliers; -----------; In addition to assertions, Fundament keeps a list of multipliers for each; setting. These are also tagged, but have no priority. When determining a; setting's canonical value, every multiplier is applied to the leading; assertion.;; Configuration Switches; ----------------------; By setting additional variables, most features of the Fundament API can be; accessed within the configuration system.;; To set a multiplier instead of making an assertion -; set fd.Mult to 1;; To remove an assertion with the current tag (see below for changing tags) -; set fd.Rem to 1;; To update Fundament's records without actually setting the value in-game; (outside of user configuration, this is usually preferred) -; set fd.DoNotAssert to 1;; The flags above work together in any combination. For instance, setting Mult; and Rem will remove a multiplier. There is one other flag which works only in; specific combinations.;; To place the current canonical value of a setting in fd.Value:; set fd.Get to 1;; To place the current leading assertion for a setting into fd.Value:; set fd.Get to -1;; To place the current total multiplier for a setting into fd.Value:; set fd.Get to -1; set fd.Mult to 1;; If fd.Get is non-zero, the Rem and DoNotAssert flags are meaningless. The; Mult flag is only checked if fd.Get is negative.;; Changing Tag & Priority; -----------------------; Whenever the config loader starts to process a file, it sets the values of; fd.Tag and fd.Priority. The tag is set to the file's base name (e.g. for; Fundament.ini, the tag is "Fundament") and the priority is set to zero.; These can be changed by setting them directly, but unlike other config values; they are NOT reset after each operation. Any change will persist until the; end of the file. This is true even if you use the File operation to load; another config file: the current tag and priority are stored, defaults are; set for the new file, and after it finishes the original file's context is; restored before continuing.;; To change the tag for subsequent operations in this file:; set fd.Tag to sv_Construct "New Tag";; To change the priority for subsequent operations in this file:; set fd.Priority to 1.61803;; Note: negative priorities are invalid, and assertions made with a negative; priority are discarded. Likewise, an empty string is not a valid tag.;; External Operations; -------------------; A series of RunScriptLine commands can set up and perform any Fundament; config operation. (Otherwise the Get flag would be mostly useless!) When; interfacing with Fundament in this way, it is essential to explicitly set; fd.Tag and fd.Priority while preparing your operation, and always set up and; perform an operation within a single script frame.;; Debug/Message Options; ---------------------; NOTE: If you want debug output for the configuration process, these settings; should be moved to the top of the file. If you don't need it until the game; is running, they can be left at the end.;; Various messages can be sent to the console, to ConScribe (Fundament.log),; and to obse.log. For each you set a threshold, and any messages with a debug; level BELOW that threshold will be sent there. Messages with a debug level of; at least 1 are prefixed with "Fundament:" and the tag for their debug level.; (Messages sent to ConScribe have only the level-specific prefix.);; Debug levels are:; -1 = "New Game" and "Game Loaded" notifications. More useful than you think!; 0 = Notifies when a configuration file is loaded through Fundament.; 1 = "ERROR" - notifies when function calls fail to complete.; 2 = "DEBUG" - gives various messages tracking internal calculations.; 3 = "TRACE" - shows entry and exit for most function calls.; 4 = "VERBOSE" - additional tracking messages inside loops.;; The settings and their defaults are:; set fd.debug to 0; set fd.debugConScribe to 0; set fd.DebugOBSE to -1
but 
but 
Yes, this supersedes Progress, and blows it out of the water in every regard except maybe the sheer simplicity of Progress.ini. That's a deliberate trade-off for safety (you have to TRY to break your game with Fundament, rather than merely put your .ini in the wrong place) and, obviously, extreme flexibility in what you do and don't configure. Unless told otherwise, Fundament doesn't overwrite other mods' settings like Progress did so users who only download this because another mod requires it don't have to worry about configuration.
find /i "iactorluckskillbase" *.es? > output.txt
Not quite what I talking about with the OBSE request, though... the goal there is to not even need an array full of 80 shaders, instead being able to pick the desired settings (or create random ones) on the fly. This would wind up becoming a Formulator function.
Most of the core formulas will be copy-paste from the Progress versions, but a lot of the old active scripts can now be replaced with triggered events, which is better in numerous ways. A few new options here and there, too.
ScN nGCDfnGetAbilitiesarray_var AVint indexarray_var eachbegin _Function {AV} while (index < 33) let AV[index]["Mod"] := 0 let index += 1 Loop foreach each <- GetActiveEffectCodes if eval !(IsNthActiveEffectApplied each["key"]) CONTINUE endif if eval !((GetSpellType (GetNthAEMagicItem each["key"])) == 4) CONTINUE endif let index := GetNthAEAV each["key"] if eval !(index) if eval !(MagicEffectUsesAttribute each["value"]) CONTINUE endif elseif (index > 32) || (index == 11) CONTINUE endif let AV[index]["Mod"] += GetNthAEMagnitude each["key"] Loopend
). The other thing is that I′m a little unsure about those oldish mods like Bathing mod, reading about all those Do′s and Don′ts of mods using MODAV, MODAV2, MODWhatEver, and how they could mess up the game without necessarily being recognized by the unknowing user...but that′s just a side note.
