A component for LiveSplit which outputs information to a text file in a folder you choose, which can then be added to OBS as a text source.
- Download
LiveSplit.OutputToFile.dllfrom the releases page. - Close LiveSplit. Put the DLL in the
Componentsfolder inside LiveSplit's folder, replacing the older one if it's there. - Open LiveSplit, right-click it and choose Edit Layout.... Click +, then Other → Output to File.
- Click Layout Settings, open the Output to File tab, and choose a folder under Folder Path. The files are written there from then on.
- In OBS, add a Text source, tick Read from file, and choose one of the files.
It's built and tested with LiveSplit 1.8.37, and hasn't been tried with older versions. If your LiveSplit is older, update it first.
From release 8 on, LiveSplit tells you at startup when a newer release is out, shows what changed, and asks whether to update. If you choose Yes, LiveSplit closes, installs the new release and opens again. Release 8 itself has to be installed by hand, as described above.
The settings are in LiveSplit's Layout Settings, on the Output to File tab.
- Folder Path: the folder the files are written to. Type it, or click Browse. A typed path is used once you leave the box, press Enter or click OK. Closing the settings with the X button drops it.
- Output: which files to write. Turning one off empties its files.
- Timer: the timers in
Timers. Off at first. - Subsplits: the
SansSubsplitsfolders (see Subsplits). On at first. - Completed splits:
CompletedSplits, a list of every split done so far. Off at first. - Split List:
SplitList, a list of the splits around the current one. On at first. - Custom variables:
CustomVariables, the variables your auto splitter or other tools set (see below). Off at first. - Remaining splits:
RemainingSplits, a list of every split not done yet, the current one included. Off at first. - Full split list:
FullSplitList, a list of every split, done or not. Off at first.
- Timer: the timers in
- Split List Writing: how many splits
SplitListshows before and after the current one, 10 each at first. Near the start and the end of the run, the list shows the first or the last splits instead, so its length stays the same. Scrolling with the mouse wheel over LiveSplit movesSplitListtoo: each notch moves on a split, and the list shows the splits around that split, the same way it shows those around the current one. The next split, start, skip, undo or reset brings it back to the current split. - Comparisons: which comparisons get a folder of their own (see Comparisons).
- Time Format: the decimals of times and of differences (see below).
Times and differences are written the way LiveSplit writes them: 0:05, +5.2, +1:05, with the minus sign − for negatives. Under Time Format, choose their decimals: Seconds, Tenths, Hundredths, Milliseconds, or Flex, which adds decimals only where a value would otherwise read as zero (a time under a second, a difference under a tenth). The defaults are Seconds for times and Flex for differences. The timers always show whole seconds.
If a file can't be written, because another program has it locked, it's read-only, or its drive is gone, the other files are still written. A red line at the bottom of the settings then says which file, when, and why. It goes away once that file has been written.
The tree at the end of this page lists every file.
- The main folder holds the run's details:
GameName.txt,CategoryName.txt,PlatformName.txt(the platform set in Edit Splits),RegionName.txt(the region),UsesEmulator.txt(Emulatorwhen Uses Emulator is ticked, otherwise empty),Variables.txt(see below),AttemptCount.txt,FinishedRunsCount.txt, the number of splits, andCurrentComparison.txt(see Comparisons). Variableshas a file for each variable set in Edit Splits, with its value:Variables\Variant.txtholdsUnrestricted. A file is named after its variable, without the?that Yes/No variables end with, and with_for any character a file name can't have.Variables.txthas them all on one line, as LiveSplit adds them to the category in its title:Unrestricted, No Glitches.CurrentSplitis about the split you're on, andPreviousSplitabout the one you just did.SplitListis a list of the splits around the current one.CompletedSplitslists every split done so far,RemainingSplitsevery split not done yet, andFullSplitListevery split.Timersholds the run's timer,RunTimer.txt, and the time since the last split,SegmentTimer_….txt.CustomVariableshas a file for each custom variable, with its value: LiveSplit's own variables, which auto splitters and other tools can set, such as a death count inCustomVariables\Deaths.txt. Each file changes as soon as its value does. A variable that LiveSplit knows of but that has no value yet shows-. Files are named as inVariables.
Each of these has a folder or a file for every subsplit level (see Subsplits), and times are written for real time and game time, in RealTime and GameTime folders.
Total Splits is the number of splits.
Number is the current split's number, counting from 1. It's - before the timer starts and after the finish.
Completed is the number of splits done, skipped ones included.
Remaining is the number of splits not done yet, the current one included.
After is the number of splits after the current one. It's - before the timer starts and after the finish.
Name.txt and Names.txt give split names as shown: without their leading dashes, or as their section's name (see Split Names). Name_Raw.txt and Names_Raw.txt give them exactly as typed in LiveSplit.
Every file in a list has one line per split, so text sources placed side by side line up. A line with nothing to show is blank. Names_Indent_0.txt, Names_Indent_1.txt, … have a split's name only on the lines of splits with that many dashes, so each depth can be its own text source, indented differently. Numbers.txt has each split's number, counting from 1, as Number.txt does: in SansSubsplits the sections are numbered 1, 2, 3, …. The other folders than AllSplits also give each line's number in the folders with more splits: Numbers_AllSplits.txt, Numbers_SansSubsplits_Level2.txt, and so on. A section's number there is that of its last split, so in SansSubsplits, Numbers_AllSplits.txt might read 3, 5, 9.
The other lists have the same files as SplitList, except Highlight_ScrolledToSplit.txt, since they don't scroll. Some leave out more:
CompletedSplitsalso leaves outHighlight_CurrentSplit.txtand theTime_…_Upcoming.txtfiles, since none of its splits are current or upcoming.RemainingSplitsleaves out the files about splits already done:Time_Run_Current.txt, theDelta_…files, and every highlight butHighlight_CurrentSplit.txt. It starts at the current split, and is empty once the run is finished.FullSplitListhas every split, from before the start to after the finish. During the run, it has the lines ofCompletedSplitsfollowed by those ofRemainingSplits.
Highlights are a shaded bar to layer behind splits. Highlight_ScrolledToSplit.txt marks the split you've scrolled to with the mouse wheel (see Split List Writing under Settings), or in SansSubsplits the section it's in. It's empty while you haven't scrolled.
The files of an output you turn off in the settings, of a comparison you untick, or of a subsplit level your splits no longer have, are emptied rather than deleted, so text sources that use them show nothing. The component treats everything in its folders (CurrentSplit, PreviousSplit, SplitList, CompletedSplits, RemainingSplits, FullSplitList, Timers, Variables and CustomVariables) as its own, so don't keep other files there.
When you close LiveSplit, it resets the timer, so the files show what they show after a reset. Close Splits does the same, and the files then show its empty splits. Opening another layout, or removing the component from the layout, leaves the files as they are.
Differences, Sign.txt, the ahead and behind highlights, and the split and segment times of the current and upcoming splits compare against a comparison, as LiveSplit's own splits do. Those files are in a comparison folder inside GameTime and RealTime:
CurrentComparisonfollows the comparison selected in LiveSplit (right-click → Compare Against).CurrentComparison.txtholds its name.- Tick a comparison under Comparisons in the settings to also get a folder for it, named after it without its spaces, such as
PersonalBestorAverageSegments. All custom comparisons gives every comparison you added in Edit Splits a folder, in whatever splits you open. - A ticked comparison you rename in Edit Splits stays ticked, and its folder takes the new name, so point its text sources at the new folder. LiveSplit then asks to save your layout when it closes, which keeps the new name ticked. If you cancel Edit Splits, the old name is ticked again.
Golds don't depend on the comparison, so their files stay in GameTime and RealTime.
Sign.txt in PreviousSplit sums up the split you just did, against its folder's comparison. Ahead and Behind say whether your time at that split is ahead of or behind the comparison's. The rest says how the split's segment went. The first value that applies is used:
| Value | Meaning |
|---|---|
NotApplicable |
Nothing to compare: the timer isn't running, no split is done yet, the split was skipped, or the comparison has no time for it |
GoldAhead, GoldBehind |
The segment is a gold: faster than your best, or the first time it was done |
Ahead, Behind |
There's no segment to compare: the split before it was skipped, or the comparison has no segment time for it |
GainedAhead, GainedBehind |
The segment was faster than the comparison's |
LostAhead, LostBehind |
The segment wasn't faster than the comparison's |
At the finish, Sign.txt says Finished followed by what it would say during the run, such as FinishedGainedAhead or FinishedNotApplicable. In the PersonalBest folder, the FinishedAhead values mean a new personal best.
In addition to the AllSplits folder, which takes into consideration every split regardless of whether it is a subsplit or not, if applicable there will also be a SansSubsplits folder. These will only include splits that do not start with a dash (-) (These appear to be referred to in the official subsplits module as 'Section Headers'). Furthermore, the component supports multi-level subsplits, which are subsplits of subsplits, and are created by putting two (2) or more dashes in front of your splitname. Each of these levels gets a folder named after the dashes it leaves out: SansSubsplits_Level2 has every split except those with two or more dashes, SansSubsplits_Level3 every split except those with three or more, and so on. There is no limit to how many levels deep you can go. The Subsplits setting turns these folders off.
Split names in the output leave out the leading dashes and one space after them. To show a name that starts with a dash, put a space before it: a subsplit named - -40 shows as -40.
As in LiveSplit's Subsplits component, a name in braces at the start of a split names the section that split ends. A split named {Area A}A3 shows as Area A in SansSubsplits, where it stands for the whole section, and as A3 in AllSplits. With more levels, give a split a name in braces for each level it shows in. Splits named --Start, -{Stage 1}Exit and {World 1}{Stage 2}Boss show as World 1 in SansSubsplits, as Stage 1 and Stage 2 in SansSubsplits_Level2, and as Start, Exit and Boss in AllSplits.
Every folder has its own golds. In AllSplits they are LiveSplit's golds. In the SansSubsplits folders, a section that groups several splits has its own gold: the fastest you have done the whole section within one attempt, taken from your splits' history. That's usually slower than its subsplits' golds added up, because those come from different attempts. A section you have never finished in one attempt has no gold yet, so finishing it counts as one.
This is the tree for splits with three levels of subsplits, one variable, Variant, and one custom variable, Deaths, with every output on and Personal Best ticked under Comparisons. To keep it short, the PersonalBest folder is shown once per output, though every GameTime and RealTime folder has one, and etc. marks a folder that holds the same kind of files as the ones above it.
| AttemptCount.txt
| CategoryName.txt
| CurrentComparison.txt
| FinishedRunsCount.txt
| GameName.txt
| PlatformName.txt
| RegionName.txt
| TotalSplits_AllSplits.txt
| TotalSplits_SansSubsplits.txt
| TotalSplits_SansSubsplits_Level2.txt
| TotalSplits_SansSubsplits_Level3.txt
| UsesEmulator.txt
| Variables.txt
|
+---CompletedSplits
| +---AllSplits
| | | Names.txt
| | | Names_Indent_0.txt
| | | Names_Indent_1.txt
| | | Names_Indent_2.txt
| | | Names_Indent_3.txt
| | | Names_Raw.txt
| | | Numbers.txt
| | |
| | +---GameTime
| | | | Delta_Gold.txt
| | | | Highlight_Gold.txt
| | | | Time_Run_Current.txt
| | | |
| | | +---CurrentComparison
| | | | Delta_Run.txt
| | | | Delta_Segment.txt
| | | | Highlight_AheadGained.txt
| | | | Highlight_AheadLost.txt
| | | | Highlight_BehindGained.txt
| | | | Highlight_BehindLost.txt
| | | |
| | | \---PersonalBest
| | | Delta_Run.txt
| | | Delta_Segment.txt
| | | Highlight_AheadGained.txt
| | | Highlight_AheadLost.txt
| | | Highlight_BehindGained.txt
| | | Highlight_BehindLost.txt
| | |
| | \---RealTime
| | | Delta_Gold.txt
| | | Highlight_Gold.txt
| | | Time_Run_Current.txt
| | |
| | \---CurrentComparison
| | Delta_Run.txt
| | Delta_Segment.txt
| | Highlight_AheadGained.txt
| | Highlight_AheadLost.txt
| | Highlight_BehindGained.txt
| | Highlight_BehindLost.txt
| |
| +---SansSubsplits
| | | etc.
| | …
| |
| +---SansSubsplits_Level2
| | | etc.
| | …
| |
| \---SansSubsplits_Level3
| | etc.
| …
|
+---CurrentSplit
| +---AllSplits
| | | After.txt
| | | Completed.txt
| | | Name.txt
| | | Name_Raw.txt
| | | Number.txt
| | | Remaining.txt
| | |
| | +---GameTime
| | | | GoldTime.txt
| | | |
| | | +---CurrentComparison
| | | | RunTime.txt
| | | | SegmentTime.txt
| | | |
| | | \---PersonalBest
| | | RunTime.txt
| | | SegmentTime.txt
| | |
| | \---RealTime
| | | GoldTime.txt
| | |
| | \---CurrentComparison
| | RunTime.txt
| | SegmentTime.txt
| |
| +---SansSubsplits
| | | After.txt
| | | Completed.txt
| | | Name.txt
| | | Name_Raw.txt
| | | Number.txt
| | | Remaining.txt
| | |
| | +---GameTime
| | | | GoldTime.txt
| | | |
| | | \---CurrentComparison
| | | RunTime.txt
| | | SegmentTime.txt
| | |
| | \---RealTime
| | | GoldTime.txt
| | |
| | \---CurrentComparison
| | RunTime.txt
| | SegmentTime.txt
| |
| +---SansSubsplits_Level2
| | | After.txt
| | | Completed.txt
| | | Name.txt
| | | Name_Raw.txt
| | | Number.txt
| | | Remaining.txt
| | |
| | +---GameTime
| | | | GoldTime.txt
| | | |
| | | \---CurrentComparison
| | | RunTime.txt
| | | SegmentTime.txt
| | |
| | \---RealTime
| | | GoldTime.txt
| | |
| | \---CurrentComparison
| | RunTime.txt
| | SegmentTime.txt
| |
| \---SansSubsplits_Level3
| | etc.
| …
|
+---CustomVariables
| Deaths.txt
|
+---FullSplitList
| +---AllSplits
| | | Highlight_CurrentSplit.txt
| | | Names.txt
| | | Names_Indent_0.txt
| | | Names_Indent_1.txt
| | | Names_Indent_2.txt
| | | Names_Indent_3.txt
| | | Names_Raw.txt
| | | Numbers.txt
| | |
| | +---GameTime
| | | | Delta_Gold.txt
| | | | Highlight_Gold.txt
| | | | Time_Gold_Upcoming.txt
| | | | Time_Run_Current.txt
| | | |
| | | +---CurrentComparison
| | | | Delta_Run.txt
| | | | Delta_Segment.txt
| | | | Highlight_AheadGained.txt
| | | | Highlight_AheadLost.txt
| | | | Highlight_BehindGained.txt
| | | | Highlight_BehindLost.txt
| | | | Time_Run_Upcoming.txt
| | | | Time_Segment_Upcoming.txt
| | | |
| | | \---PersonalBest
| | | Delta_Run.txt
| | | Delta_Segment.txt
| | | Highlight_AheadGained.txt
| | | Highlight_AheadLost.txt
| | | Highlight_BehindGained.txt
| | | Highlight_BehindLost.txt
| | | Time_Run_Upcoming.txt
| | | Time_Segment_Upcoming.txt
| | |
| | \---RealTime
| | | Delta_Gold.txt
| | | Highlight_Gold.txt
| | | Time_Gold_Upcoming.txt
| | | Time_Run_Current.txt
| | |
| | \---CurrentComparison
| | Delta_Run.txt
| | Delta_Segment.txt
| | Highlight_AheadGained.txt
| | Highlight_AheadLost.txt
| | Highlight_BehindGained.txt
| | Highlight_BehindLost.txt
| | Time_Run_Upcoming.txt
| | Time_Segment_Upcoming.txt
| |
| +---SansSubsplits
| | | etc.
| | …
| |
| +---SansSubsplits_Level2
| | | etc.
| | …
| |
| \---SansSubsplits_Level3
| | etc.
| …
|
+---PreviousSplit
| +---AllSplits
| | | Name.txt
| | | Name_Raw.txt
| | |
| | +---GameTime
| | | | GoldDifference.txt
| | | | RunTime.txt
| | | | SegmentTime.txt
| | | |
| | | +---CurrentComparison
| | | | RunDifference.txt
| | | | SegmentDifference.txt
| | | | Sign.txt
| | | |
| | | \---PersonalBest
| | | RunDifference.txt
| | | SegmentDifference.txt
| | | Sign.txt
| | |
| | \---RealTime
| | | GoldDifference.txt
| | | RunTime.txt
| | | SegmentTime.txt
| | |
| | \---CurrentComparison
| | RunDifference.txt
| | SegmentDifference.txt
| | Sign.txt
| |
| +---SansSubsplits
| | | Name.txt
| | | Name_Raw.txt
| | |
| | +---GameTime
| | | | GoldDifference.txt
| | | | RunTime.txt
| | | | SegmentTime.txt
| | | |
| | | \---CurrentComparison
| | | RunDifference.txt
| | | SegmentDifference.txt
| | | Sign.txt
| | |
| | \---RealTime
| | | GoldDifference.txt
| | | RunTime.txt
| | | SegmentTime.txt
| | |
| | \---CurrentComparison
| | RunDifference.txt
| | SegmentDifference.txt
| | Sign.txt
| |
| +---SansSubsplits_Level2
| | | Name.txt
| | | Name_Raw.txt
| | |
| | +---GameTime
| | | | GoldDifference.txt
| | | | RunTime.txt
| | | | SegmentTime.txt
| | | |
| | | \---CurrentComparison
| | | RunDifference.txt
| | | SegmentDifference.txt
| | | Sign.txt
| | |
| | \---RealTime
| | | GoldDifference.txt
| | | RunTime.txt
| | | SegmentTime.txt
| | |
| | \---CurrentComparison
| | RunDifference.txt
| | SegmentDifference.txt
| | Sign.txt
| |
| \---SansSubsplits_Level3
| | etc.
| …
|
+---RemainingSplits
| +---AllSplits
| | | Highlight_CurrentSplit.txt
| | | Names.txt
| | | Names_Indent_0.txt
| | | Names_Indent_1.txt
| | | Names_Indent_2.txt
| | | Names_Indent_3.txt
| | | Names_Raw.txt
| | | Numbers.txt
| | |
| | +---GameTime
| | | | Time_Gold_Upcoming.txt
| | | |
| | | +---CurrentComparison
| | | | Time_Run_Upcoming.txt
| | | | Time_Segment_Upcoming.txt
| | | |
| | | \---PersonalBest
| | | Time_Run_Upcoming.txt
| | | Time_Segment_Upcoming.txt
| | |
| | \---RealTime
| | | Time_Gold_Upcoming.txt
| | |
| | \---CurrentComparison
| | Time_Run_Upcoming.txt
| | Time_Segment_Upcoming.txt
| |
| +---SansSubsplits
| | | etc.
| | …
| |
| +---SansSubsplits_Level2
| | | etc.
| | …
| |
| \---SansSubsplits_Level3
| | etc.
| …
|
+---SplitList
| +---AllSplits
| | | Highlight_CurrentSplit.txt
| | | Highlight_ScrolledToSplit.txt
| | | Names.txt
| | | Names_Indent_0.txt
| | | Names_Indent_1.txt
| | | Names_Indent_2.txt
| | | Names_Indent_3.txt
| | | Names_Raw.txt
| | | Numbers.txt
| | |
| | +---GameTime
| | | | Delta_Gold.txt
| | | | Highlight_Gold.txt
| | | | Time_Gold_Upcoming.txt
| | | | Time_Run_Current.txt
| | | |
| | | +---CurrentComparison
| | | | Delta_Run.txt
| | | | Delta_Segment.txt
| | | | Highlight_AheadGained.txt
| | | | Highlight_AheadLost.txt
| | | | Highlight_BehindGained.txt
| | | | Highlight_BehindLost.txt
| | | | Time_Run_Upcoming.txt
| | | | Time_Segment_Upcoming.txt
| | | |
| | | \---PersonalBest
| | | Delta_Run.txt
| | | Delta_Segment.txt
| | | Highlight_AheadGained.txt
| | | Highlight_AheadLost.txt
| | | Highlight_BehindGained.txt
| | | Highlight_BehindLost.txt
| | | Time_Run_Upcoming.txt
| | | Time_Segment_Upcoming.txt
| | |
| | \---RealTime
| | | Delta_Gold.txt
| | | Highlight_Gold.txt
| | | Time_Gold_Upcoming.txt
| | | Time_Run_Current.txt
| | |
| | \---CurrentComparison
| | Delta_Run.txt
| | Delta_Segment.txt
| | Highlight_AheadGained.txt
| | Highlight_AheadLost.txt
| | Highlight_BehindGained.txt
| | Highlight_BehindLost.txt
| | Time_Run_Upcoming.txt
| | Time_Segment_Upcoming.txt
| |
| +---SansSubsplits
| | | Highlight_CurrentSplit.txt
| | | Highlight_ScrolledToSplit.txt
| | | Names.txt
| | | Names_Indent_0.txt
| | | Names_Raw.txt
| | | Numbers.txt
| | | Numbers_AllSplits.txt
| | | Numbers_SansSubsplits_Level2.txt
| | | Numbers_SansSubsplits_Level3.txt
| | |
| | +---GameTime
| | | | Delta_Gold.txt
| | | | Highlight_Gold.txt
| | | | Time_Gold_Upcoming.txt
| | | | Time_Run_Current.txt
| | | |
| | | \---CurrentComparison
| | | Delta_Run.txt
| | | Delta_Segment.txt
| | | Highlight_AheadGained.txt
| | | Highlight_AheadLost.txt
| | | Highlight_BehindGained.txt
| | | Highlight_BehindLost.txt
| | | Time_Run_Upcoming.txt
| | | Time_Segment_Upcoming.txt
| | |
| | \---RealTime
| | | Delta_Gold.txt
| | | Highlight_Gold.txt
| | | Time_Gold_Upcoming.txt
| | | Time_Run_Current.txt
| | |
| | \---CurrentComparison
| | Delta_Run.txt
| | Delta_Segment.txt
| | Highlight_AheadGained.txt
| | Highlight_AheadLost.txt
| | Highlight_BehindGained.txt
| | Highlight_BehindLost.txt
| | Time_Run_Upcoming.txt
| | Time_Segment_Upcoming.txt
| |
| +---SansSubsplits_Level2
| | | Highlight_CurrentSplit.txt
| | | Highlight_ScrolledToSplit.txt
| | | Names.txt
| | | Names_Indent_0.txt
| | | Names_Indent_1.txt
| | | Names_Raw.txt
| | | Numbers.txt
| | | Numbers_AllSplits.txt
| | | Numbers_SansSubsplits_Level3.txt
| | |
| | +---GameTime
| | | | Delta_Gold.txt
| | | | Highlight_Gold.txt
| | | | Time_Gold_Upcoming.txt
| | | | Time_Run_Current.txt
| | | |
| | | \---CurrentComparison
| | | Delta_Run.txt
| | | Delta_Segment.txt
| | | Highlight_AheadGained.txt
| | | Highlight_AheadLost.txt
| | | Highlight_BehindGained.txt
| | | Highlight_BehindLost.txt
| | | Time_Run_Upcoming.txt
| | | Time_Segment_Upcoming.txt
| | |
| | \---RealTime
| | | Delta_Gold.txt
| | | Highlight_Gold.txt
| | | Time_Gold_Upcoming.txt
| | | Time_Run_Current.txt
| | |
| | \---CurrentComparison
| | Delta_Run.txt
| | Delta_Segment.txt
| | Highlight_AheadGained.txt
| | Highlight_AheadLost.txt
| | Highlight_BehindGained.txt
| | Highlight_BehindLost.txt
| | Time_Run_Upcoming.txt
| | Time_Segment_Upcoming.txt
| |
| \---SansSubsplits_Level3
| | etc.
| …
|
+---Timers
| +---GameTime
| | RunTimer.txt
| | SegmentTimer_AllSplits.txt
| | SegmentTimer_SansSubsplits.txt
| | SegmentTimer_SansSubsplits_Level2.txt
| | SegmentTimer_SansSubsplits_Level3.txt
| |
| \---RealTime
| RunTimer.txt
| SegmentTimer_AllSplits.txt
| SegmentTimer_SansSubsplits.txt
| SegmentTimer_SansSubsplits_Level2.txt
| SegmentTimer_SansSubsplits_Level3.txt
|
\---Variables
Variant.txt