Well, there's far more string in the ball than you needed to attach to the hook, so there's plenty left over.
I think the solution for the floaty text bug is to hack an adjustment into RoomOpen(). The simple way would be cancel the text, the slightly more complicated way to correct it.
You start off being able to hold 5 items because you need the space for the first puzzle as there's not room to drop something in the cage. I could have expanded the cage or had the door open immediately you hook the key, but I cheated a little. My excuse is that the key is very small. The inventory is adjusted down to 4 afterwards. There'll be bags to expand the inventory later on- kind of needed once you get the second permanent item.
I've added the glass and bulb as targets, stand by to test them in the next version.
The issue I spent ages tracking down was due to misinterpreting tabadd()- I assumed it inserted a given value into the table, when in fact it adds a number of slots. As you can imagine, that played hob with trying to populate the list of targets.
ObjPresentIdx() finds objects in the 9x9 square when you have scrolling turned on (for exactly that reason- the same function is used to work out which Objects to draw so it's rather essential). I actually hacked in a new viewport mode, but the check in the function still works.
It might have been easier to create some super-large shaded graphics for the shadows, custom drawn to fit the lighting patterns. But having committed to the first way I followed through.