Actually, though animation is by far the best route, you CAN do this via script, though it's somewhat fraught with peril.
Start with a quest and a quest script:
scn CitadelLiftTestQuestSCRIPTshort Liftingshort ZPositionshort MaxZfloat fQuestDelayTimebegin gamemode if Lifting == 1 set fQuestDelayTime to # set ZPosition to # set MaxZ to ZPosition + # set Lifting to 2 elseif Lifting == 2 if ZPosition <= MaxZ set ZPosition to ZPosition + 1 CITADELREF.setpos z ZPosition else set Lifting to 3 endif endif end
CITADELREF is a named persistent reference. Maybe a citadel, maybe not.
Several values marked with a # in that script.
ZPosition is the Z coordinate of your citadel when it's at the bottom of the lake.
MaxZ is the distance between ZPosition and whatever the Z coordinate of the citadel when it's fully emerged from the lake is.
For fQuestDelayTime, set this to a very small number. 0.1 combined with incrementing ZPosition by 1 was pretty bloody slow. Play around with it until you get something you like.
You'll want a button or a lever or something with a script on it, and part of that script involves setting Lifting to 1. You only want to do that once or it will explode and die horribly.
Now for the "fraught with peril" part:
- Stock citadels don't come with doorways or actual doors. If you have the skills, consider attaching a doorway and dummy door to the citadel .nif so you can move them as one piece. Otherwise, you'll need to modify the script to move them all at the same time.
- You'll want to enable the actual real door at the end of the movement to save some pain.
- Static collision doesn't react very well to being moved like this. You'll need to disable and then enable it at least once, maybe at the end, maybe every time loop through the script. Take your pick.
Many, many different ways you can rewrite this script to make it do more stuff, but this should give you the basics.