(A long-winded ramble about EXTEND_TOP, EXTEND_BOTTOM, and my experiences with both. You've been warned.)
About three years ago, someone asked at (now inactive) CoM boards: should I use EXTEND_BOTTOM in area scripts, or EXTEND_TOP? And SConrad, I remember, answered: "Always use EXTEND_TOP."
Why? I wondered then. Many mods use EXTEND_BOTTOM and are happy with it!
But just in case, I decided to follow suit, and coded Xan for BG2 with EXTEND_TOP. I found out, however, that it had its disadvantages: in order not to interfere with OnCreation() command in some of the area scripts, I had to use Continue() at the end of each of my extended blocks for these areas.
Okay, two years passed, and now, I thought, the danger was clearly past. After all, all NPC mods, starting with Kelsey, happily use EXTEND_BOTTOM, and everything seems all right! That said, I decided to forget about EXTEND_TOP's, and used EXTEND_BOTTOMS for de'Arnise romance and Angelo both.
Everything worked fine, until testers started to report the unability to complete Bodhi quest in Chapter 6, because the characters didn't spawn in Temple District. (Which means no Angelo for ToB, as you imagine). I switched EXTEND_BOTTOM with EXTEND_TOP, and bug reports ceased. (Maybe because people were afraid of me. You never know.)
Still, I suspected it was a fluke. I was still biased towards EXTEND_TOP, because I knew there were unwise modders who coded their area scripts with
IF
True()
THEN
...
END
(which kills EVERY script block underneath, making EXTEND_BOTTOM useless).
But yesterday I became entirely convinced that EXTEND_TOP is the only way to go.
I've been peacefully testing IWD NPC for chapter 4, but when I entered a certain chamber, neither of the banters started. I checked the scripts, checked the dialogue file. Nothing. I checked the area script: my blocks appended all right.
... two hours later, I found out the cause: one of the blocks in the _vanilla game script_ started with
IF
True()
THEN
...
END
Grrr.
Of course, I spent the next fifteen minutes adding Continue()'s and replacing EXTEND_BOTTOM's with EXTEND_TOP's, and of course, it worked immediately afterwards.
... I think I'll stick with EXTEND_TOP from now on.