diff --git a/Documents/BigFileFormat.txt b/Documents/BigFileFormat.txt new file mode 100644 index 000000000..65ba9903a --- /dev/null +++ b/Documents/BigFileFormat.txt @@ -0,0 +1,51 @@ +#### Supplied by xezon + +--- BIG HEADER +.BIG signature (4 bytes) - it must be 0x46474942 - 'BIGF' +.BIG file size (4 bytes) +FILE HEADER count (4 bytes) +BIG HEADER + FILE HEADER (count) + LAST HEADER size in bytes (4 bytes) + +--- FILE HEADER +File data offset (4 bytes) - position in the .BIG file where the content of this specific file starts +File data size (4 bytes) +File name - null terminated string + +--- LAST HEADER +Unknown value (4 bytes) +Unknown value (4 bytes) + + +#### Supplied by Thyme Wiki + +https://github.com/TheAssemblyArmada/Thyme/wiki/BIG-File-Format + +BIG File Format + +BIG files are an archive format used in many games published by Electronic Arts. +The supported features vary between games, with some using compression or encryption, but for SAGE, the files are trivially concatenated together and wrapped with a header containing a series of index entries that located a given file within the archive. + +__Header__ + +struct BIGFileHeader +{ + uint32_t id; + uint32_t archive_size; + uint32_t file_count; + uint32_t data_start; +}; + +struct IndexEntry +{ + int32_t file_size; + int32_t position; + char file_name[n]; +}; + +The header "id" is a FourCC that is either "BIGF" for Generals/Zero Hour or "BIG4" for the Battle for Middle Earth games. Thyme will accept either of these as valid. Next is the size of the archive in bytes stored as a little endian 32bit integer. +All other integers in the header are big endian and thus require byte swapping on popular CPU architectures such as x86 and common modes of ARM. "file_count" provides the number of files the archive contains and thus how many index entries there are and "data_start" is the offset to the end of the header. + +The index entries themselves consist of a "file_size" and "position" allowing the game to locate files within the archive and stay within its bounds. +"file_name" is a null terminated string used to identify the file and includes the relative path to the file from the game directory if the file existed in the normal file system. This path length is limited such that n must be less than or equal to 260 characters in keeping with the path limit on Windows which is all the game buffers for. + +With the information in the index it is possible to locate and read files within the archive which constitute the rest of the file. \ No newline at end of file diff --git a/Documents/CsfFileFormat.txt b/Documents/CsfFileFormat.txt new file mode 100644 index 000000000..936547931 --- /dev/null +++ b/Documents/CsfFileFormat.txt @@ -0,0 +1,100 @@ +#### Supplied by xezon + +HEADER: +4 bytes: ' FSC': file type identifier +4 bytes: 3: unknown value, maybe file type version +4 bytes: 0x1916: 6422, could be number of string table entries +4 bytes: 0x1915: 6421, similar to number above, not clear what the difference is +8 bytes: all 0: unknown + +BODY (repeats): +4 bytes: ' LBL': keyword identifier +4 bytes: 1: unknown value, maybe number of keywords? seems to be 1 always. +4 bytes: length of ascii string (N) +N bytes: ascii string +4 bytes: ' RTS': locale string identifier +4 bytes: length of unicode string (N) +N bytes: unicode string: XOR'ed by 0xFF + + +#### Supplied by Thyme Wiki + +https://github.com/TheAssemblyArmada/Thyme/wiki/Compiled-String-File-Format + +Compiled String File Format + +This file format holds most of the game strings in an encoded format that decodes to USC2 Unicode strings. The file consists of a header followed by a series of ASCII label strings and encoded Unicode strings. + +__Header__ + +enum LanguageID : int32_t +{ + LANGUAGE_ID_US, + LANGUAGE_ID_UK, + LANGUAGE_ID_GERMAN, + LANGUAGE_ID_FRENCH, + LANGUAGE_ID_SPANISH, + LANGUAGE_ID_ITALIAN, + LANGUAGE_ID_JAPANSE, + LANGUAGE_ID_JABBER, + LANGUAGE_ID_KOREAN, + LANGUAGE_ID_CHINESE, + LANGUAGE_ID_UNK1, + LANGUAGE_ID_UNK2, + LANGUAGE_ID_POLISH, + LANGUAGE_ID_UNKNOWN, +}; + +struct CSFHeader +{ + uint32_t id; + int32_t version; + int32_t num_labels; + int32_t num_strings; + int32_t skip; + LanguageID langid; +}; + +The "id" is a FourCC code that translates to the ASCII string " FSC", essentially "CSF " in little endian format. + +"version" is always 3 for SAGE engine games, though the engine does check for a value of 1 or less, in which case the langid is ignored and set to 0. + +"num_labels" is a count of how many string references there are in the file while "num_strings" is a count of how many encoded strings there are as each label can have more than one, though this feature is unused in SAGE games. + +"skip" is a reserved 4 bytes that are unused. + +"langid" corresponds to an internal enum which enumerates which language the file is intended to provide text for, though the SAGE engine games don't appear to make use of it. The provided enum is valid for Generals and Zero Hour, but not the Battle for Middle Earth games based on examination of the string files from different translations. + + +__Labels__ + +struct Label +{ + uint32_t id; + int32_t string_count; + int32_t length; + char label[length] +}; + +Each label entry begins with a FourCC "id" equivalent to the string " LBL", again likely a little endian "LBL ". This is followed by the number of strings the label can refer to, then the length of the label ASCII string followed by the string itself. The "label" string is not null terminated and must match the given "length". The engine code refers only to the label when requesting a string for display so that localisation can be done separately. + + +__Strings__ + +struct String +{ + uint32_t id; + int32_t length; + uint16_t string[length] + int32_t ex_length; // Only present when id matches 'WRTS' + char ex_string[ex_length]; // Only present when id matches 'WRTS' +}; + +The FourCC "id" for the string must be either " RTS" or "WRTS" (little endian "STR " and "STRW"), with "WRTS" indicating an additional ASCII string appended on. The values for the string are little endian and are encoded using a binary NOT on the value. The following is an example of how it might be decoded in C: + +for (int i = 0; i < length; ++i) { + string[i] = ~string[i]; +} + +Debug information left in certain executables suggests that the "ex_string" was related to audio files in some way, possibly as a file name for an audio file containing a reading of the string text. However it appears such a feature is not used in any SAGE game. + diff --git a/Tools/FinalBIG/FinalBIG.exe b/Tools/FinalBIG/FinalBIG.exe new file mode 100644 index 000000000..f46620749 Binary files /dev/null and b/Tools/FinalBIG/FinalBIG.exe differ diff --git a/Tools/FinalBIG/ReadMe.txt b/Tools/FinalBIG/ReadMe.txt new file mode 100644 index 000000000..0c77fc0a7 --- /dev/null +++ b/Tools/FinalBIG/ReadMe.txt @@ -0,0 +1,187 @@ +FinalBIG + +Version 0.4 Beta released March 20th, 2006. + +Copyright by Matthias Wagner 2006 + +C&C Generals is a trademark or registered trademark of Electronic Arts in the USA and/or other countries. All rights reserved. +The Lord of the Rings(tm), The Battle for Middle-earth(tm) is a trademark or registered trademark of Electronic Arts in the USA and/or other countries. All rights reserved. +LucasArts, the LucasArts logo, STAR WARS and related properties are trademarks in the United States and/or in other countries of Lucasfilm Ltd. and/or its affiliates. (c) 2006 Lucasfilm Entertainment Company Ltd. or Lucasfilm Ltd. All rights reserved. + +This software is based in part on the work of the Independent JPEG Group + + +----------- +Information +----------- +FinalBIG is a viewer and editor for the BIG files of C&C Generals and Lord of the Rings: Battle for Middle Earth. +It can also open and save the MEG files of Star Wars(TM): Empire at War(TM). +I tried to make it as easy to use as possible. + +------- +Contact +------- +Suggestions? Questions? + +Mail: webmaster *at* wagnerma.de +Website: http://www.wagnerma.de + +------- +Credits +------- +Thanks to Jonathan Wilson for W3D help +Thanks to Deezire for his Module list +Thanks to Waraddict for adding modules +Uses CRC code available at http://www.zorc.breitbandkatze.de/crc.html +Uses MEG file information found here: http://alpha1.dyns.net/eaw/MegFileFormat, http://www.technical-difficulties.com/ + +------- +License +------- +FinalBIG is freeware and is provided "as-is". Use at your own risk. +No reverse engineering allowed. Editing finalbig.ini welcome. +Please don't mirror FinalBIG without asking me. + +-------------------- +System Requirements +-------------------- +- OpenGL drivers installed +- DirectX 9.0c installed (for DX9 version) +- Tested on WinXP only + +---------- +HOW TO USE +---------- +Actually FinalBIG is very easy to use, especially if you are used to other packaging & compression programs. +You can use FinalBIG to distribute your modifications to Generals and LOTR:BFME. +To open a BIG file, just click on File->Open and select your BIG file. You can now browse the files +included in this BIG file. However, you can also edit it. You can do this either by using the Edit menu, +or you can drag & drop files from Windows Explorer into FinalBIG. Just drop the files (or directories!) +on the file list of your BIG file. A window will come up telling you that FinalBIG needs to activate EditMode. +Accept that, but you really should back up any original BIG files before saving. Thatīs it! Now save your work, +and you are done! +It works exactly the same way for MEG files. + +---------- +W3D Viewer +---------- +The W3D viewer should display almost all W3Ds fine. +If you want to rotate the model, press the NumKeys (at the right of your keyboard). +8 is up, 2 is down, 4 is left, 6 is right. +You can also zoom in & out by pressing - and + (NumKeys). + +This viewer probably will be extended to display SW:EAW models if I have the time to do this. + +----------- +INI Editor +----------- +For Generals & LOTR Ini style files! +Easy to use. Right click and you'll be presented with several options regarding the clicked item. +For example, if you click inside an Object module you'll be presented with a list of Modules/Values to insert. +For many values you can also use Set Value, which will present you a list of values. +Just try it out in the several sections of an INI file. +If you click onto GoTo, another menu pops up that allows you to jump to the several sections inside the current +INI file. +Basically, you do not have to use the INI Editor menu, you can do everything by typing, too. FinalBIG does +not take away your freedom to plainly edit the INI by hand, it just additionally supports some helper features. + +---------------- +External Editors +---------------- +Simple: Define your favorite editors using View->Options. Once you have done that, close the dialog. +Then simply select the file to edit at the left and press CTRL+E (or Edit->Edit with Editor). +FinalBIG will then launch the editor with the selected file. If you want to change the file, don't forget to +save the file in the editor (without changing the filename). +While the editor is opened, FinalBIG will block access to this specific file. This is to avoid sharing difficulties. + +---------------- +Quick Save +---------------- +Currently only implemented for BIG files, this feature tries to only save any changed files inside +the BIG file. That way, it does need much less time than saving several hundred MB of unchanged data. +Keep in mind that this can increase the BIG file, so before distributing, use the normal Save command. +For MEG files, this just works as pressing Save, thus rewriting the whole MEG. However, I will work +on implementing this feature for MEG files, too. + +---------------- +MEG File Support +---------------- +Keep in mind that MEG files do not support lowercase letters inside filenames. FinalBIG automatically +changes those to uppercase letters. + + + +--------------- +TODO List +--------------- +- Support QuickSave for MEG files (Top prio) +- Probably add viewer for SW:EAW models +- Probably add XML Editor with more features +- Probably add Texture->DDS support (for converting for example TGA's, BMP's etc into DDS format) + + + +---------------------- +Changes in 0.4 (beta) +---------------------- +- Support for saving & loading MEG files of Star Wars(TM): Empire At War(TM) +- Support for DDS texture loading extended for SW: EAW + +---------------------- +Changes in 0.36 (beta) +---------------------- +- External Editor support: Use your favorite editors (like PSP, Wordpad, etc) to directly edit files inside the BIG file! + +---------------------- +Changes in 0.35 (beta) +---------------------- +- INI Editor extended: Lists modules & values and allows to set values *** IMPORTANT: I'm searching for people willing to complete the module list! *** +- Adding a file to a BIG that already exists will now overwrite the original file (you'll be asked) +- It may now be possible to open BIG files of other games than Generals/LOTR if the file format is compatible + +------------------- +Changes in 0.34 +------------------- +- INI Editor +- Quick Save + +------------------- +Changes in 0.33 +------------------- +- W3D Viewer now displays (almost) all W3Ds correctly, including skins +- JPEG and PNG support +- Image viewer now uses correct aspect ratio (if width!=height) +- Manual rotation and zooming possible in W3D viewer + +------------------- +Changes in 0.32 +------------------- +- W3D viewer now displays all W3Ds correctly except skin meshes +- W3D viewer now also displays textures (DDS, TGA and BMP) +- D3D9 support (optionally) + +------------------- +Changes in 0.31 +------------------- +- Added simple W3D viewer (no mesh hierarchy/textures supported yet, will come asap) +- Fixed Crash Bug when pressing Cancel when inserting a directory + +------------------- +Changes in 0.3 +------------------- +- Added Support for LOTR:BFME +- Added TGA, BMP & DDS Viewer + +------------------- +Changes in 0.21 +------------------- +- Fixed crash that occured sometimes when deleting files + +------------------- +Changes in 0.2 +------------------- +- Deleting files +- Renaming files +- Drag & Drop for adding files & directories +- Including the folder name when inserting a directory instead of skipping it + diff --git a/Tools/FinalBIG/finalbig.ini b/Tools/FinalBIG/finalbig.ini new file mode 100644 index 000000000..ad0ea2d94 --- /dev/null +++ b/Tools/FinalBIG/finalbig.ini @@ -0,0 +1,1617 @@ +; This file controls FinalBIG's behaviour +; Last Change by Matthias Wagner, Feb 12th 2005 +; +; +; +; ForcedObjects: List any object type here that has a = after type. Else they will be misunderstood as values. +; ForcedValues: List any value type here that does not have a = after value name. Else they will be misunderstood as objects. +; ObjectsWithLists: All Modules that will use the [Lists] option must be listed here (see Module) +; +; INISTructure: +; Specifies how FinalBIG searches for possible modules/values. +; Basically, you mirror the INI structure of the original game. +; Syntax: +; +; Module [Specified SubType] [Implements Module] [Lists ListName | ModuleName] [# comment] +; Specified: Means there is a = that specifies the subtype (placed before ModuleName) +; Implements: Copies all values/submodules from Module. Must be a submodule of one of the parent modules, declared before the current module +; This is handy for stuff that repeats very often (for example, DefaultConditionState values) +; You can Implement more than one Module. To do this, put: Implements Module1 Implements Module2 +; If the module to implement uses Specified, put: Implements "Module Specified Specification" (note the ") +; You can implement any module that has been declared before the current module (= up the parent tree) +; ImplementsValues: implements only values +; ImplementsModules: implements only modules (these modules completely with their values, though) +; Lists: Adds a = after Module, and makes available a list of values that may be placed after the =. This list must be specified in [Games]->[GameName]->[Lists] +; If you use this, you should also add the module to ObjectsWithLists. +; Selects: Same like Lists, but only allows to choose ONE item. Note that you still must place these modules into ObjectsWithLists, too. +; +; Value = [Direct] [Lists ListName | Type] [# comment] +; Direct: specifies if there is no = after the value name. If Direct is not set, FinalBIG will place an equal = after Value +; #: # will be replaced by ; so that it represents an comment. +; Lists: Lists ListName. +; Selects: Selects ListName +; +; +; Currently, FinalBIG does interpret "Type" in a limited way. +; For now, you can instruct FinalBIG to build a list of global module instances. +; E.g: To list all Object's, put +; BaseDefenseStructure1 = data\ini\Object\::Object +; If you only want to read CivilianProp.ini, put: +; BaseDefenseStructure1 = data\ini\Object\CivilianProp.ini::Object +; +; This can be modified slightly: If you put Named before data\ini\Object\::Object, there will be a name before the selected Object. This is for example used +; for ParticleSysBone's. There can also be additional data after the selected object. Do this by putting AdditionalData before data\ini\Object\::Object. +; Used for example for LOTR:BFME ParticleSysBone's, where you can specify additional flags. Example for LOTR:BFME ParticleSysBone's: +; ParticleSysBone = Named AppendedData data\ini\ParticleSystem.ini::ParticleSystem +; +; +; Later on it will interpret Type further more: +; Campaign CampaignName +; CampaignNameLabel = Direct String +; FirstMission = Direct Mission +; Mission MissionName +; ... +; END +; END +; This will automatically list all Mission objects. You don't have to explicitly write that. +; Not implemented yet, though +; +; +; If you add stuff here, please comment it somehow + +Games + +; ---------------------------- BEGIN GENERALS ------------------------------------------------------------ + + Generals + ObjectsWithLists + ConditionState=1 + TransitionState=1 + end + ForcedObjects + TransitionState=1 + EmissionVolume=1 + EmissionVelocity=1 + Color=1 + Update=1 + Physics=1 + Alpha=1 + ConditionState=1 + ModelConditionState=1 + Window=1 + Transition=1 + WindowTransition=1 + LodOptions=1 + ;Animation=1 + AnimationState=1 + ArmyEntry=1 + LivingWorldPlayerArmy=1 + SplineCamera=1 + RegionReinforcements=1 + MoveCamera=1 + ToggleArmyControl=1 + ModifyArmyEntry=1 + LivingWorldRegionCampaignCampEA_DEMO=1 + EnemyBordersEffect=1 + ControlPoint=1 + FriendlyBordersEffect=1 + HilightBordersEffect=1 + ConqueredEffectEvenglow=1 + ConqueredEffectFlareup=1 + MouseoverEffectFlareupOwned=1 + MouseoutEffectFlareupOwned=1 + MouseoverEffectFlareupContested=1 + SkirmishOpponent=1 + MouseoutEffectFlareupContested=1 + SpawnArmy=1 + MoveArmy=1 + EyeTowerPoints=1 + WorldText=1 + AudioEvent=1 + EnableRegion=1 + ForceBattle=1 + Behavior=1 + Draw=1 + AllowAIPickup=1 + Body=1 + ChildObject=1 + end + ForcedValues + MinVolume=1 + ParticleSysBone=1 + CurDrawableShowSubObject=1 + CurDrawableHideSubObject=1 + blank=1 + #define=1 + Size=1 + ScreenCreationRes=1 + Side=1 + CommandBarBorderColor=1 + BuildUpClockColor=1 + ButtonBorderBuildColor=1 + ButtonBorderActionColor=1 + ButtonBorderUpgradeColor=1 + ButtonBorderSystemColor=1 + ButtonBorderAlteredColor=1 + Geometry=1 + Time=1 + Position=1 + CampaignNameLabel=1 + UnitNames0=1 + UnitNames1=1 + UnitNames2=1 + LocationNameLabel=1 + firstMission=1 + ImageName=1 + Layer=1 + FinalVictoryMovie=1 + Map=1 + IntroMovie=1 + ObjectiveLine0=1 + ObjectiveLine1=1 + ObjectiveLine2=1 + ObjectiveLine3=1 + ObjectiveLine4=1 + NextMission=1 + RemoveModule=1 + end + + Lists + ConditionStateTypes + PREORDER=1 + USING_WEAPON_A=1 + USING_WEAPON_B=1 + USING_WEAPON_C=1 + EXPLODED_BOUNCING=1 + EXPLODED_FLAILING=1 + CAPTURED=1 + RAISING_FLAG=1 + CONTINUOUS_FIRE_SLOW=1 + SPECIAL_CHEERING=1 + POWER_PLANT_UPGRADING=1 + ARMED=1 + RAPELLING=1 + CLIMBING=1 + POWER_PLANT_UPGRADED=1 + OVER_WATER=1 + DEPLOYED=1 + UNPACKING=1 + PACKING=1 + JETEXHAUST=1 + JETAFTERBURNER=1 + LOADED=1 + CARRYING=1 + DOCKING_ENDING=1 + DOCKING_ACTIVE=1 + DOCKING_BEGINNING=1 + DOCKING=1 + SMOLDERING=1 + PANICKING=1 + RADAR_UPGRADED=1 + RADAR_EXTENDED=1 + CONSTRUCTION_COMPLETE=1 + ACTIVELY_CONSTRUCTING=1 + PRONE=1 + FREEFALL=1 + ACTIVELY_BEING_CONSTRUCTED=1 + PARTIALLY_CONSTRUCTED=1 + DYING=1 + POST_COLLAPSE=1 + TURRET_ROTATE=1 + RELOADING_A=1 + BETWEEN_FIRING_SHOTS_A=1 + FIRING_A=1 + PREATTACK_A=1 + RELOADING_B=1 + BETWEEN_FIRING_SHOTS_B=1 + FIRING_B=1 + PREATTACK_B=1 + RELOADING_C=1 + BETWEEN_FIRING_SHOTS_C=1 + FIRING_C=1 + PREATTACK_C=1 + DOOR_4_WAITING_TO_CLOSE=1 + DOOR_4_WAITING_OPEN=1 + DOOR_4_CLOSING=1 + DOOR_4_OPENING=1 + DOOR_3_WAITING_TO_CLOSE=1 + DOOR_3_WAITING_OPEN=1 + DOOR_3_CLOSING=1 + DOOR_3_OPENING=1 + DOOR_2_WAITING_TO_CLOSE=1 + DOOR_2_WAITING_OPEN=1 + DOOR_2_CLOSING=1 + DOOR_2_OPENING=1 + DOOR_1_WAITING_TO_CLOSE=1 + DOOR_1_WAITING_OPEN=1 + DOOR_1_CLOSING=1 + DOOR_1_OPENING=1 + WEAPONSET_PLAYER_UPGRADE=1 + WEAPONSET_CRATEUPGRADE_ONE=1 + WEAPONSET_CRATEUPGRADE_TWO=1 + WEAPONSET_HERO=1 + WEAPONSET_ELITE=1 + WEAPONSET_VETERAN=1 + ENEMYNEAR=1 + SNOW=1 + NIGHT=1 + SPECIAL_DAMAGED=1 + BACKCRUSHED=1 + FRONTCRUSHED=1 + end + PBFESlots + PRIMARY=1 + SECONDARY=1 + TERTIARY=1 + end + UpgradeConditionTypes + Upgrade_Veterancy_VETERAN=1 + Upgrade_Veterancy_ELITE=1 + Upgrade_Veterancy_HEROIC=1 + end + ObjectConditionTypes + ATTACKING=1 + MOVING=1 + FIRING_PRIMARY=1 + FIRING_SECONDARY=1 + FIRING_TERTIARY=1 + end + WeaponSetConditionTypes + PLAYER_UPGRADE=1 + MINE_CLEARING_DETAIL=1 + CARBOMB=1 + VEHICLE_HIJACK=1 + CRATEUPGRADE_ONE=1 + CRATEUPGRADE_TWO=1 + end + AutoAcquireEnemiesWhenIdleTypes + Yes=1 + No=1 + NOTWHILEATTACKING=1 + ATTACK_BUILDINGS=1 + STEALTHED=1 + end + end + + INIStructure + AIData + StructureSeconds = Integer + TeamSeconds = Integer + Wealthy = Integer + Poor = Integer + StructuresWealthyRate = Float + StructuresPoorRate = Float + TeamsWealthyRate = Float + TeamsPoorRate = Float + TeamResourcesToStart = Float + GuardInnerModifierAI = Float + GuardOuterModifierAI = Float + GuardInnerModifierHuman = Float + GuardOuterModifierHuman = Float + GuardChaseUnitsDuration = Integer + GuardEnemyScanRate = Integer + GuardEnemyReturnScanRate = Integer + AlertRangeModifier = Float #while in alert: affects scan range + AggressiveRangeModifier = Float + AttackPriorityDistanceModifier = Float + MaxRecruitRadius = Float + ForceIdleMSEC = Integer + ForceSkirmishAI = Bool + RotateSkirmishBases = Bool + AttackUsesLineOfSight = Bool + EnableRepulsors = Bool + RepulsedDistance = Float + WallHeight = Integer + AttackIgnoreInsignificantBuildings = Bool + SkirmishGroupFudgeDistance = Float + MinInfantryForGroup = Integer + MinVehiclesForGroup = Integer + MinDistanceForGroup = Float + DistanceRequiresGroup = Float + InfantryPathfindDiameter = Integer + VehiclePathfindDiameter = Integer + SupplyCenterSafeRadius = Float + RebuildDelayTimeSeconds = Integer + AIDozerBoredRadiusModifier = Float + AICrushesInfantry = Bool + + + SideInfo SideName + ResourceGatherersEasy = Integer + ResourceGatherersNormal = Integer + ResourceGatherersHard = Integer + BaseDefenseStructure1 = data\ini\Object\::Object + + SkillSet1 + Science = data\ini\Science.ini::Science + End + + SkillSet2 + Science = data\ini\Science.ini::Science + End + + End + + SkirmishBuildList SideName + Structure StructureName + Location = Location + Rebuilds = Integer + Angle = Angle + InitiallyBuilt = Bool + AutomaticallyBuild = Bool + END + END + end + + Terrain TerrainName + Texture = Filename + Class = TerrainClass + End + + ActiveBody + MaxHealth = Float + InitialHealth = Float + End + + ActiveShroudUpgrade + TriggeredBy = data\ini\Default\Upgrade.ini::Upgrade data\ini\Upgrade.ini::Upgrade + FXListUpgrade = data\ini\Default\FXList.ini::FXList data\ini\FXList.ini::FXList + ConflictsWith = data\ini\Default\Upgrade.ini::Upgrade data\ini\Upgrade.ini::Upgrade + RequiresAllTriggers = Bool + NewShroudRange = Float + End + + AIUpdateInterface + AutoAcquireEnemiesWhenIdle = [Yes/No/NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED] + MoodAttackCheckRate = Integer + Turret + TurretTurnRate = Integer + TurretPitchRate = Integer + NaturalTurretAngle = Integer + NaturalTurretPitch = Integer + FirePitch = Integer + MinPhysicalPitch = Integer + GroundUnitPitch = Integer + TurretFireAngleSweep = [weaponslot integer] + TurretSweepSpeedModifier = [weaponslot real number] + ControlledWeaponSlots = [weaponslots] + AllowsPitch = Bool + MinIdleScanAngle = Integer + MaxIdleScanAngle = Integer + MinIdleScanInterval = Integer + MaxIdleScanInterval = Integer + RecenterTime = Integer + FiresWhileTurning = Bool + InitiallyDisabled = Bool + End + AltTurret + TurretTurnRate = Integer + TurretPitchRate = Integer + NaturalTurretAngle = Integer + NaturalTurretPitch = Integer + FirePitch = Integer + MinPhysicalPitch = Integer + GroundUnitPitch = Integer + TurretFireAngleSweep = [weaponslot integer] + TurretSweepSpeedModifier = [weaponslot real number] + ControlledWeaponSlots = [weaponslots] + AllowsPitch = Bool + MinIdleScanAngle = Integer + MaxIdleScanAngle = Integer + MinIdleScanInterval = Integer + MaxIdleScanInterval = Integer + RecenterTime = Integer + FiresWhileTurning = Bool + InitiallyDisabled = Bool + End + End + + AnimatedParticleSysBoneClientUpdate + End + + + Object ObjectName + Draw Specified W3DModelDraw ModuleTag_01 + DefaultConditionState + Model = Model + ShowSubObject = [sub object name(s)] + HideSubObject = [sub object name(s)] + WeaponRecoilBone = [bone name] + WeaponFireFXBone = [bone name] + WeaponMuzzleFlash = [bone name] + WeaponLaunchBone = [bone name] + WeaponHideShowBone = [bone name] + IdleAnimation = [model animation name] + TransitionKey = [TransitionKey name] + Animation = [model animation name] + Flags = [AnimationFlag types list] + AnimationSpeedFactorRange = [real number real number] + ParticleSysBone = Named AppendedData data\ini\ParticleSystem.ini::ParticleSystem + Turret = [sub object name] + TurretArtAngle = [integer] + TurretPitch = [integer] + TurretArtPitch = [integer] + AltTurret = [sub object name] + AltTurretArtAngle = [integer] + AltTurretArtPitch = [integer] + AltTurretPitch = [integer] + end + ConditionState Implements DefaultConditionState Lists ConditionStateTypes + End + + AliasConditionState = [ConditionState name] + + TransitionState Implements DefaultConditionState Lists ConditionStateTypes # Exactly 2 ConditionStates needed + End + + AnimationsRequirePower = Bool + ProjectileBoneFeedbackEnabledSlots = Lists PBFESlots + TrackMarks = TextureFilename + ExtraPublicBone = [bone name, multiple entries possible] + AttachToBoneInAnotherModule = [bone name] + IgnoreConditionStates = Lists ConditionStateTypes + end + Draw Specified W3DDebrisDraw ModuleTag_01 + End + Draw Specified W3DDefaultDraw ModuleTag_01 + End + Draw Specified W3DDependencyModelDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + AttachToBoneInContainer = [bone name from object in W3DOverlordTankDraw module] + End + Draw Specified W3DOverlordTankDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + end + Draw Specified W3DPoliceCarDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + end + Draw Specified W3DProjectileStreamDraw ModuleTag_01 + Texture = TextureFilenameExt + Width = Float + TileFactor = Integer + ScrollRate = Float + MaxSegments = Integer + end + Draw Specified W3DRopeDraw ModuleTag_01 + End + Draw Specified W3DScienceModelDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + RequiredScience = data\ini\Science.ini::Science + end + Draw Specified W3DSupplyDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + SupplyBonePrefix = [bone name] + end + Draw Specified W3DTankDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + TreadDriveSpeedFraction = Float + TreadPivotSpeedFraction = Float + TreadAnimationRate = Float + InitialRecoilSpeed = Integer + MaxRecoilDistance = Integer + RecoilDamping = Integer + RecoilSettleSpeed = Integer + end + Draw Specified W3DTruckDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + RotationDamping = Float + TrailerRotationMultiplier = Float + CabRotationMultiplier = Float + TrailerBone = [bone name] + CabBone = [bone name] + PowerslideRotationAddition = Float + TireRotationMultiplier = Float + MidRightMidTireBone = [bone name] + MidLeftMidTireBone = [bone name] + MidRightRearTireBone = [bone name] + MidLeftRearTireBone = [bone name] + MidRightFrontTireBone = [bone name] + MidLeftFrontTireBone = [bone name] + RightRearTireBone = [bone name] + LeftRearTireBone = [bone name] + RightFrontTireBone = [bone name] + LeftFrontTireBone = [bone name] + PowerslideSpray = data\ini\ParticleSystem.ini::ParticleSystem + DirtSpray = data\ini\ParticleSystem.ini::ParticleSystem + Dust = data\ini\ParticleSystem.ini::ParticleSystem + end + Draw Specified W3DTankTruckDraw Implements "Draw Specified W3DTankDraw" Implements "Draw Specified W3DTruckDraw" ModuleTag_01 + end + Draw Specified W3DLaserDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + NumBeams = Integer + Texture = TextureFilename + InnerBeamWidth = InnerBeamWidth + OuterBeamWidth = OuterBeamWidth + InnerColor = RGBA + OuterColor = RGBA + MaxIntensityLifetime = Integer + FadeLifetime = Integer + Tile = Bool + Segments = Integer + ArcHeight = Float + SegmentOverlapRatio = Float + TilingScalar = Float + end + Draw Specified W3DTracerDraw ModuleTag_01 + end + + ; map.ini stuff: + AddModule ImplementsModules Object + end + + ReplaceModule ImplementsModules Object ModuleName + end + + RemoveModule = Direct ModuleName + + AnimatedParticleSysBoneClientUpdate + End + + + ; Body Modules + + Body Specified ActiveBody ModuleTag_01 + MaxHealth = Float + InitialHealth = Float + End + + Body Specified HighlanderBody ModuleTag_01 + End + + Body Specified HiveStructureBody ModuleTag_01 + End + + Body Specified ImmortalBody ModuleTag_01 + End + + Body Specified InactiveBody ModuleTag_01 + End + + Body Specified StructureBody ModuleTag_01 + End + + ; Power Modules + + Behavior Specified BaikonurLaunchPower ModuleTag_01 + End + + Behavior Specified CashBountyPower ModuleTag_01 + End + + Behavior Specified CashHackSpecialPower ModuleTag_01 + End + + Behavior Specified CleanupAreaPower ModuleTag_01 + End + + Behavior Specified DefectorSpecialPower ModuleTag_01 + End + + Behavior Specified OCLSpecialPower ModuleTag_01 + End + + Behavior Specified SpecialAbility ModuleTag_01 + End + + Behavior Specified SpyVisionSpecialPower ModuleTag_01 + End + + ; Collide Modules + + Behavior Specified ConvertToCarBombCrateCollide ModuleTag_01 + End + + Behavior Specified ConvertToHijackedVehicleCrateCollide ModuleTag_01 + End + + Behavior Specified FireWeaponCollide ModuleTag_01 + End + + Behavior Specified HealCrateCollide ModuleTag_01 + End + + Behavior Specified MoneyCrateCollide ModuleTag_01 + End + + Behavior Specified SalvageCrateCollide ModuleTag_01 + End + + Behavior Specified ShroudCrateCollide ModuleTag_01 + End + + Behavior Specified SquishCollide ModuleTag_01 + End + + Behavior Specified UnitCrateCollide ModuleTag_01 + End + + Behavior Specified VeterancyCrateCollide ModuleTag_01 + End + + ; Damage FX Modules + + Behavior Specified BoneFXDamage ModuleTag_01 + End + + Behavior Specified TransitionDamageFX ModuleTag_01 + End + + ; Create Modules + + Behavior Specified GrantUpgradeCreate ModuleTag_01 + End + + Behavior Specified PreorderCreate ModuleTag_01 + End + + Behavior Specified SpecialPowerCreate ModuleTag_01 + End + + Behavior Specified SupplyCenterCreate ModuleTag_01 + End + + Behavior Specified SupplyWarehouseCreate ModuleTag_01 + End + + Behavior Specified VeterancyGainCreate ModuleTag_01 + End + + ; Upgrade Modules + + Behavior Specified ActiveShroudUpgrade ModuleTag_01 + TriggeredBy = UpgradeEntry + FXListUpgrade = FXListEntry + ConflictsWith = UpgradeEntry + RequiresAllTriggers = Bool + NewShroudRange = Float + End + + Behavior Specified ArmorUpgrade ModuleTag_01 + End + + Behavior Specified CostModifierUpgrade ModuleTag_01 + End + + Behavior Specified ExperienceScalarUpgrade ModuleTag_01 + End + + Behavior Specified LocomotorSetUpgrade ModuleTag_01 + End + + Behavior Specified MaxHealthUpgrade ModuleTag_01 + End + + Behavior Specified ObjectCreationUpgrade ModuleTag_01 + End + + Behavior Specified PowerPlantUpgrade ModuleTag_01 + End + + Behavior Specified RadarUpgrade ModuleTag_01 + End + + Behavior Specified StatusBitsUpgrade ModuleTag_01 + End + + Behavior Specified StealthUpgrade ModuleTag_01 + End + + Behavior Specified SubObjectsUpgrade ModuleTag_01 + End + + Behavior Specified UnpauseSpecialPowerUpgrade ModuleTag_01 + End + + Behavior Specified WeaponBonusUpgrade ModuleTag_01 + End + + Behavior Specified WeaponSetUpgrade ModuleTag_01 + End + + ; AI Update Modules + + Behavior Specified AIUpdateInterface ModuleTag_01 + AutoAcquireEnemiesWhenIdle = Lists AutoAcquireEnemiesWhenIdleTypes + MoodAttackCheckRate = Integer + Turret + TurretTurnRate = Integer + TurretPitchRate = Integer + NaturalTurretAngle = Integer + NaturalTurretPitch = Integer + FirePitch = Integer + MinPhysicalPitch = Integer + GroundUnitPitch = Integer + TurretFireAngleSweep = [weaponslot integer] + TurretSweepSpeedModifier = [weaponslot real number] + ControlledWeaponSlots = [weaponslots] + AllowsPitch = Bool + MinIdleScanAngle = Integer + MaxIdleScanAngle = Integer + MinIdleScanInterval = Integer + MaxIdleScanInterval = Integer + RecenterTime = Integer + FiresWhileTurning = Bool + InitiallyDisabled = Bool + End + AltTurret Implements Turret + End + End + + Behavior Specified AssaultTransportAIUpdate ModuleTag_01 + End + + Behavior Specified ChinookAIUpdate ModuleTag_01 + End + + Behavior Specified DeployStyleAIUpdate ModuleTag_01 + End + + Behavior Specified DozerAIUpdate ModuleTag_01 + End + + Behavior Specified HackInternetAIUpdate ModuleTag_01 + End + + Behavior Specified JetAIUpdate ModuleTag_01 + End + + Behavior Specified MissileAIUpdate ModuleTag_01 + End + + Behavior Specified RailedTransportAIUpdate ModuleTag_01 + End + + Behavior Specified SupplyTruckAIUpdate ModuleTag_01 + End + + Behavior Specified TransportAIUpdate ModuleTag_01 + End + + Behavior Specified WanderAIUpdate ModuleTag_01 + End + + Behavior Specified WorkerAIUpdate ModuleTag_01 + End + + ; Update Modules + + Behavior Specified AnimatedParticleSysBoneClientUpdate ModuleTag_01 + End + + Behavior Specified AutoFindHealingUpdate ModuleTag_01 + End + + Behavior Specified BaseRegenerateUpdate ModuleTag_01 + End + + Behavior Specified BattlePlanUpdate ModuleTag_01 + End + + Behavior Specified BeaconClientUpdate ModuleTag_01 + End + + Behavior Specified BoneFXUpdate ModuleTag_01 + End + + Behavior Specified CheckpointUpdate ModuleTag_01 + End + + Behavior Specified CleanupHazardUpdate ModuleTag_01 + End + + Behavior Specified CommandButtonHuntUpdate ModuleTag_01 + End + + Behavior Specified DefaultProductionExitUpdate ModuleTag_01 + End + + Behavior Specified DeletionUpdate ModuleTag_01 + End + + Behavior Specified DemoTrapUpdate ModuleTag_01 + End + + Behavior Specified DynamicGeometryInfoUpdate ModuleTag_01 + End + + Behavior Specified DynamicShroudClearingRangeUpdate ModuleTag_01 + End + + Behavior Specified EMPUpdate ModuleTag_01 + End + + Behavior Specified EnemyNearUpdate ModuleTag_01 + End + + Behavior Specified FireOCLAfterWeaponCooldownUpdate ModuleTag_01 + End + + Behavior Specified FireSpreadUpdate ModuleTag_01 + End + + Behavior Specified FirestormDynamicGeometryInfoUpdate ModuleTag_01 + End + + Behavior Specified FireWeaponUpdate ModuleTag_01 + End + + Behavior Specified FlammableUpdate ModuleTag_01 + End + + Behavior Specified HeightDieUpdate ModuleTag_01 + End + + Behavior Specified HijackerUpdate ModuleTag_01 + End + + Behavior Specified HordeUpdate ModuleTag_01 + End + + Behavior Specified MissileLauncherBuildingUpdate ModuleTag_01 + End + + Behavior Specified MobMemberSlavedUpdate ModuleTag_01 + End + + Behavior Specified NeutronMissileUpdate ModuleTag_01 + End + + Behavior Specified ParticleUplinkCannonUpdate ModuleTag_01 + End + + Behavior Specified PilotFindVehicleUpdate ModuleTag_01 + End + + Behavior Specified PointDefenseLaserUpdate ModuleTag_01 + End + + Behavior Specified PowerPlantUpdate ModuleTag_01 + End + + Behavior Specified ProductionUpdate ModuleTag_01 + End + + Behavior Specified ProneUpdate ModuleTag_01 + End + + Behavior Specified QueueProductionExitUpdate ModuleTag_01 + End + + Behavior Specified RadarUpdate ModuleTag_01 + End + + Behavior Specified RepairDockUpdate ModuleTag_01 + End + + Behavior Specified SlavedUpdate ModuleTag_01 + End + + Behavior Specified SpawnPointProductionExitUpdate ModuleTag_01 + End + + Behavior Specified SpecialAbilityUpdate ModuleTag_01 + End + + Behavior Specified SpyVisionUpdate ModuleTag_01 + End + + Behavior Specified StealthDetectorUpdate ModuleTag_01 + End + + Behavior Specified StealthUpdate ModuleTag_01 + End + + Behavior Specified StructureCollapseUpdate ModuleTag_01 + End + + Behavior Specified StructureToppleUpdate ModuleTag_01 + End + + Behavior Specified SupplyCenterProductionExitUpdate ModuleTag_01 + End + + Behavior Specified TensileFormationUpdate ModuleTag_01 + End + + Behavior Specified ToppleUpdate ModuleTag_01 + End + + Behavior Specified WaveGuideUpdate ModuleTag_01 + End + + Behavior Specified WeaponBonusUpdate ModuleTag_01 + End + + ; Die Modules + + Behavior Specified CreateCrateDie ModuleTag_01 + End + + Behavior Specified CreateObjectDie ModuleTag_01 + End + + Behavior Specified CrushDie ModuleTag_01 + End + + Behavior Specified DamDie ModuleTag_01 + End + + Behavior Specified DestroyDie ModuleTag_01 + End + + Behavior Specified EjectPilotDie ModuleTag_01 + End + + Behavior Specified FXListDie ModuleTag_01 + End + + Behavior Specified KeepObjectDie ModuleTag_01 + End + + Behavior Specified RebuildHoleExposeDie ModuleTag_01 + End + + Behavior Specified SpecialPowerCompletionDie ModuleTag_01 + End + + Behavior Specified UpgradeDie ModuleTag_01 + End + + ;Behavior Modules + + Behavior Specified AutoHealBehavior ModuleTag_01 + End + + Behavior Specified BridgeBehavior ModuleTag_01 + End + + Behavior Specified BridgeScaffoldBehavior ModuleTag_01 + End + + Behavior Specified BridgeTowerBehavior ModuleTag_01 + End + + Behavior Specified DumbProjectileBehavior ModuleTag_01 + End + + Behavior Specified FireWeaponWhenDamagedBehavior ModuleTag_01 + End + + Behavior Specified FireWeaponWhenDeadBehavior ModuleTag_01 + End + + Behavior Specified GenerateMinefieldBehavior ModuleTag_01 + End + + Behavior Specified HelicopterSlowDeathBehavior ModuleTag_01 + End + + Behavior Specified InstantDeathBehavior ModuleTag_01 + End + + Behavior Specified JetSlowDeathBehavior ModuleTag_01 + End + + Behavior Specified MinefieldBehavior ModuleTag_01 + End + + Behavior Specified NeutronBlastBehavior ModuleTag_01 + End + + Behavior Specified NeutronMissileSlowDeathBehavior ModuleTag_01 + End + + Behavior Specified OverchargeBehavior ModuleTag_01 + End + + Behavior Specified ParkingPlaceBehavior ModuleTag_01 + End + + Behavior Specified PhysicsBehavior ModuleTag_01 + End + + Behavior Specified PoisonedBehavior ModuleTag_01 + End + + Behavior Specified PropagandaTowerBehavior ModuleTag_01 + End + + Behavior Specified RebuildHoleBehavior ModuleTag_01 + End + + Behavior Specified SlowDeathBehavior ModuleTag_01 + End + + Behavior Specified SpawnBehavior ModuleTag_01 + End + + Behavior Specified SupplyWarehouseCripplingBehavior ModuleTag_01 + End + + Behavior Specified TechBuildingBehavior ModuleTag_01 + End + + ; Contain Modules + + Behavior Specified CaveContain ModuleTag_01 + End + + Behavior Specified GarrisonContain ModuleTag_01 + End + + Behavior Specified HealContain ModuleTag_01 + End + + Behavior Specified MobNexusContain ModuleTag_01 + End + + Behavior Specified OpenContain ModuleTag_01 + End + + Behavior Specified OverlordContain ModuleTag_01 + End + + Behavior Specified ParachuteContain ModuleTag_01 + End + + Behavior Specified RailedTransportContain ModuleTag_01 + End + + Behavior Specified TransportContain ModuleTag_01 + End + + Behavior Specified TunnelContain ModuleTag_01 + End + + end + + + end + end + +; ---------------------------- BEGIN ZERO HOUR ------------------------------------------------------------ + + ZeroHour Implements Generals ; we support everything Generals supports and some additional stuff: (note: you currently cannot remove modules/values from Generals, just overwrite/append to them. If this is necessary, contact me and I'll add that functionality) + Lists + ConditionStateTypes + LEFT_TO_CENTER=1 + RIGHT_TO_CENTER=1 + CENTER_TO_LIGHT=1 + CENTER_TO_RIGHT=1 + RIDER1=1 + RIDER2=1 + RIDER3=1 + RIDER4=1 + RIDER5=1 + RIDER6=1 + RIDER7=1 + SECOND_LIFE=1 + ARMORSET_CRATEUPGRADE_ONE=1 + ARMORSET_CRATEUPGRADE_TWO=1 + end + end + + INIStructure + + end + end + +; ---------------------------- BEGIN BFME ------------------------------------------------------------ + + + BFME ; we don't implement generals/zero hour into BFME right now, I think there are just too many differences. Might be messy. + ObjectsWithLists + ConditionState=1 + ModelConditionState=1 + TransitionState=1 + AnimationState=1 + Animation=1 + end + ForcedObjects + TransitionState=1 + EmissionVolume=1 + EmissionVelocity=1 + Color=1 + Update=1 + Physics=1 + Alpha=1 + ConditionState=1 + ModelConditionState=1 + Window=1 + Transition=1 + WindowTransition=1 + LodOptions=1 + Animation=1 + AnimationState=1 + ArmyEntry=1 + LivingWorldPlayerArmy=1 + SplineCamera=1 + RegionReinforcements=1 + MoveCamera=1 + ToggleArmyControl=1 + ModifyArmyEntry=1 + LivingWorldRegionCampaignCampEA_DEMO=1 + EnemyBordersEffect=1 + ControlPoint=1 + FriendlyBordersEffect=1 + HilightBordersEffect=1 + ConqueredEffectEvenglow=1 + ConqueredEffectFlareup=1 + MouseoverEffectFlareupOwned=1 + MouseoutEffectFlareupOwned=1 + MouseoverEffectFlareupContested=1 + SkirmishOpponent=1 + MouseoutEffectFlareupContested=1 + SpawnArmy=1 + MoveArmy=1 + EyeTowerPoints=1 + WorldText=1 + AudioEvent=1 + EnableRegion=1 + ForceBattle=1 + Behavior=1 + Draw=1 + Event=1 + AllowAIPickup=1 + Body=1 + ChildObject=1 + Emitter=1 + Wind=1 + end + ForcedValues + MinVolume=1 + ParticleSysBone=1 + CurDrawableShowSubObject=1 + CurDrawableHideSubObject=1 + blank=1 + #define=1 + Size=1 + ScreenCreationRes=1 + Side=1 + CommandBarBorderColor=1 + BuildUpClockColor=1 + ButtonBorderBuildColor=1 + ButtonBorderActionColor=1 + ButtonBorderUpgradeColor=1 + ButtonBorderSystemColor=1 + ButtonBorderAlteredColor=1 + Geometry=1 + Time=1 + Position=1 + CampaignNameLabel=1 + UnitNames0=1 + UnitNames1=1 + UnitNames2=1 + LocationNameLabel=1 + firstMission=1 + ImageName=1 + Layer=1 + FinalVictoryMovie=1 + Map=1 + IntroMovie=1 + ObjectiveLine0=1 + ObjectiveLine1=1 + ObjectiveLine2=1 + ObjectiveLine3=1 + ObjectiveLine4=1 + NextMission=1 + RemoveModule=1 + end + + StringAreas + BeginScript + End=EndScript + end + end + + Lists + ConditionStateTypes + PREORDER=1 + USING_WEAPON_A=1 + USING_WEAPON_B=1 + USING_WEAPON_C=1 + EXPLODED_BOUNCING=1 + EXPLODED_FLAILING=1 + CAPTURED=1 + RAISING_FLAG=1 + CONTINUOUS_FIRE_SLOW=1 + SPECIAL_CHEERING=1 + POWER_PLANT_UPGRADING=1 + ARMED=1 + RAPELLING=1 + CLIMBING=1 + POWER_PLANT_UPGRADED=1 + OVER_WATER=1 + DEPLOYED=1 + UNPACKING=1 + PACKING=1 + JETEXHAUST=1 + JETAFTERBURNER=1 + LOADED=1 + CARRYING=1 + DOCKING_ENDING=1 + DOCKING_ACTIVE=1 + DOCKING_BEGINNING=1 + DOCKING=1 + SMOLDERING=1 + PANICKING=1 + RADAR_UPGRADED=1 + RADAR_EXTENDED=1 + CONSTRUCTION_COMPLETE=1 + ACTIVELY_CONSTRUCTING=1 + PRONE=1 + FREEFALL=1 + ACTIVELY_BEING_CONSTRUCTED=1 + PARTIALLY_CONSTRUCTED=1 + DYING=1 + POST_COLLAPSE=1 + TURRET_ROTATE=1 + RELOADING_A=1 + BETWEEN_FIRING_SHOTS_A=1 + FIRING_A=1 + PREATTACK_A=1 + RELOADING_B=1 + BETWEEN_FIRING_SHOTS_B=1 + FIRING_B=1 + PREATTACK_B=1 + RELOADING_C=1 + BETWEEN_FIRING_SHOTS_C=1 + FIRING_C=1 + PREATTACK_C=1 + DOOR_4_WAITING_TO_CLOSE=1 + DOOR_4_WAITING_OPEN=1 + DOOR_4_CLOSING=1 + DOOR_4_OPENING=1 + DOOR_3_WAITING_TO_CLOSE=1 + DOOR_3_WAITING_OPEN=1 + DOOR_3_CLOSING=1 + DOOR_3_OPENING=1 + DOOR_2_WAITING_TO_CLOSE=1 + DOOR_2_WAITING_OPEN=1 + DOOR_2_CLOSING=1 + DOOR_2_OPENING=1 + DOOR_1_WAITING_TO_CLOSE=1 + DOOR_1_WAITING_OPEN=1 + DOOR_1_CLOSING=1 + DOOR_1_OPENING=1 + WEAPONSET_PLAYER_UPGRADE=1 + WEAPONSET_CRATEUPGRADE_ONE=1 + WEAPONSET_CRATEUPGRADE_TWO=1 + WEAPONSET_HERO=1 + WEAPONSET_ELITE=1 + WEAPONSET_VETERAN=1 + ENEMYNEAR=1 + SNOW=1 + NIGHT=1 + SPECIAL_DAMAGED=1 + BACKCRUSHED=1 + FRONTCRUSHED=1 + end + PBFESlots + PRIMARY=1 + SECONDARY=1 + TERTIARY=1 + end + UpgradeConditionTypes + Upgrade_Veterancy_VETERAN=1 + Upgrade_Veterancy_ELITE=1 + Upgrade_Veterancy_HEROIC=1 + end + ObjectConditionTypes + ATTACKING=1 + MOVING=1 + FIRING_PRIMARY=1 + FIRING_SECONDARY=1 + FIRING_TERTIARY=1 + end + WeaponSetConditionTypes + PLAYER_UPGRADE=1 + MINE_CLEARING_DETAIL=1 + CARBOMB=1 + VEHICLE_HIJACK=1 + CRATEUPGRADE_ONE=1 + CRATEUPGRADE_TWO=1 + end + EditorSortingTypes + SYSTEM=1 + STRUCTURE=1 + MISC_MAN_MADE=1 + End + OCLCreationPointTypes + CREATE_AT_EDGE_FARTHEST_FROM_TARGET = 1 + CREATE_ABOVE_LOCATION = 1 + USE_OWNER_OBJECT = 1 + CREATE_AT_LOCATION = 1 + CREATE_AT_EDGE_NEAR_TARGET = 1 + CREATE_AT_EDGE_NEAR_SOURCE = 1 + end + KindOfTypes + SPELL_BOOK=1 + IMMOBILE=1 + IGNORES_SELECT_ALL=1 + INERT=1 + UNATTACKABLE=1 + OPTIMIZED_PROP=1 + end + RadarPriorityTypes + NOT_ON_RADAR=1 + end + HealAffectsTypes + INFANTRY=1 + CAVALRY=1 + MONSTER=1 + MACHINE=1 + end + AnimationStateTypes ; TODO + WEAPONSET_TOGGLE_1=1 + SELECTED=1 + STUNNED=1 + end + AnimationModeTypes + LOOP=1 + ONCE=1 + end + end + + + + INIStructure + Object ObjectName + + Draw Specified W3DScriptedModelDraw ModuleTag_01 + DefaultModelConditionState + Model = Model + ShowSubObject = [sub object name(s)] + HideSubObject = [sub object name(s)] + WeaponRecoilBone = [bone name] + WeaponFireFXBone = [bone name] + WeaponMuzzleFlash = [bone name] + WeaponLaunchBone = [bone name] + WeaponHideShowBone = [bone name] + ;IdleAnimation = [model animation name] + ;TransitionKey = [TransitionKey name] + ;Animation = [model animation name] + ;Flags = [AnimationFlag types list] + ;AnimationSpeedFactorRange = [real number real number] + ParticleSysBone = Direct Named AppendedData data\ini\ParticleSystem.ini::ParticleSystem + Turret = [sub object name] + TurretArtAngle = [integer] + TurretPitch = [integer] + TurretArtPitch = [integer] + AltTurret = [sub object name] + AltTurretArtAngle = [integer] + AltTurretArtPitch = [integer] + AltTurretPitch = [integer] + end + ;ConditionState Implements DefaultConditionState Lists ConditionStateTypes + ;End + + ModelConditionState Implements DefaultModelConditionState Lists ConditionStateTypes + End + + AliasConditionState = [ConditionState name] + + AnimationState Lists AnimationStateTypes + StateName = Name + Animation Selects AnimationName # Selects isn't accurate actually. But does what it should do for now. + AnimationName = AnimName + AnimationMode = Selects AnimationModeTypes + UseWeaponTiming=Bool + End + end + + + TransitionState Implements AnimationState Lists ConditionStateTypes # Exactly 2 ConditionStates needed + End + + OkToChangeModelColor=Bool + AnimationsRequirePower = Bool + ProjectileBoneFeedbackEnabledSlots = Lists PBFESlots + TrackMarks = TextureFilename + ExtraPublicBone = [bone name, multiple entries possible] + AttachToBoneInAnotherModule = [bone name] + IgnoreConditionStates = Lists ConditionStateTypes + end + Draw Specified W3DTreeDraw ModuleTag_01 + ModelName = Model + TextureName = TextureName + DoTopple = Bool + ToppleFX = data\ini\fxlist.ini::FXList + BounceFX = data\ini\fxlist.ini::FXList + KillWhenFinishedToppling = Bool + SinkDistance = Integer + SinkTime = Integer + End + Draw Specified W3DHordeModelDraw Implements "Draw Specified W3DScriptedModelDraw" ModuleTag_01 + end + Draw Specified W3DDebrisDraw ModuleTag_01 + End + Draw Specified W3DDefaultDraw ModuleTag_01 + End + ;Draw Specified W3DDependencyModelDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ; AttachToBoneInContainer = [bone name from object in W3DOverlordTankDraw module] + ;End + ;Draw Specified W3DOverlordTankDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ;end + ;Draw Specified W3DPoliceCarDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ;end + ;Draw Specified W3DProjectileStreamDraw ModuleTag_01 + ; Texture = TextureFilenameExt + ; Width = Float + ; TileFactor = Integer + ; ScrollRate = Float + ; MaxSegments = Integer + ;end + ;Draw Specified W3DRopeDraw ModuleTag_01 + ;End + ;Draw Specified W3DScienceModelDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ; RequiredScience = data\ini\Science.ini::Science + ;end + ;Draw Specified W3DSupplyDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ; SupplyBonePrefix = [bone name] + ;end + ;Draw Specified W3DTankDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ; TreadDriveSpeedFraction = Float + ; TreadPivotSpeedFraction = Float + ; TreadAnimationRate = Float + ; InitialRecoilSpeed = Integer + ; MaxRecoilDistance = Integer + ; RecoilDamping = Integer + ; RecoilSettleSpeed = Integer + ;end + ;Draw Specified W3DTruckDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ; RotationDamping = Float + ; TrailerRotationMultiplier = Float + ; CabRotationMultiplier = Float + ; TrailerBone = [bone name] + ; CabBone = [bone name] + ; PowerslideRotationAddition = Float + ; TireRotationMultiplier = Float + ; MidRightMidTireBone = [bone name] + ; MidLeftMidTireBone = [bone name] + ; MidRightRearTireBone = [bone name] + ; MidLeftRearTireBone = [bone name] + ; MidRightFrontTireBone = [bone name] + ; MidLeftFrontTireBone = [bone name] + ; RightRearTireBone = [bone name] + ; LeftRearTireBone = [bone name] + ; RightFrontTireBone = [bone name] + ; LeftFrontTireBone = [bone name] + ; PowerslideSpray = data\ini\ParticleSystem.ini::ParticleSystem + ; DirtSpray = data\ini\ParticleSystem.ini::ParticleSystem + ; Dust = data\ini\ParticleSystem.ini::ParticleSystem + ;end + ;Draw Specified W3DTankTruckDraw Implements "Draw Specified W3DTankDraw" Implements "Draw Specified W3DTruckDraw" ModuleTag_01 + ;end + ;Draw Specified W3DLaserDraw Implements "Draw Specified W3DModelDraw" ModuleTag_01 + ; NumBeams = Integer + ; Texture = TextureFilename + ; InnerBeamWidth = InnerBeamWidth + ; OuterBeamWidth = OuterBeamWidth + ; InnerColor = RGBA + ; OuterColor = RGBA + ; MaxIntensityLifetime = Integer + ; FadeLifetime = Integer + ; Tile = Bool + ; Segments = Integer + ; ArcHeight = Float + ; SegmentOverlapRatio = Float + ; TilingScalar = Float + ;end + ;Draw Specified W3DTracerDraw ModuleTag_01 + ;end + + + EditorSorting = Lists EditorSortingTypes + CommandSet = data\ini\commandset.ini::CommandSet + RadarPriority = Lists RadarPriorityTypes + KindOf = Lists KindOfTypes + + + ; terrain stuff: + IsGrabbable = Yes + IsHarvestable = Yes + + + ; evil special power behaviors: + + Behavior Specified OCLSpecialPower ModuleTag + SpecialPowerTemplate = data\ini\specialpower.ini::SpecialPower + OCL = data\ini\objectcreationlist.ini::ObjectCreationList + CreateLocation = Lists OCLCreationPointTypes + AvailableAtStart = Bool + End + + Behavior Specified SpecialPowerModule ModuleTag + SpecialPowerTemplate = data\ini\specialpower.ini::SpecialPower + AttributeModifier = data\ini\specialpower.ini::SpecialPower + AttributeModifierRange = Integer + AttributeModifierAffects = [who/what does it affect, for example ANY +HORDE -HERO] + TriggerFX = data\ini\fxlist.ini::FXList + UpdateModuleStartsAttack = Bool + AvailableAtStart = Bool + end + + Behavior Specified WeatherSpecialPower_decl Implements "Behavior Specified SpecialPowerModule" ModuleTag + AntiCategory = LEADERSHIP + ; AntiFX = FX_AntiLeadership ; FX for anti category + AttributeModifierWeatherBased = Bool + TargetAllSides = Bool ; Then the alliance setting in the Object Filter will control who + end + + Behavior Specified FreezingRainSpecialPower Implements "Behavior Specified WeatherSpecialPower_decl" ModuleTag + end + + Behavior Specified DarknessSpecialPower Implements "Behavior Specified WeatherSpecialPower_decl" ModuleTag + end + + Behavior Specified TaintSpecialPower Implements "Behavior Specified SpecialPowerModule" ModuleTag + TaintObject = [Taint object]; data\ini\object\::Object + TaintRadius = Integer + TaintFX = data\ini\fxlist.ini::FXList + TaintOCL = data\ini\objectcreationlist.ini::ObjectCreationList + End + + Behavior Specified ScavengerSpecialPower Implements "Behavior Specified SpecialPowerModule" ModuleTag + BountyPercent = Float + End + + Behavior Specified DevastateSpecialPower Implements "Behavior Specified SpecialPowerModule" ModuleTag + Radius = Integer + TreeValueMultiplier = Percent #The value sqeezed out of each tree is multiplied by this compared to what a worker would have gotten for it + TreeValueTotalCap = Integer #And the most you can get for the enitre spell is this, so you can't find the one map that has a 20000 patch of trees in the corner + TriggerFX = data\ini\fxlist.ini::FXList + FX = data\ini\fxlist.ini::FXList + End + + Behavior Specified ProductionSpeedBonus Implements "Behavior Specified SpecialPowerModule" ModuleTag + NumberOfFrames = Integer + SpeedMulitplier = Float + Type = [Who] ;MordorFighterHorde MordorArcherHorde + End + + ; good special power behaviors: + Behavior Specified CloudBreakSpecialPower Implements "Behavior Specified WeatherSpecialPower_decl" ModuleTag + SunbeamObject = data\ini\object\::Object + ObjectSpacing = Integer + ReEnableAntiCategory = Bool # cancel negative effects on good guys + End + + Behavior Specified ElvenWoodSpecialPower Implements "Behavior Specified SpecialPowerModule" ModuleTag + ElvenGroveObject = ElvenGrove + ElvenWoodRadius = Integer + ElvenWoodFX = FX_ElvenWoodSpellFX + ElvenWoodOCL = OCL_ElvenWoodSeed + End + + Behavior Specified PlayerUpgradeSpecialPower Implements "Behavior Specified SpecialPowerModule" ModuleTag + UpgradeName = Name + UpdateModuleStartsAttack = Bool + AffectAllies = Bool + End + + Behavior Specified PlayerHealSpecialPower Implements "Behavior Specified SpecialPowerModule" ModuleTag + HealAffects = Lists HealAffectsTypes + HealAmount = Float # 0.5 being 50% health + HealRadius = Integer + HealFX = data\ini\fxlist.ini::FXList + HealOCL = data\ini\objectcreationlist.ini::ObjectCreationList + End + + + End + ChildObject Implements Object ObjectName ParentObjectName + end + Campaign CampaignName + CampaignNameLabel = Direct String + FirstMission = Direct Mission + Mission MissionName + Map = Direct Filename + IntroMovie = Direct Movie + ObjectiveLine0 = Direct String + ObjectiveLine1 = Direct String + ObjectiveLine2 = Direct String + ObjectiveLine3 = Direct String + UnitNames0 = Direct Object + UnitNames1 = Direct Object + UnitNames2 = Direct Object + LocationNameLabel = Direct Object + VoiceLength = Integer + END + END + end + end +end \ No newline at end of file diff --git a/Tools/csfeditor/csfeditor.exe b/Tools/csfeditor/csfeditor.exe new file mode 100644 index 000000000..cf74125a4 Binary files /dev/null and b/Tools/csfeditor/csfeditor.exe differ diff --git a/Tools/csfstr/csfstr_094.exe b/Tools/csfstr/csfstr_094.exe new file mode 100644 index 000000000..0ce276112 Binary files /dev/null and b/Tools/csfstr/csfstr_094.exe differ