<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.fightorder.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Recoil%3AVFS_Basics</id>
	<title>Recoil:VFS Basics - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.fightorder.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Recoil%3AVFS_Basics"/>
	<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:VFS_Basics&amp;action=history"/>
	<updated>2026-04-21T05:49:53Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:VFS_Basics&amp;diff=1075&amp;oldid=prev</id>
		<title>Qrow at 03:18, 24 February 2026</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:VFS_Basics&amp;diff=1075&amp;oldid=prev"/>
		<updated>2026-02-24T03:18:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 20:18, 23 February 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l12&quot;&gt;Line 12:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 12:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;By default, games live in the `./games/` subfolder of your Recoil folder and maps live in `./maps/`, but a  lobby can specify arbitrary archives .&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;By default, games live in the `./games/` subfolder of your Recoil folder and maps live in `./maps/`, but a  lobby can specify arbitrary archives .&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/del&gt;[!WARNING]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[!WARNING]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt; &lt;/del&gt;At the moment,  files in dependencies are completely overridden  in the VFS and are not accessible.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;At the moment,  files in dependencies are completely overridden  in the VFS and are not accessible.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The user can also  specify local content folders  which are then loaded from,  if the game allows  that.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The user can also  specify local content folders  which are then loaded from,  if the game allows  that.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:VFS_Basics&amp;diff=1074&amp;oldid=prev</id>
		<title>Qrow: Created page with &quot;### What is loaded?  Recoil Engine  loads content from three main places  into its Virtual Filesystem (VFS): the game, the map, and the user&#039;s local files. The game and the map  are specified by the lobby  when launching an instance of Recoil.  Game content is primary  and it usually decides whether to even load content from the other two, with some exceptions (for example map layout is always taken from the map archive).  ### Archives  Games and maps  typically come as...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:VFS_Basics&amp;diff=1074&amp;oldid=prev"/>
		<updated>2026-02-24T03:18:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;### What is loaded?  Recoil Engine  loads content from three main places  into its Virtual Filesystem (VFS): the game, the map, and the user&amp;#039;s local files. The game and the map  are specified by the lobby  when launching an instance of Recoil.  Game content is primary  and it usually decides whether to even load content from the other two, with some exceptions (for example map layout is always taken from the map archive).  ### Archives  Games and maps  typically come as...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;### What is loaded?&lt;br /&gt;
&lt;br /&gt;
Recoil Engine  loads content from three main places  into its Virtual Filesystem (VFS): the game, the map, and the user&amp;#039;s local files.&lt;br /&gt;
The game and the map  are specified by the lobby  when launching an instance of Recoil.&lt;br /&gt;
 Game content is primary  and it usually decides whether to even load content from the other two, with some exceptions (for example map layout is always taken from the map archive).&lt;br /&gt;
&lt;br /&gt;
### Archives&lt;br /&gt;
&lt;br /&gt;
Games and maps  typically come as archives  (a single compressed file).&lt;br /&gt;
For development purposes, they can also be  regular folders as long as their name ends with &amp;quot;.SDD&amp;quot; , though this is  not recommended for production  (for performance reasons).&lt;br /&gt;
Archives  can specify dependency  upon other archives, so  if you want to build upon an existing game you don&amp;#039;t need to copy-paste its whole contents  (and probably shouldn&amp;#039;t).&lt;br /&gt;
By default, games live in the `./games/` subfolder of your Recoil folder and maps live in `./maps/`, but a  lobby can specify arbitrary archives .&lt;br /&gt;
&lt;br /&gt;
&amp;gt; [!WARNING]&lt;br /&gt;
&amp;gt; At the moment,  files in dependencies are completely overridden  in the VFS and are not accessible.&lt;br /&gt;
&lt;br /&gt;
The user can also  specify local content folders  which are then loaded from,  if the game allows  that.&lt;br /&gt;
By default, the Recoil folder is the read directory.&lt;br /&gt;
In this case, there is usually  no archive - loose files are seen by the VFS .&lt;br /&gt;
Of course  an archive can be such loose file  and there are interfaces to load its contents.&lt;br /&gt;
&lt;br /&gt;
### Sync&lt;br /&gt;
&lt;br /&gt;
The  game and map are synced , meaning their contents can be used as  authoritative data related to the simulation .&lt;br /&gt;
Local files are unsynced, so they  cannot even be accessed from synced contexts .&lt;br /&gt;
For example, the game can define that a tank has 100 health.&lt;br /&gt;
The game  can give the map an opportunity to modify this , so for example the map can say the tank has 200 health instead.&lt;br /&gt;
But there is no way for local files to modify that further, unit health is part of the game mechanics simulation so the game cannot defer to local files here even if it wants to.&lt;br /&gt;
What this means is that  local files are largely for local content like the UI , and it is generally  safe to assume the VFS is under a game dev&amp;#039;s control even if you don&amp;#039;t pay attention , as far as mechanics are concerned.&lt;br /&gt;
&lt;br /&gt;
### How do I defer to the other content?&lt;br /&gt;
&lt;br /&gt;
VFS interfaces tend to  expect a _mode_ parameter , which lets you specify  where to look for and in what order .&lt;br /&gt;
The values are strings so  you can combine them  using the `..` operator, and they are read left-to-right.&lt;br /&gt;
For example, if you want to include a file from the map but also have a game-side backup, you&amp;#039;d pass `VFS.MAP..VFS.GAME` to `VFS.Include`.&lt;br /&gt;
Since `VFS.RAW` was not passed, any existing loose file with the appropriate name among the user&amp;#039;s local files is ignored.&lt;br /&gt;
See below for a listing of modes accessible to Lua.&lt;br /&gt;
&lt;br /&gt;
By paying attention to the VFS mode, you can  prevent loading unwanted content .&lt;br /&gt;
As mentioned above, requesting unsynced modes in synced contexts is also ignored.&lt;br /&gt;
&lt;br /&gt;
### Loose remarks&lt;br /&gt;
&lt;br /&gt;
There is a fourth place where content is loaded from, the  basecontent  archive.&lt;br /&gt;
The engine  always loads  it and it contains various  bare necessities  for a functional game, such as default water texture or the basic wupget frameworks.&lt;br /&gt;
Its content is  entirely optional  and can be avoided via the usual VFS mode interface, though even mature games will usually want to make use of its facilities.&lt;br /&gt;
&lt;br /&gt;
The engine  can also write files  in addition to reading them.&lt;br /&gt;
Unlike multiple read-folders, there is  only a single write-folder  (defaults to the Recoil folder).&lt;br /&gt;
Writing is done by general Lua interfaces such as `io` and `os`, not `VFS`.&lt;br /&gt;
&lt;br /&gt;
A somewhat unorthodox way to pass (synced) content is  via modoptions .&lt;br /&gt;
Modoptions can  contain data  that gameside code can act upon, and if you&amp;#039;re brave enough you can even  pass Lua code  as a modoption to be executed.&lt;br /&gt;
This is one of the ways to let people  run their local files in a synced way , by just forwarding them as modoptions.&lt;br /&gt;
&lt;br /&gt;
## VFS mode listing&lt;br /&gt;
Here are the fundamental modes:&lt;br /&gt;
&lt;br /&gt;
* `VFS.GAME` - anything included by either a game OR its dependencies, as long as they are not basecontent. There is no way to tell where a file comes from, but dependencies override!&lt;br /&gt;
* `VFS.MAP` - the map archive.&lt;br /&gt;
* `VFS.BASE` - loaded basecontent archives. Some of those are always implicit dependencies. Any dependency with the appropriate archive type fits though.&lt;br /&gt;
* `VFS.MENU` - the loaded menu (lobby) archive, i.e. in practice Chobby.&lt;br /&gt;
* `VFS.RAW` - anything not in an archive, i.e. any loose files the client may have in his data folder, or even anywhere on the filesystem. Only unsynced content can access these.&lt;br /&gt;
&lt;br /&gt;
And here are the convenience/legacy ones:&lt;br /&gt;
&lt;br /&gt;
* `VFS.ZIP` = `VFS.GAME .. VFS.MAP .. VFS.BASE`. Synced content can only use subsets of this. Note that this doesn&amp;#039;t mean actual `.zip` (aka `.sdz`) archives, `.sdd` and `.sd7` still apply.&lt;br /&gt;
* `VFS.ZIP_FIRST` = `VFS.ZIP .. VFS.RAW`.&lt;br /&gt;
* `VFS.RAW_FIRST` = `VFS.RAW .. VFS.ZIP`.&lt;br /&gt;
* `VFS.MOD` = `VFS.GAME`. This is NOT for mods, they are indistinguishable from the main game from the VFS&amp;#039; point of view! It&amp;#039;s just a legacy synonym.&lt;br /&gt;
* `VFS.RAW_ONLY` = `VFS.RAW`.&lt;br /&gt;
* `VFS.ZIP_ONLY` = `VFS.ZIP`.&lt;/div&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
</feed>