Internal Error
The Internal Error (often just written short-hand as IE) is a general error returned by the Tiberian Sun engine and its derivates. The message itself gives no information about what the error actually was or what went wrong, thus leaving it to the modder to know what could have caused the error and to find the cause in their mod's changes.
If you experience an Internal Error, you should:
- Check if the EIP reported in your except.txt file matches an EIP for which the IE cause is known (see below).
- Think about whether a distinctive event immediately preceeded the error (e.g. a unit being built, a weapon being fired, etc.). If this was the case then take a look at the changes you applied to that unit/weapon/whatever and see if there are any mistakes.
- Carefully check your latest modifications, with the help of a diff between the current rules set and the previous, working rules if possible (for this reason, and in case you mess up your code beyond repair, you should always keep recent backups of working code).
Remember that the more code you add at the same time, the more likely it is to introduce multiple bugs and IE causes (and just because you found one mistake in your code, that doesn't mean there can't be another).
Except.txt
If your game crashes because of an Internal Error, a file named except.txt is generated in your game folder. This file is a dump of certain runtime-data from the game at the moment the error occurred and could potentially tell you exactly what went wrong if you knew the engine code.
Due to his research into the game's binary and his efforts to develop the RockPatch, pd has occasionally been able to indicate the area of the engine where the error occurred (for example, an error occurring in the voxel-loading routines may indicate a problem with a custom voxel).
However, pd has other commitments and should not be treated as the go-to guy for any IEs you may have. Further more, pd may not neccessarily be able to help - without the source code or a comprehensive understanding of the game's binary the file is of little use. (cp. SYNCx.txt)
According to an early version of Except.txt (which now redirects here), this file includes the full structure and a stack dump of a CONTEXT element.
IEs that share the same cause also share the same EIP: value in except.txt, so knowing that value might help you determine the cause of your IE (see the list of known IE causes (below) which also includes the corresponding EIP). However, it should be noted that some shared IE causes in INI code can yield one of several different EIP values (depending on the circumstance), and that some rare IE causes can actually yield totally random EIP values. As such, if you do have an unexplained IE, you should check all of the known causes.
Known causes of Internal Errors and their EIPs
Since "Internal Error" is the game's response to almost any fatal error, its causes are diverse. Most common are causes related to weapons and warheads, with a missing warhead probably being the most commonly reported cause.
Note that some IE causes may be prevented (or at least have certain limits extended (e.g. CellSpread)) by the RockPatch, which in turn has opened up potential for new IE causes (RockPatch-specific IEs are not listed here).
Some useful tips
If an integer between 0x00812000 and 0x00B78300 appears in the stack, subtract 0x00400000 from it and look at the resulting address in gamemd.exe with a hex editor. If you find some INI flag, you can be almost sure this flag was the one being read when the problem happened and as such its values (or absence thereof) is the problem.
Specific game versions
Yuri's Revenge 1.001
EIP | Category | Cause |
---|---|---|
004145BD | Art | An AircraftType has a corrupted HVA.
Shows the file type as "unknown" in the XCC Mixer. |
00417D05 | Weapon | An AircraftType has fired a weapon which has Suicide=yes set. |
004242DB | Animation | Using a TrailerAnim on an animation but not setting a TrailerSeperation (or setting Template:TTL). This is because the default TrailerSeperation is zero, and that number is used as a divisor. |
00424A14 | Animation | An Animation with Template:TTL set was played, where X was greater than the number of list entries in Template:TTL or less than 0. |
0042E7AF | AI | A Construction Yard does not have Template:TTL set and the owning side's AI was present in the game. |
0043C2D3 | AI | Error code: EXCEPTION_STACK_OVERFLOW Description: The thread used up its stack. |
00441C28 | Misc | You have set [General]→ShakeScreen= to zero. |
004593BB | Misc | See Tank Bunker / Sell Unit IEs |
0045EC90 | Misc | Multiple reasons, depending on the stack dump in the except: |
0046650D | Weapon | A unit's shrapnel weapon does not exist (see broken-reference causes, below). |
00471CA4 | Weapon | A unit's initial primary (Template:TTL or Template:TTL) weapon's Template:TTL does not have Template:TTL set, but a weapon in some other weapon slot does. Triggered by one of the following events:
|
004895C7 | Warhead | You have a warhead with a Template:TTL greater than 11. |
004D5108 | Weapon | A unit's secondary weapon does not exist (see broken-reference causes, below), or the weapon's Template:TTL tag is missing or set to blank. Examples:
|
004F8CCD | AI | [AI]→BuildConst= lists less than 3 BuildingTypes and your last [listed] Construction Yard was destroyed or sold while you were on low power, or you went into low power without owning any Construction Yards. |
004F65BF | Misc | Some House cannot build anything from [General]→BaseUnit= . |
00505E41 | Misc | An AI-controlled House which, due to rules(md).ini configuration, is unable to construct a base, received a Construction Yard thus triggering the AI base planning routine. Triggered by the following events:
More detail: The AI base planning logic kicks in at the moment a player receives a Construction Yard and generates a plan of what buildings to build, in what order. However, the game makes an assumption that any country that can actually start base construction will be able to build at least 3 different BuildingTypes. When that assumption fails (a Construction Yard is received by the civilian house, who cannot build anything), everything goes haywire. For more info on how base planning logic works, refer to the AI Base Planning System article. |
0050CD20 0050CD44 0050CD79 0050CDA2 0050CDCC 0050CDF0 0050CE14 0050CE38 0050CE5C 0050CEA2 0050CECC 0050CF15 0050CF2A |
AI | The AI is trying to pick a target for the Nuclear Missile or Weather Storm superweapon but is lacking target weighting values for a certain object that exists on the map. You need to uncomment/restore one of the [General]→AIIonCannonXValue= lines.
|
00518369 | Warhead | An InfantryType is taking damage from a non-existant warhead. |
00567B43 | Object | An Object has a negative sight. |
005D7387 | Misc | Not having at least one valid InfantryType with Template:TTL (default) for each house. |
005DA453 | Network | A crash occurred with the network code around an object called FirewallHelper. |
005F4F88 | Animation | An Animation has Template:TTL and SOME_OVERLAY is one of the three last entries in [OverlayTypes]. Link to original report |
005F5155 | Misc | You tried to construct a BuildingType with Template:TTL. Yuri's Revenge 1.001 doesn't support this, only patched versions do. |
0062B662 | Animation | Having an animation with Template:TTL which does not point to a valid ParticleSystem (see broken-reference causes, below). |
0062DCD2 | Misc | An overlay type with Template:TTL set has been destroyed, random dice roll determined that the particle specified in Template:TTL should be displayed, but that flag is blank. |
0064003C | Misc | If you have a buildable Construction Yard, start its construction, and then cancel it, an IE will occur. Construction Yards should not be buildable - they should only be deployed from vehicles. |
0065B73F | Weapon | You have a Weapon whose Template:TTL is less than [Radiation]→RadLightDelay=. (Cause: Integer division is performed on those two values, which yields zero in this case, and then another value is divided by the result - division by zero.) |
006AEBB8 | Misc | Your ra2md.ini file lists a combination of game mode/map which the game cannot satisfy. This can happen if the range of valid combinations changes between one game session and the next (i.e. because you changed what maps were valid for which game modes in your mod, or you activated a different mod to the one that was active previously).
LaunchBase works around this by saving and restoring the game's configuration on a per-mod basis. |
006B7D30 | Object | An object has a weapon with Template:TTL, but it doesn't have Template:TTL. The latter part is what tells the game to initialize the Spawn Manager for this unit when it's instantiated, the former part tells the game to try and access the Spawn Manager (and it doesn't check if it's been initialized properly). |
006EA6AE | AI/Map | You coerced the game into creating an instance of a TeamType that is not defined, either through Map Triggers or through AI Script Actions. |
006F1FC6 | AI programming | A TeamType has been defined without assigning it a Template:TTL, or a TeamType is being referenced without being defined at all. |
006F352E | Weapon | A unit has an Template:TTL weapon specified which does not exist (see broken-reference causes, below), or the weapon's Template:TTL tag is missing or set to blank, and that unit just got promoted to Elite status. |
006F72EF | Weapon | A unit has an Template:TTL weapon specified which does not exist (see broken-reference causes, below), or the weapon's Template:TTL tag is missing or set to blank, and that unit just got promoted to Elite status. |
006F40A2 | Weapon | Started construction of a unit whose Template:TTL weapon does not exist (see broken-reference causes, below), or the weapon's Template:TTL tag is missing or set to blank. |
0070031E | Weapon | A unit has a weapon specified which does not exist in the INI (see broken-reference causes, below), or the weapon's Template:TTL tag is missing or set to blank. (Common reason - that unit just got promoted to Elite status and one of the Elite weapons is misdefined.) |
00702330 | Anim | A building has missing or non-existing DebrisTypes. Like DebrisTypes=CRYSTAL1. |
007120F7 | Misc | You have a BuildingType (which is click-repairable) with Template:TTL or Template:TTL below [General]→RepairStep=. |
0071AF4D | Warhead | Detonating a Template:TTL warhead under one of the following conditions:
|
0073B0C9 | Misc | The concept known as "Infantry Linking" can result in an IE, occuring when the linked infantry was modified in a subsequent game mode override file or a map and a human player scrolls their battlefield view to a place on the map where an AI-owned War Factory is located. Don't do Infantry Linking. |
0073C762 | Art | The artmd.ini entry specified by a VehicleType's Template:TTL tag is missing. |
00756B2D | Art | The specified Template:TTL on a VehicleType does not exist. |
00772A98 | Weapon | A unit has an Template:TTL weapon specified which does not exist (see broken-reference causes, below), or the weapon's Template:TTL tag is missing or set to blank, and that unit just got promoted to Elite status.
Also reported to be due to "firing a weapon that has no projectile". This needs testing - missing projectile may be an alternative reason to all 'missing weapon' IEs. |
007C9B92 | Malformed input | Multiple reasons, depending on the stack dump in the except:
|
007CAF66 | Malformed input | Multiple reasons, depending on the stack dump in the except:
|
Varies, stack dump starts with 0051BB7D | Warhead | A unit was being erased by a chrono weapon but the object that started the erase process no longer exists. When a unit is being erased, an instance of the TemporalClass is linked to it. This class references the object that is doing the erasing. If the object breaks the link under 'normal' circumstances (e.g. the firer is destroyed or moved) then the attack order is cancelled and the TemporalClass is removed. In some rare cases the link to the firer's TemporalClass is not removed and therefore points to garbage memory.
Examples of how the IE may occur:
The IE occurs when the unit would have been erased. |
90900004 | Misc | Generic exception, for example, raised when you are missing the snowmd.ini median fix. |
Tiberian Sun 2.03
EIP | Cause |
---|---|
00415698 | You used a TrailerAnim on an animation but forgot to set a TrailerSeperation. |
004C6428 | AI does not have any buildings available for it to build. Check Template:TTL=, Template:TTL= etc. |
006703D4 | WaveClass Sonic exception, normally triggered by a unit with a weapon that has IsSonic=yes set, firing to the south of the screen and the user scrolling up. No certain fix for this as we know, it is a possible error with the games code. (a possible fix can be found on ppm) |
0067159B | WaveClass Sonic exception. Not sure if this is code related, could be end user. |
006717CB | WaveClass laser exception. No certain fix for this as we know, it is a possible error with the games code. (a possible fix can be found on ppm) |
0067159B | You have set [AudioVisual]→ShakeScreen= to zero. |
006B6AE6 | Multiple reasons, depending on the stack dump in the except:
|
90900004 | Generic exception. |
Unverified / lacking information
EIP | Cause |
---|---|
? | Removing a building from the PrerequisitePower= list, while it exists in one of the (GDI/NODRegular/Third)PowerPlant= lists will cause an IE the moment any of your Power buildings get destroyed or sold as long as you own a Construction Yard. YR mods that remove Yuri's side from the game, should not remove YAPOWR from PrerequisitePower=.
|
? | Calling for an animation that is not listed under [Animations] might trigger an IE.
|
? | Building a unit in-game whose VXL/SHP was inserted in an original game MIX instead of an expansion MIX.
|
? | Removing the PadAircraft statement or listing an AircraftType without corresponding section causes the game to crash when you see your MCV in-game (or any other unit of any player). |
006F3481 | The (elite) secondary weapon (or its warhead) of the object you just selected could not be found (see broken-reference causes, below).
(Just tested this a bit more and got several new EIPs for when the unit was promoted (added in this revision), can't seem to get any consistent results - will need to test this further. //Marshall |
? | Setting Template:TTL. Default value is -1, positive values do not cause an IE.
|
? | Warheads that are not listed under [Warheads] have been reported to cause an IE, although the exact details are not established. It is not neccessary for every warhead to be listed (for example, removing the Grand Cannon warhead from the list appears to have no effect on the game), however there is no reason not to list every warhead. Validity questionable - if someone can replicate this then please provide an except.txt.
Simply thinking about this, putting warheads on the list should guarantee their position in the internal array, so if there is anywhere that references warheads by internal array position then this is important. However, even if you change an existing weapon's warhead to a non-parsed one in a game mode file, you still won't get an IE because default warhead values will be used. Because of this, I'm starting to wonder if the reports of un-listed warheads causing an IE are erroneous. If someone can replicate this then please provide an except.txt //Marshall
|
? | If a falling paratrooper (who has nearly reached the ground) is killed by an area-effect mutation weapon. Point based mutations seem to be okay (the falling paratrooper explodes) and the Genetic Mutator seems incapable of killing falling paratroopers. If you have an area-effect mutation weapon, you should ensure that all paratroopers are immune to it (this also means that you can't have a buildable paradrop plane and an area-effect mutation weapon in the same mod). |
00000000 | Placing two buildings on a map in the map editor so that they overlap, and then destroying or garrisoning one of them in-game. Note that this error is intermittent so may not immediately be noticeable. Use FinalAlert's Options → Show Building Outline feature to see the actual areas taken up by buildings, since there are some buildings whose foundation is different from their visual size, and make sure you don't have any buildings that overlap.
Given the unusual EIP value (all zeroes) that has been gathered from testing, it may be a corrupt EIP and not a true indication of the source of the error. Note that this EIP has also been gathered from other 'random-EIP' causes.
|
Broken-reference Causes
- Most of the flags that point to an object type do not verify that the object type exists and will try to invoke it anyway. This includes pointers to weapons, projectiles, warheads, particles, particle systems and infantry/unit/aircraft/building types, among other things.
- All object types must be parsed in order for them to be invoked successfully. For example, a weapon must be parsed by being referenced by a unit in the main rules (weapons used in a game mode that aren't referenced in the main rules will not have been parsed, nor will shrapnel weapons that haven't been referenced by a dummy unit).
- Note that all weapons have to specify a Template:TTL tag and the tag must not be blank otherwise an IE will occur. However if the specified Template:TTL does not exist then that will not cause an IE, as the game will use default warhead settings.
- Your object type may not be 'missing' as such, you may just have mis-spelled its ID (e.g. "MagenticBeam" as opposed to "MagneticBeam"). Always check your typing carefully to make sure you don't any words out.
Tank Bunker / Sell Unit IEs
- There are two IEs that can occur after using a 'Sell Unit' superweapon on a tank-bunkered unit. Both of these IEs can yield seemingly random EIP values (due to the fact that, when the unit is sold, the building's "BunkeredUnit" pointer isn't cleared and so points to garbage memory. Attempts to dereference it will be met with varying levels of failure).
- An IE may occur the instant you sell the unit.
- If an IE does not occur the instant you sell the unit, then the Tank Bunker will have been rendered unusable as the walls are still up. If the 'broken' Tank Bunker is sold or destroyed then an IE will occur (this IE does always happen). This IE frequently yields EIP 004593BB, although has been known to yield seemingly random EIP values (for the reason stated above).
- The only way to prevent these IEs is to make sure a player never has access to both the Sell Unit superweapon and the Tank Bunker at the same time. (To achieve this, the building that provides the superweapon must be uncapturable and immune to mind-control as must the Tank Bunker. Further more, unless both buildings are country specials, you will need to remove MCVs from crates and make Construction Yards uncapturable and immune to mind-control too.)
Software used to find Internal Errors
- INI Checker (can check your rules, art and sound files for syntactic errors like typos and missing references)
- ExceptChecker (primarily for RockPatch-related IEs, it analyzes except.txt, tries to find references to code added by the patch or known routines, and might then be able give a direction)
- Debugger (if you know assembler)