When I got back from my winter trip in the beginning of January, I was expecting to start on new building types. But every day of 3DWorld development is a third new features, a third going back and reworking the previous feature, and a third fixing random bugs unrelated to either feature set. Sigh. This time was no different. I was sort of in a rush to get malls done before Christmas and left some parts unfinished and broken. I spent the first two-ish weeks of January finishing up malls. This post will cover some of the new additions and improvements I made.
Pet Store Animals and Cages
I showed pet stores with fish tanks and rats in tanks in the last post. Since then I've added spiders, snakes, and birds. I've also added cages constructed from rectangular metal bars.
Spider tanks either have one large spider or several smaller ones. They can climb on the glass inside the tank, as well as the bottom of the lid. If the player steals the tank or removes the lid, this will set the spiders free to roam around the pet store and out into the mall. This is not a wise move in gameplay mode as spiders can bite and poison the player. Spiders are the only animal type that use the same update logic when in a container vs. free. The other animals are removed when the player takes their tank or cage.
Snakes are placed alone in tanks with a half cylinder log to hide under. They're not interactive or animated in any way yet. I don't believe the existing snake animation and movement code would produce acceptable results inside a small enclosure like this.
Rats are now sometimes placed in cages, which is the correct way to house them. Both rat tanks and cages have a wood chips texture on the bottom. Rats walk around inside their enclosures and avoid colliding each other using a simplified version of the update logic I have for regular building rats. These are typically smaller than the rats found out in the open on floors, and I had to adjust their leg animations appropriately.
![]() |
Interior view of a mall pet store with tanks and cages full of spiders, rats, fish, and birds. |
Here is a closeup of some rat cages. They're formed from narrow rectangular shapes, which use fewer vertices/triangles than cylindrical bars. It's still more expensive than drawing cages with an alpha tested texture, so they're only drawn when the player is close to the building.
![]() |
Rat cages in a mall pet store. |
Birds are always placed in cages, which vary in color from white to
black to gold. The birds themselves are a random shade of gray that varies from near white to near black. I placed a single stick through the bars of the cage for
them to stand on. This is the same animated pigeon 3D model that you can see
flying around the city, except that it only uses the idle/standing
animation. I should probably add a food bowl at some point.
![]() |
Bird cages in a mall pet store. |
Shoe Stores
Two different people asked me about adding shoe stores. I originally didn't want to add multiple shoe 3D models due to the time required to find and set them up, plus the cost of loading and drawing them. Eventually I caved in and added shoe stores. Yes, the models do add about another second to the load time, and they somewhat reduce framerate. The worst part is that this introduces a bit of lag when the first mall is generated and it needs to load all of the shoe models to calculate their bounds. Is it worth the cost? Probably - I do like the look of these shoe stores.
I placed rows and columns of short walls with shelves in the central area of the store, and more shelves against the side walls. This is similar to the layout of clothing stores and pet stores, so I can reuse that code. I did make the walls a wood texture rather than white plaster for improved color variety. In the fist pass, I added rows of individual shoes in a line along the shelves, all pointing in the same direction. The shoes were intentionally somewhat sparse to avoid dragging down the framerate with too many models.
![]() |
Initial attempt at a mall shoe store. Note that I've also added cylindrical ducts to some store ceilings. A few of the shoe models seem to have emissive materials for some reason. |
That's nice, but shoes do tend to come in pairs. It was quite a bit of work to properly mirror one shoe to get the opposite one. This inverted the normals and triangle winding order, so I had to add special code to reverse back face culling when drawing a mirrored shoe. I also had to annotate each of the eight shoe models with left vs. right shoe so that the opposite could be properly oriented. I continued to place individual shoes on the wall shelves as these are the display items.
I added shoe boxes to some of the lower shelves. This increases variety, and also improves framerate as these boxes have fewer polygons than shoes, and only a single texture. I only wish I had multiple shoe brand textures to use here. The model is animated to open, but I haven't added support for this yet. Here is an updated screenshot of another shoe store with these changes.
![]() |
Updated shoe store with shoe boxes on lower shelves and pairs of shoes on upper shelves. |
Clothing Store Mirrors
It's always fun to add mirror reflections to scenes. I do have a few mirrors in the current malls, specifically in restrooms and in bedrooms sets of furniture stores. Mirrors definitely increase frame time since the scene must be drawn twice. However, if I make them small and narrow, I can cull out most of the scene geometry which isn't visible in the reflection.
I added person height mirrors to the back walls of some clothing stores, at the end of an aisle. I suppose this may reduce the chance of a zombie sneaking up on the player. Maybe at some point later I'll add proper changing rooms. Here is an example mirror.
![]() |
Clothing store mirror where the player is visible. No, you can't try on clothes (yet). |
Furniture and Appliance Store Additions
I got some feedback on furniture and appliance stores, which led me to add more items. Furniture stores now have lamps and potted plants. In addition, I changed some of the placement rules to avoid blocking doors and clipping through walls. Here is an updated view of a furniture store.
![]() |
Furniture store, now with plants added to living room sets. |
Appliance stores now have furnaces and water heaters. I'm not sure these actually belong in a mall appliance store, but it was easy to add these existing items. I also changed the object movement logic to allow the player to push and pull these appliances and plumbing fixtures. This was needed because I found it was occasionally possible to get stuck between objects. It would be fun to add some sort of player object pushing maze/puzzle to these rooms!
Round Support Pillars
I saw a post made by another developer that included a modeled shopping mall. This one had round/cylindrical pillars rather than my square/rectangular pillars, which seemed like a good addition to make. Now 50% of malls have round pillars holding up the walkways. I actually prefer these over the square pillars, so maybe I should add them more than 50% of the time. Here is an example.
![]() |
Some malls, like this one, now have round/cylindrical support pillars. Shiny! |
Food Court Recycling Bins
Someone suggested adding food court recycling bins, so I did this. Now some of the trashcans near food courts are blue recycling bins rather than silver or brown trashcans. This applies to both the round and square variants. I had to place some of them next to stairs and escalators so that I had enough placement spots for both trashcans and recycling bins.
Interactive Store Gates
It's no fun when stores are closed. I changed the store gates to be dynamic and player controlled with up/down buttons next to the gate on the inside of the store. If the gate starts closed, the player can usually still access the store through the back hallway and enter to raise the gate. This is a good way to escape from a pursuing zombie, since they can't use these buttons. And if you're fast enough, the button can be pressed with enough time to get under the door before it closes, locking a zombie inside. This is only a temporary solution though, because zombies can also use the back hallway to escape the store. It just takes them a long time to walk around and get back into the main mall concourse.
Mall Skylights
Malls seem disconnected from the rest of the world because there are no windows. So far I haven't found a way to make windows work correctly and efficiently, in particular due to the alpha blending problems when looking through multiple layers of glass. So all of the malls have been placed underground. I did eventually add skylights in the mall ceilings in cities though. I haven't yet found a way to extend this to non-city buildings, where the ground may be uneven or far above the mall ceiling.
Skylights are cut into both the mall ceiling and the city pavement above, similar to how mall access elevators were added. This can only be done when the area above is open rather than a building or road. Then when the smaller city objects such as benches are placed, areas over skylights are marked as blocked. The player can see through them in both directions. The city, terrain, and sky above are visible from the mall below. I did disable drawing of cars and pedestrians in this case for performance reasons, though they're usually not visible from such a steep angle anyway.
![]() |
Mall skylight, viewed from inside the mall looking up into the city above. |
The player can look into the mall from the city above as well, and even walk over the skylight. It's not perfect. Some of the smaller objects (including people) aren't drawn, and shadows may not be correct. If you look closely you can also see that there are some trees in the city above, but their roots don't extend into the mall below. I attempted to mitigate this problem by moving trees away from skylights, since they're placed later in the control flow.
![]() |
Standing on the city sidewalk and looking down though the skylight at a mall below. |
Building AI Navigation
Finally, I fixed several problems with AI navigation/path finding in malls. In particular, they can now enter and exit malls through the adjacent parking garage door. However, this only works when the mall and parking garage are at the same floor levels. This was previously never the case, but now the placement code will attempt to adjust the depth of the mall so that it can align with the floor of parking garages that are at least two levels tall (since mall levels are 2x normal building levels). AI people can't pass when the parking garage and mall are at different heights because I haven't gotten path finding to work on the odd fan-shaped stairs that lead up to the door on the mall side.
Building AIs can also now use the back hallway stairs and elevators. These were more difficult to handle because they span/connect alternating floors rather than tightly packed adjacent floors that normal stairs and elevators connect to. (Remember, mall floors are spaced two normal floors apart, while back hallways are only one normal floor height tall.) The stairs require walking back and forth four times total within the rectangular enclosed space to move one floor up or down. This logic is hard-coded into the AI path finding system.
The third addition was to allow zombies to use escalators when chasing the player in malls. The escalator code had originally only been made to work with retail escalators that connected the ground floor to an upper glass floor. Now escalators can be arbitrary lengths and the AI path finding code can handle this. The path length estimate code isn't very accurate when stairs and escalators are involved, so they may not take the shortest path. I think this is acceptable because it makes zombies less predictable, and they will often converge on the player along different paths.
Future Work
The next type of building I'm working on is a factory, or possibly something like a warehouse or chemical plant. I'm pretty far along in development already. I've added some basic machines, ladders, catwalks, fire sprinklers, and assorted floor clutter items. I'll have more of an update on this later. I'm sure it will take a long time to complete, though probably less than half the time it took me to implement malls. Every new feature can reuse more of the existing code...