The source code is in there, but yeah that was pretty much it.
Horizontally I cut the playable area into three equal strips. Then used an all black view a few times to fill in those strips... maybe 4 or 5 blocks to fit all the way across the screen. So multiply that block for all three rows...
If I remember correctly, the top and bottom strips only had to adjust up or down as the ego moved up and down, It was really only the center strip of blocks that had to adjust in the x directions as well as the y. Then there was a view that surrounded the ego with a transparent center. It followed the ego around. Depending on the light level as to how big the transparent hole was. The center row of black blocks had to adjust in such a way that they didn't cover any of the ego's transparent cover as you moved left or right.
The priority of the border of the picture resource as well as the menu and icons was set high enough that they always showed on top of the all black views. Switching between the room screens and battle screens, I totally faked by placing a fake ego with the expected background drawn onto the actual view into a totally separate room from the room that it appeared to be in. By the time it was all said and done, between the darkness and the inventory logic (specifically the random placement of items in random rooms if they were stolen) ever present, there just wasn't much heap left for anything else. That was probably the biggest reason for switching to a intermediate room for the battle sequences. It freed up the heap I needed to make use of SCIaudio.
Easy right?
I am not even sure if I looked at the source code now whether or not I would even be able to decipher it again.
*Edit
So I pulled out the code... Here are the relevant bits
In the init method of the public instance
(if(== lightLevel 1)(noLight:init()ignoreActors()cel(1)setPri(13)posn((send gEgo:x) 95)setScript(noLightEgo)))
(if(== lightLevel 0)(noLight:init()ignoreActors()setPri(13)posn((send gEgo:x) 95)setScript(noLightEgo)))
(if(< lightLevel 2)
(coverA1:init()ignoreActors()setPri(13)posn(37 (- (noLight:y) 75)))
(coverA2:init()ignoreActors()setPri(13)posn(112 (- (noLight:y) 75)))
(coverA3:init()ignoreActors()setPri(13)posn(187 (- (noLight:y) 75)))
(coverA4:init()ignoreActors()setPri(13)posn(262 (- (noLight:y) 75)))
(coverA5:init()ignoreActors()setPri(13)posn(337 (- (noLight:y) 75)))
(cover1:init()posn((+ (send gEgo:x) 75) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover2:init()posn((+ (send gEgo:x) 150) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover3:init()posn((+ (send gEgo:x) 225) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover4:init()posn((+ (send gEgo:x) 300) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover5:init()posn((- (send gEgo:x) 75) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover6:init()posn((- (send gEgo:x) 150) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover7:init()posn((- (send gEgo:x) 225) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(cover8:init()posn((- (send gEgo:x) 300) (- (send gEgo:y) 20))ignoreActors()setPri(13))
(coverB1:init()posn(37 (+ (noLight:y) 53))ignoreActors()setPri(13))
(coverB2:init()posn(112 (+ (noLight:y) 53))ignoreActors()setPri(13))
(coverB3:init()posn(187 (+ (noLight:y) 53))ignoreActors()setPri(13))
(coverB4:init()posn(262 (+ (noLight:y) 53))ignoreActors()setPri(13))
(coverB5:init()posn(337 (+ (noLight:y) 53))ignoreActors()setPri(13))
)
and then there's the instances for all of these
(instance noLight of Prop(properties x 400 y 400 view 2 loop 0 cel 0))
(instance coverA1 of Prop(properties x 37 y 30 view 2 loop 1 cel 1))
(instance coverA2 of Prop(properties x 112 y 30 view 2 loop 1 cel 1))
(instance coverA3 of Prop(properties x 187 y 30 view 2 loop 1 cel 1))
(instance coverA4 of Prop(properties x 262 y 30 view 2 loop 1 cel 1))
(instance coverA5 of Prop(properties x 337 y 30 view 2 loop 1 cel 1))
(instance cover1 of Prop(properties x 37 y 100 view 2 loop 1 cel 0))
(instance cover2 of Prop(properties x 112 y 100 view 2 loop 1 cel 0))
(instance cover3 of Prop(properties x 187 y 100 view 2 loop 1 cel 0))
(instance cover4 of Prop(properties x 262 y 100 view 2 loop 1 cel 0))
(instance cover5 of Prop(properties x 337 y 100 view 2 loop 1 cel 0))
(instance cover6 of Prop(properties x 37 y 100 view 2 loop 1 cel 0))
(instance cover7 of Prop(properties x 112 y 100 view 2 loop 1 cel 0))
(instance cover8 of Prop(properties x 187 y 100 view 2 loop 1 cel 0))
(instance coverB1 of Prop(properties x 37 y 140 view 2 loop 1 cel 2))
(instance coverB2 of Prop(properties x 112 y 140 view 2 loop 1 cel 2))
(instance coverB3 of Prop(properties x 187 y 140 view 2 loop 1 cel 2))
(instance coverB4 of Prop(properties x 262 y 140 view 2 loop 1 cel 2))
(instance coverB5 of Prop(properties x 337 y 140 view 2 loop 1 cel 2))
noLight was the blackness that stuck with ego and had the transparent hole cut out of the middle... 75 x 75
coverA# was an all black view 75 x 35 - used at the top of the screen
cover# was an all black view 75 x 75 - used in line with ego
coverB# was an all black view 75 x 53 used along the bottom of the screen
and finally, the noLightEgo script instance which determined the positioning of everything
(instance noLightEgo of Script
(properties)
(method (doit)
(var lightingLevel)
(super:doit())
(noLight:posn((send gEgo:x) (- (send gEgo:y) 20)))
(coverA1:posn(37 (- (noLight:y) 75)))
(coverA2:posn(112 (- (noLight:y) 75)))
(coverA3:posn(187 (- (noLight:y) 75)))
(coverA4:posn(262 (- (noLight:y) 75)))
(coverA5:posn(337 (- (noLight:y) 75)))
(cover1:posn((+ (send gEgo:x) 75) (noLight:y)))
(cover2:posn((+ (send gEgo:x) 150) (noLight:y)))
(cover3:posn((+ (send gEgo:x) 225) (noLight:y)))
(cover4:posn((+ (send gEgo:x) 300) (noLight:y)))
(cover5:posn((- (send gEgo:x) 75) (noLight:y)))
(cover6:posn((- (send gEgo:x) 150) (noLight:y)))
(cover7:posn((- (send gEgo:x) 225) (noLight:y)))
(cover8:posn((- (send gEgo:x) 300) (noLight:y)))
(coverB1:posn(37 (+ (noLight:y) 53)))
(coverB2:posn(112 (+ (noLight:y) 53)))
(coverB3:posn(187 (+ (noLight:y) 53)))
(coverB4:posn(262 (+ (noLight:y) 53)))
(coverB5:posn(337 (+ (noLight:y) 53)))
)// end method
)// end instance
noLight was obviously positioned by the ego
coverA# y's position was based then off of noLight's y and had a static x so the only shifted up and down
cover# x's was based off the ego's x and noLight's y and they all moved in both directions when ego moved
coverB# y's postions was based off of noLight's y and had a static x so they only shifted up and down