Very interesting observations. I wonder how you discovered the occupied launch pad as a trigger. If you get the RLV right away, but keep launching it (empty) right away each time it lands, does that also delay the attack?
I took a quick look at Eden mission 12 in OllyDbg, to see if I could verify the launch pad idea, though I don't see anything obvious to check specifically. It has quite a few trigger exports. Too many to check all of them. Here's a quick list of exports:
Names in e12
Address Section Type Name Comment
; Required exports
11001130 .text Export GetSaveRegions
11001150 .text Export InitProc
11001210 .text Export AIProc
11001230 .text Export StatusProc
; Trigger callbacks
11003090 .text Export EnemyArrive
11003190 .text Export NoResponseToTrigger
110031A0 .text Export Tornado
11003240 .text Export TornadoStop
11003260 .text Export StormStart
11003340 .text Export StormStop
11003360 .text Export Storm1
11003390 .text Export Meteor1
110033C0 .text Export Meteor2
110033F0 .text Export MeteorStart
11003460 .text Export MeteorRepeat
110034D0 .text Export Quake1
110034F0 .text Export Quake2
11003510 .text Export Quake3
11003550 .text Export KidsInSpace
110035D0 .text Export KidsArrived
11003680 .text Export KidsDead
110036D0 .text Export BringInKids
11003870 .text Export RestartKids
11003950 .text Export SetPiece
11003970 .text Export StartEnemies
11003B40 .text Export StartEMP3
11003C50 .text Export FireEMP1
11003CC0 .text Export FireEMP2
11003EF0 .text Export FireEMP3
11003F00 .text Export Wave1
11004000 .text Export Wave2
110042A0 .text Export Reinforce1
11004350 .text Export ToggleRe
11004380 .text Export ReinforceArrive
11004520 .text Export CheckForFail
; Required data exports
11008090 .data Export MapName
110080A0 .data Export LevelDesc
110080B8 .data Export TechtreeName
110080C8 .data Export DescBlock
; Other data exports
1100AAF0 .data Export Units3Hard
1100AB78 .data Export Units4Easy
1100AC00 .data Export Units1Norm
1100AC88 .data Export GroupType2NormB
1100AD10 .data Export GroupType2NormA
1100AD98 .data Export Units4Hard
1100AE20 .data Export Units1Easy
1100AEA8 .data Export GroupType2Easy
1100AF30 .data Export Units2Norm
1100AFB8 .data Export GroupType2Hard
1100B040 .data Export Units1Hard
1100B0C8 .data Export Units2Easy
1100B158 .data Export Units3Norm
1100B200 .data Export GroupType1
1100B288 .data Export Units2Hard
1100B368 .data Export Units3Easy
1100B3F0 .data Export Units4Norm
If I was more familiar with the mission, I might have a better sense of which trigger callbacks did what.
I also took a quick look at Eden mission 9 in OllyDbg. Here's a quick summary of the exports for mission 9. Again, if I was more familiar with the mission, I'd have a better sense of what was worth looking at.
Names in e09
Address Section Type Name Comment
; Required exports
110010B0 .text Export GetSaveRegions
110010D0 .text Export InitProc
11001210 .text Export AIProc
11001220 .text Export StatusProc
; Trigger callbacks
11002EC0 .text Export Located
11002ED0 .text Export CheckForEnd
11002FF0 .text Export NoResponseToTrigger
11003000 .text Export Quake1
11003020 .text Export Quake2
11003040 .text Export Quake3
11003120 .text Export Tornado
11003160 .text Export TornadoHard
110031A0 .text Export Storm
110031E0 .text Export Lava
11003200 .text Export EnableAmbush
11003260 .text Export DoAmbush1
110033E0 .text Export DoAmbush2
11003560 .text Export DoAmbush3
110036E0 .text Export DoAmbush4
11003860 .text Export ReinforceE
110038C0 .text Export ReinforceP
110038F0 .text Export ToggleP
; Required data exports
110070F0 .data Export MapName
11007100 .data Export LevelDesc
11007110 .data Export TechtreeName
11007120 .data Export DescBlock
; Other data exports
1100A080 .data Export Ambush3BEasy
1100A108 .data Export Ambush1BHard
1100A190 .data Export Ambush4AHard
1100A218 .data Export Ambush4BEasy
1100A2A0 .data Export Ambush2BHard
1100A328 .data Export Guard3Easy
1100A3D0 .data Export Ambush2BEasy
1100A458 .data Export Guard1HardB
1100A4E0 .data Export Guard1HardA
1100A568 .data Export Ambush1BEasy
1100A5F0 .data Export Reinforce2
1100A678 .data Export Reinforce1
1100A700 .data Export Ambush3AHard
1100A788 .data Export Ambush3AEasy
1100A810 .data Export Ambush1AHard
1100A898 .data Export Ambush2AHard
1100A920 .data Export Ambush3B
1100A9A8 .data Export Ambush3A
1100AA30 .data Export Guard2
1100AAB8 .data Export Ambush4B
1100AB40 .data Export Ambush4A
1100ABC8 .data Export Ambush1B
1100AC50 .data Export Ambush1A
1100ACD8 .data Export Ambush2B
1100AD60 .data Export Ambush2A
1100ADE8 .data Export Ambush4AEasy
1100AE80 .data Export Ambush2AEasy
1100AF08 .data Export Ambush1AEasy
1100AF90 .data Export BonusTok
1100B018 .data Export PatrolY
1100B0A0 .data Export PatrolX
1100B128 .data Export TowersEasy
1100B1B0 .data Export Scout1
1100B248 .data Export PBase
1100B2D0 .data Export Reinforce2Easy
1100B358 .data Export TowersHard
1100B3E8 .data Export Ambush4BHard
1100B470 .data Export Guard1EasyB
1100B4F8 .data Export Guard1EasyA
1100B5B8 .data Export Guard3Hard
1100B640 .data Export Ambush3BHard
Edit: I looked more specifically at EnableAmbush. It uses a Rect trigger. The Rect appears to be:
x = 110 (0x6E)
y = 96 (0x60)
width = 8
height = 9
Ok, I went over a bit of code in more detail. I analysed the function at address 0x11003D00 in e09.dll. This method is called from InitProc, and seems to setup the triggers and victory/failure conditions for the level.
Slight correction over my earlier post. There are 4 rects, each of which leads to an ambush. The rects are initially disabled. They are enabled by a CountTrigger. If you have greater than or equal to 4 cargo trucks carrying wreckage, the ambush rects are enabled.
The 4 rects, and the corresponding trigger callbacks are:
//Rect(x, y, width, height)
Rect(110, 96, 8, 9) => Ambush1
Rect(147, 78, 3, 8) => Ambush2
Rect(41, 94, 15, 19) => Ambush3
Rect(112, 16, 3, 4) => Ambush4
Both players have a reinforce VehicleCountTrigger. It is a one-shot trigger.
If Player 0 has fewer than 8 units, call "ReinforceE"
If player 1 has fewer than 8 units, call "ReinforceP"
In addition to those triggers, there is a CountTrigger for player 0:
If player 0 has greater than or equal to 4 cargo trucks with wreckage, call "ReinforceE".
That should imply player 0 can get two sets of reinforcements, once when low on units, and once after picking up all 4 pieces of wreckage.
There is a "ToggleP" trigger. It is called periodically by a repeating TimeTrigger. The frequency depends on difficulty setting:
Easy = 5000 ticks
Medium = 3000 ticks
Hard = 1200 ticks
The "ToggleP" callback has some code involving FightGroups. It uses DoGuardRect, and SetRect. There seems to be a static Rect variable, which is initialized elsewhere with the values (81, 115, 101, 126). The method makes use of the player difficulty setting and random numbers. It references "Reinforce1", "Reinforce2", and "Reinforce2Easy". I've not looked at this method in much detail.
The main trigger setup function also sets up disaster triggers for various disaster types, at various intervals. A few looked interesting.
If player 0 has 3 or more cargo trucks with wreckage, call "Quake3".
Tornadoes vary by difficulty setting:
Easy, Medium = 12000 ticks to 18000 ticks
Hard = 5000 ticks to 6000 ticks
Storm: 5000 ticks to 11000 ticks
Quake1: 8400 ticks
Quake2: 24000 ticks