This is a tutorial to teach you how to create a basic Room-Over-Room in the Build engine. You may want to have the ADVANCED.TXT sections 2 and 3 handy while going over this tutorial. To view this map in Shadow Warrior download rmorm1.zip
1. In a Room-Over-Room situation you have an lower level and an upper level. At premap load-up, one level will be pulled over the other. This you control by setting one level to be the anchor point. This anchor point should be in the level that is part of the main map sectors. The heights and alignments of each of the involved sectors (levels) MUST be correct, or it will be one garbled mess. So, when creating your levels you have to pay special attention to the floor and ceiling z-coordinates. This can be determined by placing the cursor in a sector in 2D mode and pressing the Tab key. Picture building a house of cards. You build the bottom level then you place a ceiling on it with the cards lying flat over the lower lever. Next, you build the second level on top of the ceiling of the lower level. The z-coordinate of the ceiling of the lower level is the under side of the flat cards. However, the flat cards have a thickness to it, and the top side of the flat cards will be the z-coordinate of the floor of the upper level. The player is not transported from one level to the other since they are in perfect alignment with each other. Rather, he will fall into the lower level or climb into the upper level (if allowed). One last thing I want you to be aware of is if you look at the z-coordinates of any sector you will find that the ceiling has a lower z-coordinate number than the floor z-coordinate number. This is just the direction that the designer(s) picked.
2. Some other things you must consider when designing your Room-Over-Room situation are the size, shape, and the amount of sectors that will be involved in the process. For this tutorial we will have a hallway (hallway 1) leading to the Room-Over-Room area with a hole in the ceiling and a way to climb up to it. Also, we will have a hallway (hallway 2) leaving the upper level. For the sake of argument the lower level will be considered part of the main map level. This means we will want the lower level anchored and the upper level pulled over the lower level at premap load up. Keeping this stuff straight becomes very important when you have more than one Room-Over-Room situation within a single map.
![]() Fig 1. Lower level. |
3. Fig 1 shows the lower level of our Room-Over-Room. Even though you would have created some of your main map by this point, I wanted to show you the area that we are going to use for the lower level. The bump in the northern wall of the big room is where we will place a ladder so the player can climb up to the upper level. You will notice that both hallways are bent. This is important, and should be designed so when the player is at the far end of a hallway he can not see into the actual Room-Over-Room. The farther away that you get from the Room-Over-Room where the player can still see the actual Room-Over-Room the more complicated it becomes. So, when possible try to keep your Room-Over-Room situations in a confined area. Sometimes you can not avoid it though such as a roof situation, but still try to keep it somewhat confined. It is no biggie if you don't mind all the extra work you will put into it. Hey, it's your map go for it.
![]() Fig 2a. Sector for hole in the ceiling. |
![]() Fig 2b. 3D view of lower level. |
4. To make the hole in the ceiling we need to add another sector (peninsula sector C). Looking at Fig 2a start at the vertice marked Start (using the Space Bar in 2D mode) and make the sector ending up at the Finish vertice. If you did it correctly the line will turn red. Go into 3D mode and raise sector C ceiling up (I hit PgUp 4 times). You must keep track of the ceiling heights of sector A (the ceiling of the lower level), and sector C (hole height for the lower level). Area D is the position we plan on having the hallway (hallway 2) in the upper level. However, we must have it here to take care of the "null space" (section 2.2.3 ADVANCED.TXT) created by the Room-Over-Room effect (more on this later). Note: I used the tile number 342 for the floor and ceiling textures for area D.
![]() Fig 3. Both levels. |
5. Ok, create the upper level making sure that it is the exact same size as the lower level. You can do this by using the Copy and Paste, or make it manually. Just make sure that you save your work first. Sometimes it is best to save your level as different names at different stages of your level. Something like MY1.MAP, MY2.MAP, etc... Have the floor height of the upper level equal to the ceiling height of the to be hole of the first level (height 1). Now, have the floor height of the to hole of the upper level equal to the ceiling height of the lower level (height 2). This "overlap" for the to be hole is discussed in section 2.2.5 of the ADVANCED.TXT file. The texture used in this overlap (B in Figs 2a and 2b) should be the same with the same shading values. This overlap is the thickness of the flat cards I mentioned earlier (4 PgUps for lower level and 4 PgDns in the upper level). Note, that we do not want the bump in the upper level. When the player climbs the ladder in from the lower level to the upper level, we want to end up on the walkway. You will also notice that the bump in the lower level as been changed to a sector. This was done in 2D mode using the Space bar, following around to each of the vertices. When you finish all of the line (except the north wall) will turn red.
6. Null space is the area located in the oppisite level the player moves in without any VIEW_LEVEL sprites in it. It can be a void (nothing there) or a sector. You must have this area which takes the exact same space as the area in the oppisite level that the player will move through. Yes, both areas could be made for the player to past through. However, the lower levels' ceiling must be raise to the big area ceiling height (no archway or low ceiling). In our case we will discuss hallway 2 and the bump (as I call it).
![]() Fig 4a. 3D view of lower level facing north. |
![]() Fig 4b. 3D view of both levels pulled together. |
7. Hallway 2 is on the upper level and the player will be able to move through it. It has an archway and then the bent hallway. Null space 2 is its' counterpart on the lower level, but I made it one sector (for ease of construction). As we place in our VIEW_LEVEL sprites in one level they must be placed in the oppisite level. If we only place the VIEW_LEVEL sprites in hallway 2 and had none in the null space 2 area you would have an error and a grabled mess (in the hole area) when the player was standing in hallway 2 looking back out into the Room-Over-Room. However, once we also place the VIEW_LEVEL sprites in null space 2 it no longer is considered a "null space" and the error is corrected. Now, I hope that you can see why the bump in the lower level had to be changed to a sector. We need to put our VIEW_LEVEL sprites in it so there would not be an error when the player is standing directly over it on the walkway in the upper level. Make sure that you have the floor and ceilings of null space 2 and the null space 3 tile 342 (No Draw) texture. Now, go ahead and raise their floors all the way to the ceiling (fig 4a and 4b). In the upper level null space 1 you will have to lower the ceiling all the way to the floor with tile 342 on its' ceiling and floor too. You will notice that I made these walls blocking too by the purple colored lines (fig 3). Finally, if you haven't done so change the hole ceiling texture in the lower level and the hole floor texture in the upper level to tile number 341. Make sure that you make them parallaxing by placing the mouse cursor on them and pressing the P key in 3D mode (fig 4a).
![]() Fig 5. Entering ST1 sprites in the lower level. |
8. Ok, time to add our ST1 sprites (picnum 2307) in the lower level. Again, since we want the lower level to be part of our main map it will be the anchor level. Always start will the hole first. If you have more than one hole then pick just one and treat the other holes as any other sector on the lower level. We will use two match tags which will be 1 and 2. If you do not know your next available tag press F5 in 2D mode. Insert 5 ST1 sprites into the hole sector as shown in fig 5. Since we are in the lower level we will need the VIEW_THRU_CEILING for the first two sprites. Give them both a HiTag of 120 (Alt-H) and angle these sprites down using the > or < keys (I just do it to indicate the lower level). Give the first sprite a LoTag (Alt-T) of 2, and the second one a LoTag of 1 (our match tags). The next two sprites are given a HiTag of 110 (VIEW_LEVEL1). As before, give the first one a LoTag of 2 and the second one a LoTag of 1. The second one with the LoTag of 1 must have the angle pointing down. The fifth sprite is our anchor sprite (BOUND_FLOOR_BASE_OFFSET) Hitag 202. The Lotag must be an even number for the anchor point. So, since this is our first Room-Over-Room in this map let's give it a LoTag of 0 (zero). The positioning of the sprites with a HiTag of 120 and the last one with a Hitag of 202 is important when adding there counterparts HiTags 121 and 203 respectively in the upper level. Finally, insert two ST1 sprites in each of your other sectors in the lower level including hallway 1, and the two null spaces. Give them a HiTag of 110 and one a LoTag of 2 and the other a LoTag of 1. Remember, the one with the LoTag of 2 the angle stays up, and the one with the LoTag of 1 has the angle pointing down. These two sprites positioning are not that important as the other ones were.
![]() Fig 6. Entering ST1 sprites in the upper level. |
9. Ok, time to add our ST1 sprites (picnum 2307) in the upper level. Again, insert 5 ST1 sprites into the hole sector as shown in fig 6. Since we are in the upper level we will need the VIEW_THRU_FLOOR for the first two sprites. Give them both a HiTag of 121. Give the first sprite a LoTag of 2, and the second one a LoTag of 1 (our match tags). The next two sprites are given a HiTag of 111 (VIEW_LEVEL2). As before, give the first one a LoTag of 2 and the second one a LoTag of 1. The first one with the LoTag of 2 must have the angle pointing down. The fifth sprite is the BOUND_FLOOR_OFFSET (Hitag 203) sprite. The Lotag must be an odd number for the non-anchor point. So, we will add one to zero (the counterpart number) and give it a LoTag of 1. Again, the positioning of the sprites with a HiTag of 121 and the last one with a Hitag of 203 must be the same as there counterparts HiTags 120 and 202 respectively in the lower level. Finally, insert two ST1 sprites in each of your other sectors in the upper level including hallway 1, the archway, and the null space. Give them a HiTag of 111 and one a LoTag of 2 and the other a LoTag of 1. Remember, the one with the LoTag of 2 the angle points down, and the one with the LoTag of 1 has the angle pointing up.
![]() Fig 7a. 3D view facing south with no archway. |
![]() Fig 7b. Same view with archway. |
10. Ok, now that all the sprites have been added go to the lower level area. In 3D mode press "3". This toggles Room-Over-Room draw in Build. Do not go to 2D mode until you have press "3" again to turn it off. If you have done everything correct everything will look fine. Make sure that you back into the hallway and you can see fine and you get no error messages on the screen. Now press 3 to turn off the Room-Over-Room draw and go to the upper level in 2D mode. Go back to 3D mode and press 3 to turn it back on. Again, look everything over by moving all around and finding no errors. WHAT! You say that there is an error when looking down at hallway 1 in the lower level. That's right you can't see the archway and its' ceiling as been pulled up to the lower level ceiling height. This error can only be seen from the upper level looking down on the lower level. To correct this problem go to the lower level in hallway 1 and delete the sprite with the LoTag of 2. Also, delete the same sprite in the archway. Now, go to the null space 1 area and delete the same sprite (LoTag 2), and the error will be gone. This is why I use to sets of VIEW_LEVEL sprites LoTag 1 and LoTag 2 (see section 3.1 of the ADVANCED.TXT file).
![]() Fig 8. Bottom of ladder. |
11. Place the ladder on the bump in the lower level so the player can climb up to the upper level. Go to 3D mode and place the cursor on the wall and press the S key. The ladder picnum is 62 as shown if fig 8. You will need to place 3 ladder sprites on the wall using the PgUp and PgDn keys to arrange them vertically in 3D mode. Go to 2D mode to move them horizontally. Now, give the wall a LoTag of 305 to make it a climbing wall. Finally, insert a ST1 sprite with a HiTag of 30 (SPRI_CLIMB_MARKER) a little away from the wall. Make sure the angle is pointing out away from the wall.