With ZIL, you won’t be able to have a table of objects or rooms, per se. But you could use multiple tables to represent multiple objects/rooms and their specific characteristics. Infocom uses this method for rooms in at least 5 games.
For example, the Royal Puzzle in Zork III is made of 36 virtual rooms laid out in a 6x6 grid:
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
Each of these rooms uses the same base ROOM object. But a virtual room’s location is used to calculate an offset in a table. The first room in the upper left has an offset of 1. The last room in the bottom right is 36. So moving from room to room will change the offset like you described. In the Royal Puzzle, moving NORTH or SOUTH decreases or increases, respectively, the offset by 6. This offset, then, points to the appropriate entry in other tables which describe the desired room characteristics.
For the Royal Puzzle, the CPOBJS table is 36x8 table which each stores the objects (up to 7) in each virtual room:
#ofObjs Obj1 Obj2 Obj3 Obj4 Obj5 Obj6 Obj7 ;Room 1
#ofObjs Obj1 Obj2 Obj3 Obj4 Obj5 Obj6 Obj7 ;Room 2
.
.
.
#ofObjs Obj1 Obj2 Obj3 Obj4 Obj5 Obj6 Obj7 ;Room 36
So all the objects in the 15th room (which is the 3rd room from the left in the 3rd row) would be stored in the 15th entry of CPOBJs. When moving into a new room, the game will first remove all the objects from the base ROOM object and copies those object numbers into the current virtual room’s entry in CPOBJs. Then, the new room’s offset is calculate based upon the direction moved. The objects listed in the new room’s entry in CPOBJs will be moved back into the base ROOM object. So moving rooms constantly changes the objects in the base ROOM to simulating moving from to different rooms.
Seastalker did try to save space but storing the location of objects in the virtual rooms as data pairs in a table, DESERT-TABLE:
Room# Obj# Room# Obj# Room# Obj# ... Room# Obj#
So 2 objects in the 20th room would have 2 entries with 2 values:
Room1 ball Room2 letter Room20 hammer Room20 flashlight Room30 rock ...
When moving from virtual room to virtual room, the game would first copy each object in the current virtual room (base ROOM object) and save it into DESERT-TABLE as the room number and object number pair (filling up blank entries in the table first). Then it would search for any entries with the new virtual room number and copy the paired objects into the base ROOM object.
Leather Goddesses of Phobos had a 10x29 table, CATACOMBS-TABLE, to describe the exits in each virtual room:
N NE E SE S SW W NW U D
3 0 0 3 0 1 0 0 0 0 ;Room 2
0 4 0 0 2 0 2 0 0 0 ;Room 3
3 0 5 0 0 0 99 0 0 0 ;Room 4
.
.
So moving SE from Room2 would access the 4th entry in the second row. The value there, 3, indicates the new room is Room3. For this example, 0 is no exit and 99 is a wall.
I hope the examples help you design virtual rooms.