All data related to quests and completion/failure conditions is stored in the INI files located in Data/INI/ProgressTracker. To add support for a mod, simply place an INI file with a name like "ModName.esp.ini" into the folder, and Progress Tracker will load it automatically (similarly to how LINK handles cfg files, note that INI names in Progress Tracker include the esp/esm extension)
Quest Groups
Any quest must belong to at least one Quest Group.
Quest Groups are displayed on the left pane of the mod menu, and clicking on a group displays all the quests of that group in the right pane.
An example of adding a group:set ProgressTracker.GroupID to sv_Construct "MQ" ;internal ID of a group
set ProgressTracker.GroupDisplayName to sv_Construct "Main Quest" ;displayed name of a group in the menu
set ProgressTracker.GroupPriority to 10;governs sorting of groups in the menu; the lower the number the higher the group is in the list
set ProgressTracker.GroupIcon to sv_Construct "Menus\Stats\misc_faction_icons\guild_miscellaneous_blades.dds" ;path to the displayed icon
SetStage ProgressTracker 10 ;launches the function to add the group to the database
Sample GroupPriority values for vanilla Oblivion quest groups:
Oblivion Main Quest 10
Guild Questlines 20
Shivering Isles Questline 30
KotN 40
Daedric Quests 45
Misc Quests 50-55
Master Trainers/Houses 60
Individual Quests
A Simple Example
An example of a quest without failure conditions, non-essential NPCs, and when a quest belongs to the same esp as the INI file does. The icon and the name of a quest are loaded automatically.
;MQ15 "Paradise" [QUST:0000C20B]
set ProgressTracker.QuestGroupID to sv_Construct "MQ" ;internal ID of the group to which this quest belongs
set ProgressTracker.QuestSFormID to sv_Construct "00C20B" ;FormID (excluding the first two symbols which indicate the loadorder of the esp) of the quest
set ProgressTracker.QuestStageCompletion0 to 100 ;stage which must be completed for a quest to be considered completed
set ProgressTracker.QuestDescription to sv_Construct "Explore an unfamiliar realm and meet some old acquaintances." ;description of the quest shown in the right pane
SetStage ProgressTracker 20;launches a function to add the quest into DB
Custom Icons and Displayed Names
You can set custom displayed names or icons for quests:
set ProgressTracker.QuestName to sv_Construct "Pit Dog Matches"
set ProgressTracker.QuestIcon to sv_Construct "menus\icons\Quest\icon_arena.dds"
Using Editor Quest ID instead of FormID
Sometimes you cannot use FormIDs to define quests, for instance, when a quest belongs to some other mod or when there is no corresponding quest record. In this case, you can use Quest Editor ID. The only limitation is that you have to define Icon and Displayed Name in the ini.
;MQ15 "Paradise" [QUST:0000C20B]
set ProgressTracker.QuestGroupID to sv_Construct "MQ" ;internal ID of the group to which this quest belongs
set ProgressTracker.QuestID to sv_Construct "MQ15" ;Editor ID of the quest
set ProgressTracker.QuestStageCompletion0 to 100 ;stage which must be completed for a quest to be considered
completed
set ProgressTracker.QuestDescription to sv_Construct "Explore an unfamiliar realm and meet some old
acquaintances."
set ProgressTracker.QuestName to sv_Construct "Paradise"
set ProgressTracker.QuestIcon to sv_Construct "menus\icons\Quest\quest_icon.dds"
;description of the quest shown in the right pane
SetStage ProgressTracker 20;launches a function to add the quest into DB
Multiple Completion Conditions
Up to 6 quest stages can complete a quest. If at least one of these stages is completed, the quest is considered completed.
set ProgressTracker.QuestStageCompletion0 to 100
set ProgressTracker.QuestStageCompletion1 to 150
set ProgressTracker.QuestStageCompletion2 to 200
set ProgressTracker.QuestStageCompletion3 to 50
set ProgressTracker.QuestStageCompletion4 to 30
set ProgressTracker.QuestStageCompletion5 to 45
Failure Conditions
You can define up to 6 failure conditions. If at least one of these stages is completed, the quest is considered failed.
set ProgressTracker.QuestIDFailure0 to 100
set ProgressTracker.QuestIDFailure1 to 150
set ProgressTracker.QuestIDFailure2 to 200
set ProgressTracker.QuestIDFailure3 to 50
set ProgressTracker.QuestIDFailure4 to 30
set ProgressTracker.QuestIDFailure5 to 45
Additionally, a quest can be failed by a completed stage of another quest. For example, achieving stage 20 of Dark10Sanctuary quest will fail the quest to which this entry is added:
set ProgressTracker.QuestIDFailure0 to sv_Construct "Dark10Sanctuary"
set ProgressTracker.QuestStageFailure0 to 20
Note: QuestIDFailureN accepts only Editor IDs.
What happens if completion and failure conditions are both satisified?
Priority list for quest status:
- 1. Completion conditions 0 and 1 - if satisfied the quest is completed.
2. Failure conditions - if satisfied and completion conditions 0 and 1 are not satisfied, the quest is failed
3. Completion conditions 2-5 - quest is completed if no failure conditions triggered
Why so complicated? There are weird cases when quest completion stage is set even when the quest is failed, or a failing condition might be triggered after the quest is completed.
NPC Death Conditions
Quests can fail if a specific NPC is dead and a quest is not yet completed. Useful for missing journal entries for NPC deaths or for situations when a quest is not yet started.
Example:
set ProgressTracker.QuestGiverRefID0 to sv_Construct "01DA90"
You can add NPCs up to QuestGiverRefID4. Only FormIDs can be used in this field. If an NPC is question is not from the esp corresponding to the ini, you can specify the esp:
set ProgressTracker.QuestGiverEsp0 to sv_Construct "Oblivion.esm"
Additionally, you can stop NPC death processing after a certain quest stage (for instance, when the NPCs are no longer needed or when quest's own failure stages kick in). For example, if you add this line, NPC death processing will only fail quests if GetStage < 10
set ProgressTracker.QuestGiverCheckMaxStage to 10
Conditions Stored in Variables
Sometimes there are no quest stages available or they are not convenient to use. You can use a variable (or, technically, any expression executable in Oblivion console) to determine whether a quest is completed.
The following code completes the quest if Arena.CombatantsKilled >= 7
set ProgressTracker.QuestVariableName0 to sv_Construct "Arena.CombatantsKilled"
set ProgressTracker.QuestVariableValue0 to 7
set ProgressTracker.QuestVariableComparisonOperator0 to 1
QuestVariableComparisonOperator0 so far has two options: 0 is ==, 1 is >=
Guild Expulsion Conditions
A special quest type. When such quest is completed an indicator is shown for the quest's Quest Group all remaining uncompleted quests in the Group are failed. An expulsion quest does not appear in the list of quests and is not used in progress calculations.
To mark quest as an expulsion quest add
set ProgressTracker.QuestTypeExpelled to 1
Questlines
You can connect certain quests of a quest group into a questline. If one quest of a questline quests fails all the others fail too. Additionally, removes a visual separator if quests are placed together:

set ProgressTracker.QuestLine to sv_Construct "Umbacano"
Mutually Exclusive Quests
If one of the mutually exclusive quests is completed, all uncompleted/failed mutually exclusive quests are hidden and are not included into progress stats calculations. Additionally, it adds a visual "or" indicator if the quests are placed together:

set ProgressTracker.QuestAlternativeGroup to sv_Construct "SEDukeRitual"
(NEW) Multiple journal entries for one quest stage
When checking if a certain quest stage is completed, you can check if a specific log entry within the stage is completed. To do so add ProgressTracker.QuestStageCompletion0/ProgressTracker.QuestStageFailure0 line to the quest block in the ini.
set ProgressTracker.QuestStageFailure0 to 100
set ProgressTracker.QuestStageFailureEntry0 to 3
In this case the quest will be considered completed only if the stage 100 is completed and the log entry with id 3 is shown to the player. Note that the numbering of log entries starts from 0 -- if in doubt, check in xEdit.
(NEW) Hide a quest depending on the queststage of other quest
You can automatically hide a quest if some other quest completed (i.e. some stage is reached).
set ProgressTracker.QuestHideConditionQuestID to sv_Construct "bgOQ11Smile"
set ProgressTracker.QuestHideConditionQuestStage to 100
In this case the quest is hidden if the quest with EditorID "bgOQ11Smile" has reached stage 100. Can be useful for branching questlines where using quest alternatives syntax is too messy.
(NEW) Override of fields from another quest
You can override data for the quests loaded earlier (inis are loaded according to the esp LO). The syntax is simple:
set ProgressTracker.OverrideQuestID to sv_Construct "DAMolagBal" ;Progress Tracker ID for the quest to overwrite. If not set manually with ProgressTracker.QuestID, then it will be equal to the Editor ID of the underlying quest (beware of collisions, if a duplicated editor ID is detected, a "COPY" suffix is added to the later record, but it is not reliable).
set ProgressTracker.OverrideField to sv_Construct "QuestDescription" ;field to override
set ProgressTracker.OverrideString to sv_Construct "Make an honorable man break his solemn vow. Offering: Lion Pelt. Cannot be completed along 'A Path of Iron'." ;value of the field if a string is expected
;set ProgressTracker.OverrideFloat to 0 ;value of the float if a float is expected
SetStage ProgressTracker 30 ;note that a different stage is activated
The example code is used in the support ini for OOO. The block changes data for the vanilla Molag Bal quest defined in Oblivion.esm.ini to account for the impossibility to complete both the Molag Bal quest and OOO's 'A Path of Iron' in one playthrough in the description. Note, that this function can be used with conditional loading described in the next section which can be particularly useful.
(NEW) Checks for other esps enabled
In the recent update, a new SetStage ProgressTracker 40 block is introduced. This block contains conditions on whether certain esps are enabled; if the conditions are not satisfied, entries are not loaded until the filter is reset or the next ini is loaded.
Entries after this block will be loaded only if at least one of the esps in the list is loaded.
set ProgressTracker.LoadingEspReq0 to sv_Construct "Better Imperial City.esp"
set ProgressTracker.LoadingEspReq1 to sv_Construct "Better Cities IC Market.esp"
set ProgressTracker.LoadingEspReq2 to sv_Construct "Better Cities IC Temple.esp"
SetStage ProgressTracker 40
To reset the filter just call Stage 40 again without specifying any parameters. Note, that the filter is reset automatically for the next ini.
SetStage ProgressTracker 40
Additionally, you can check if a certain FormID is valid for the current esp. This can be useful for identifying dummy esps or for version control. The following code is used in Unique Landscapes.esp.ini. Depending on the setup, the UL esp can be either a merged UL esp or a dummy esp for bsa loading. The entry checks if a FormID related to a quest is valid, if this check is passed, then the esp is the merged version and the quest entries after the block are loaded.
set ProgressTracker.LoadingRefReq0 to sv_Construct "0E943D" ;ogre hunting quest, check if it is not the dummy UL.esp
SetStage ProgressTracker 40
Note, that a combination of LoadingRefReq0 and LoadingEspReqN conditions will be evaluated as OR.
If you need to construct an AND check you can use ProgressTracker.DoNotReset parameter. By default, the new condition block overrides the previous condition block, however, they are merged with AND operator if ProgressTracker.DoNotReset == 1
set ProgressTracker.LoadingEspReq0 to sv_Construct "Better Cities IC Market.esp"
set ProgressTracker.LoadingEspReq1 to sv_Construct "Better Imperial City.esp"
SetStage ProgressTracker 40
set ProgressTracker.LoadingEspReq0 to sv_Construct "Better Cities FULL.esp"
set ProgressTracker.LoadingEspReq1 to sv_Construct "Better Cities BRAVIL.esp"
set ProgressTracker.DoNotReset to 1
SetStage ProgressTracker 40
The entries below this example will execute only if ('Better Cities IC Market' is enabled OR 'Better Imperial City' is enabled) AND ('Better Cities FULL' is enabled OR 'Better Cities BRAVIL' is enabled)
0 comments