It is assumed that you have gone over the Room-Over-Room 1 tutorial, and that you have an understanding of the various factors involved in creating a Room-Over-Room situation. I designed this map very similar to the exit room in The Great Escape (map 17). This is a tutorial to teach you how to create a Reflective Floor - 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. Also, it is a good ideal to print out my Flags.txt file to help you with the texture alignments. Make sure that you understand the "null space" concept which I covered in the Room-Over-Room 1 tutorial. To view this map in Shadow Warrior download rmorm2.zip
1. In any 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. 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 leading to the Room-Over-Room area with a reflective floor. For the sake of argument the upper level will be considered part of the main map level. This means we will want the upper level anchored and the lower level pulled under the upper 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. It should be noted that players, monsters and such, are not reflected in the floor. This is not an actual mirror, but the impression that it is. It is typical not to have monsters in, or able to enter a reflective floor area.
![]() Fig 1. Upper level. |
3. Fig 1 shows the upper 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 upper level. You will notice that the hallway is bent. This is important, and should be designed so when the player is at the far end of the hallway he can not see into the actual Room-Over-Room area. 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.
![]() Fig 2. 3D view of the upper level. |
4a. First create your hallway coming from your main map. Second, make the archway and the main room sector. The height of the main room is 256 pixels. You can see this in 2D mode by placing the cursor in the sector and press the TAB key and read it on the lower left of the screen. Note, in fig. 2 that you must PgDn the main floor 2 times first from the height of the hallway floor. Third, make the pillars by just using the Space bar only (NO Alt-S). Forth, make the benches and table by using the Space Bar and connecting the two vertices on the northern end of the pillars (line will be white). Now, connect the two vertices on the southern end of the pillars (both lines will turn red). Insert two vertices on the inner sides of the pillars for the table. Connect these vertices for the table.
![]() Fig 3. 3D view of upper level. |
4b. I use the PgUp key 5 times for the height of the benches, and 5 additional times on the table (in 3D mode). Basically, we DO NOT want the player to be able to see the floor on the otherside of the table (a work around error - more on this later). Create the four ceiling lights with the Space Bar and then placing your cursor inside the lights and pressing Alt-S in each one. Finally, create the Buddha shelf (place where the Buddha sprite will sit) much like you create an archway only raise the floor height too.
![]() Fig 4. A 2D view of both levels. |
5. Ok, create the lower level making sure that it is the exact same size as the upper level. You can do this by using the Copy and Paste, or make it manually. Just make sure that you save your work first. Have the ceiling height (upside down floor) of the lower level main area equal to the floor height of the hallway in the upper level (height 1). Now, have the ceiling height (upside down floor) of the hallway of the lower level equal to the floor height of the upper level (height 2) main area. This "overlap" for the to be hole is discussed in section 2.2.5 of the ADVANCED.TXT file. This overlap is the thickness of the flat cards I mentioned earlier (2 PgUps for lower level and 2 PgDns in the upper level).
![]() Fig 5. 3D view of lower level. |
6. All of the textures in the lower level (fig. 4) must be flipped. Go into the rmorm2.map and in 2D mode determine the flag values for the wall textures. Pay special attention to the walls on the hallway and the Buddha shelf. One note here, you can use picnum 342 (No Draw texture) for the top of the table and benches. The player will never see them, but I left the textures in for the heck of it.
![]() Fig 6a. Inserting ST1 sprites in upper level. |
7. Ok, time to add our ST1 sprites (picnum 2307) in the upper level in the main floor area. Again, since we want the upper level to be part of our main map it will be the anchor level. Always start will the hole first. Since we have more than one hole then pick just one and treat the other holes as any other sector on the upper 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 7 ST1 sprites into the hole sector as shown in fig 6a. Since we are in the upper level we will need the VIEW_THRU_FLOOR for the first two sprites (purple color). Give them both a HiTag of 121 (Alt-H). 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 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 our anchor sprite (BOUND_FLOOR_BASE_OFFSET) Hitag 202 (purple color). 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 121 and the last one with a Hitag of 202 is important when adding there counterparts HiTags 120 and 203 respectively in the lower level (these are all colored purple). The sixth sprite CEILING_FLOOR_PIC_OVERRIDE (HiTag 136) is for the actual floor texture. The LoTag is the picnum value for the texture that you want on the floor (I used 4721). Once you entered this sprite kiss the F5 option goodbye due to a designer error. If you press F5 now the next available tag would show 4722. So, now you have to manually keep track of your next tag values. Enter the following values to the HiTag 136 sprite.
The seventh sprite FLOOR_Z_ADJUST (HiTag 98) keeps the player from falling through the floor. Give this sprite a LoTag of 1. Now, insert four ST1 sprites in each of the light sectors in the upper level as shown in fig. 6a. Give them the same values as you did for the other blue sprites mentioned above.
![]() Fig 6b. Upper level. |
8. As shown in fig. 6b, insert two ST1 sprites each with a HiTag of 111 in the hallway and the archway. Finally, Insert a single ST1 sprite in each of the bench sectors and one in the table sector. Give these sprites a HiTag of 111 and a LoTag of 1. However, have the angle of these sprites point down not up like the rest with a LoTag of 1. Note, that NO ST1 sprites are inserted into the Buddha shelf sector. I placed a blocking wall here (purple line) so the player can not enter this sector. |
![]() Fig 7. Inserting ST1 sprites in lower level. |
9. Enter two ST1 sprites into each sector except for the bench, table, and Buddha sectors.
Give them a HiTag of 110 (VIEW_LEVEL1)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. Next, enter the three (purple) ST1 sprites as shown in fig. 7. The
positioning of these sprites must be the same as their counterparts in the upper level. Give
the top one BOUND_FLOOR_OFFSET (Hitag 203) and The
Lotag must be an odd number for the
non-anchor point (one in our case). Give the other two sprite a HiTag of 120 and LoTags of
2 and 1 (as shown in fig 7). Now, insert a single ST1 sprite in each bench sector, and the
table sector as we did in the upper level. Give them a HiTag of 110 and a LoTag of 1 with
their angle pointing down. Finially, change the main floor area (including the light
sectors) in the upper level to picnum 341 and make them parallaxing (P key in 3D mode). Now,
do the same to the ceiling (upside down floor) in the lower level.
![]() Fig 8a. 3D view in Build. |
10a. Ok, now that all the sprites have been added go to the upper 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. You will not see the floor texture in Build. You will have to load your map in the game to see it. The error I mentioned in number 4 can be seen by going by the hallway. Put yourself in float mode (TAB twice) and press the A key until you can see the floor on the other side of the table. This will not be noticable in the actual game due to the floor texture. Basically, what is happening is you are in a sector which has two VIEW_LEVEL sprites in it looking through the benches and table which only have one VIEW_LEVEL sprite in them.
![]() Fig 8b. Game play view. |
10b. As they say, the Room-Over-Room situation is a Hack job, and these types of problems will arise. Why just the one ST1 sprite in the bench/table area you ask. This allows this ceiling area (bench/table) to be pulled down so it can be seen. Normally, the lower level ceiling is made real high so it can not be seen from the upper level. This is why the two ST1 VIEW_LEVEL sprites are used in the other sectors. So, we can use the single sprites to be able to see the effect that we have designed here. Since we do not allow the player to enter the Buddha shelf no VIEW_LEVEL sprites are needed here. One the other hand, if the player was to be only in the lower level the the single VIEW_LEVEL sprites in the bench/table area would have had the opposite LoTag number (2 in this case). This would allow the floor of the upper lever to be pulled up. Where normally the upper level floor in made (or drawn) real low so the player can not see it from the lower level.
![]() Fig 9a. View in game of a trash can. |
Fig 9b. Same view in 2D mode upper level. |
11. Be careful when placing playable sprite in a reflective room area. If you place in items that the player can pick up, do not place them in the lower level for a reflective look. When the player picks up the item it will still be in the lower level. Fig. 9a shows a trash can and it's reflective counterpart in the lower level. You have two choices here, either make it so it can not be blown apart (and moved), or if it is shot it's counterpart is deleted from the game. We will do the latter here. First insert your sprite in the upper level, and give it a LoTag of 257 TAG_SPRITE_HIT_MATCH (Section 3.2 of SPRITAGS.TXT). Give it a HiTag of 3 (our next tag) and give it the following TAGS: