Game specification
nextel ringtones prozac online cheap ambien nexium online hoodia online wellbutrin online cheap sildenafil vigrx online cheap cialis levitra online order tramadol vicodin online cheap wellbutrin free qwest ringtones propecia online polyphonic ringtones cool ringtones free polyphonic ringtones free mono ringtones cheap hydrocodone cheap adipex alltel ringtones cheap valium tenuate online cheap phentermine cheap alprazolam cheap flexeril buy hgh meridia online ultram online free ringtones funny ringtones cheap diethylpropion free qwest ringtones real ringtones lipitor online cheap ultracet tramadol online cialis online sony ericsson ringtones funny ringtones zoloft online music ringtones cheap carisoprodol cheap zanaflex nokia ringtones cheap lortab free motorola ringtones samsung ringtones alltel ringtones sharp ringtones soma online free mtv ringtones cheap levitra cheap pharmacy online free real ringtones ambien online cheap diethylpropion cheap xanax lorazepam online free real ringtones free punk ringtones albuterol online cheap xanax fioricet cheap didrex free verizon ringtones ultracet online tracfone ringtones cheap clomid online ativan xanax online nexium online sonyericsson ringtones cheap clomid cheap adipex online cialis cheap hydrocodone cheap levitra midi ringtones order lisinopril free wwe ringtones cheap phentermine tracfone ringtones cheap sildenafil verizon ringtones midi ringtones phentermine online cheap rivotril online vicodin celexa online funny ringtones flexeril online cheap hoodia cheap tenuate buy prozac free sprint ringtones order norco meridia sprint ringtones buy diazepam fioricet mp3 ringtones paxil online zanaflex online but alprazolam soma online order diazepam wwe ringtones but zoloft buy lorazepam norco free free ringtones carisoprodol online free qwest ringtones cheap clonazepam cheap celexa clonazepam online lipitor online free nokia ringtones lisinopril online cheap propecia free nokia ringtones punk ringtones carisoprodol online ultram online sony ericsson ringtones tracfone ringtones zyban online hoodia online tramadol online free cingular ringtones jazz ringtones alltel ringtones but flexeril nextel ringtones kyocera ringtones samsung ringtones motorola ringtones cheap meridia cheap xenical sony ringtones paxil online sagem ringtones ativan online rivotril online ortho online celexa online free sharp ringtones adipex online ortho online hydrocodone cheap propecia free cingular ringtones nextel ringtones sagem ringtones adipex free punk ringtones buy didrex sonyericsson ringtones cheap didrex cheap diazepam samsung ringtones free sharp ringtones meridia online free mono ringtones cheap valium hgh online free nextel ringtones funny ringtones cheap lortab but ultracet buy viagra online albuterol cheap vicodin motorola ringtones lorazepam online ericsson ringtones free mp3 ringtones free sonyericsson ringtones viagra online cheap cyclobenzaprine but vigrx wwe ringtones zoloft online cheap clomid order fioricet samsung ringtones cheap albuterol tramadol online xenical online online alprazolam clonazepam online mp3 ringtones norco online xanax mtv ringtones free qwest ringtones online valium cheap sildenafil ===Overview===
This is a specification of how Spring will support mods and switching between them.
First, Spring looks for mods in the folders "maps", "base" and "mods", and all their subfolders. It is recommended however that mods simple are placed in the "mods" folder. If the mod contains more than one archive it might be nice to put them in a subfolder. As far as the switcher is concernced it does not matter where the files are though.
To present mods to switch between, Spring will search these folders and their subfolders for archive files containing a file called Mod_specification "modinfo.tdf". The general idea is that this file should be used as a manifest file to let Spring know what to do with the archive it is found inside, so each archive file in the mods directory is supposed to have one. Archive files that does not contain this file are ignored.
These info files will also be cached to avoid having to look inside files that haven't changed every time spring is started.
Specification
This is an example of what this file should look like:
// Description of the mod control file recognized by spring:
[MOD] {
// The name is shown in the selection interface Name=XTA version 0.61;
// These can be shown by the selection interface Description=XTA 0.61 beta makes stuff balanced and cool; URL=http://www.clan-sy.com/;
// What kind of mod this is // 0 - Hidden (support mod that can't be selected, such as OTA_textures) // 1 - Normal, only one can be selected at a time // 2 - Addon, any number of these can be selected. Could be used // for single units for example. // others - perhaps mutators and addon races that can be // enabled in addition to xta for example? ModType=1;
// Number of other archives this one depends on NumDependencies=1; Depend0=taenheter.sdz;
// Number of other archives this one replaces NumReplaces=1; Replace0=xta_se_v060.sdz;
}
Most of these entries should be easy to understand. Dependencies and replacements needs some consideration though.
Note: the order in which depencies are numerated, is inverse to the hierarchy.
i.e. (example taken from OTA mod pack made by zwzsg).
[MOD] {
Name=Shiny TA v5.5; Description=OTA Evolva new BP v5.5; URL=http://www.fileuniverse.com/spring/;
ModType=1;
NumDependencies=1; Depend4=tacontent.sdz; Depend3=tatextures.sdz; Depend2=OTA_data.sd7; Depend1=Evolva_models.sd7; Depend0=UTASP_UnitPics.sd7;
}
the last item in this list is Depend0=UTASP_UnitPics.sd7, which should overwrite the buildpics contained into otacontent.sdz, which is included in the tacontent.sdz, thus UTASP_UnitPics.sd7 should be loaded the last to overwrite the previously loaded unitpic files.
Altough the list is written in the right order, the dependencies seem to be numerated inversely, with UTASP_UnitPics.sd7 having the lower number and tacontent the higher, this is anyhow the correct way to do it.
Dependencies
Listing the dependencies allows a mod to not load the OTA textures at all for example, if it only uses original textures. Only one mod of type 1 can be selected at one time. Also, if a mod of type 2 is depending on a type 1 mod, that mod has to be selected first.
Some examples on how this could be used:
- An OTA mod that restores balance to be more similar to OTA could use modtype=1 and depend on XTA. Since XTA is now in the dependency graph, type 2 mods that depend on XTA would now also be usable.
- A new total conversion with a few extra options (not sure what that could be.. but anyway) could use a hidden base package and provide several type 1 mods that are small files that depend on the base.
When playing, the files would be loaded in the order defined by the dependency graph. The files could also be checked with an MD5 checksum or similar to make sure all players have the same file.
Replacements
When releasing new versions of a mod it is recommended that a new unique filename is used. In this manner it would be possible for the lobby to download archives from a fast webserver based on the filename. But if a new name is used for a support archive with content for example, it would break other mods that depends on the archive. To avoid this, replacements can be used.
Replacements simply specifies which other archives this one replaces. So if a new archive specifies that it replaces old_archive.sdz, any other mod that depends on old_archive.sdz would now use the new one instead.
It is probably not always a good idea to use this for new versions of a mod however, since if you hide the old version people would not be able to switch between the old and the new version. So only use replacements when you are sure that it is what you want.
Final words
If a player does not have a certain mod when trying to join a game, the info in description etc could be sent to allow the player to download it.. The filename could be sent as well, so that the client could try to download it automatically from a few predefined redirect servers (similar to the system unreal tournament uses).