[Previous]   [Next]

Chapter 4 - Moving Around

Moving Around

The next step is to expand the map to a few more locations (rooms) so we can start moving around. We'll begin by adding the other three locations that feature in the original Adventures of Heidi. We have already covered most of what we need to know in order to do this. Add the following code to the end of the existing program. An explanation of new features follows.

forest : OutdoorRoom 'Deep in the Forest'
   "Through the deep foliage you glimpse a building to the west.
    A track leads to the northeast, and a path leads south. "
    west = outsideCottage
    northeast = clearing  

clearing : OutdoorRoom 'Clearing'    
   "A tall sycamore tree stands in the middle of this clearing.
    One path winds to the southwest, and another to the north. "
    southwest = forest
    up = topOfTree
    north : FakeConnector {"You decide against going that way right
         now. "}

+ tree : Fixture 'tall sycamore tree' 'tree'
    "Standing proud in the middle of the clearing, the stout
     tree looks like it should be easy to climb. "   

topOfTree : OutdoorRoom 'At the top of the tree'
   "You cling precariously to the trunk, next to a firm, narrow
    branch. "
    down = clearing
The room definitions and the definition of the tree object should need little explanation. The important new concept that has been introduced here is that of a travel connector. A travel connector is an object that controls what happens if an actor attempts to travel via it. To define what happens when an actor tries to move in a certain direction we must attach a travel connector to the appropriate direction property. For example, to define what happens when the player character is in the forest and the player types west we attach the connector called outsideCottage to the west property of forest. You may object that outsideCottage is simply a room, the room we started by defining; but Rooms are in fact a special kind of TravelConnector, connectors that point to themselves as destination. Traveling via a Room thus means traveling to that Room. So if we want movement to take place directly from one room to another, we simply set the appropriate direction property to the destination room. Note that unlike TADS 2, in TADS 3 the direction properties northwest, northeast, southwest, and southeast must be spelled out in full; the other direction properties you will commonly use are north, south, east, west, up, down, in and out.

You have probably noticed that the north property from the clearing uses a different kind of connector, a FakeConnector. A FakeConnector is what it sounds like, a connector that only appears to go somewhere. An attempt to travel via a FakeConnector results in its travelDesc message being displayed without any travel actually taking place. One use of a FakeConnector might be to create 'soft boundaries' to your map, to make it look as if it extends further than it really does. But in this case we're using a FakeConnector because the room description mentions a path to the north, which we shall eventually want to implement, but do not wish to implement yet.

The code using this connector would have looked more like that using rooms as connectors if we had defined the FakeConnector as a separate object thus:
fakePath : FakeConnector
   travelDesc = "You decide against going that way right
         now. "

The clearing would then be defined with
north = fakePath  
What we in fact did was to make fakePath both an anonymous object and a nested object (all nested objects are in fact anonymous, though the reverse is not true). A nested object is simply an object whose definition is nested inside another object definition. In this case the definition of the FakeConnector is nested within the definition of the clearing. The definition of a nested object must be enclosed within braces (and not terminated with a semicolon). FakeConnector uses a template for which a double-quoted string is its travelDesc property (the message that displays when one tries to travel via that connector). The definition of the north property of clearing is thus a convenient shorthand way of saying 'travel north from here is via an anonymous object of class FakeConnector whose travelDesc property is "You decide against going that way right now. " Although this FakeConnector has no name of its own, it can be referred to as clearing.north, i.e. the value of the north property of the clearing object. Since this kind of shortcut definition is exceedingly common in TADS 3 it is worth introducing at this early stage. We shall meet several more examples as we go on to develop the game.

If you compile and run the game as it is it will look as if nothing has changed from the previous chapter; the new rooms we have added won't appear. The reason for this (which you've probably guessed already) is that we haven't added a connector out of the original
outsideCottage room (a bug waiting to happen when adding more rooms to an already complex map). This is easy enough to put right; just add the following to the definition of outsideCottage, between the room description and the terminating semicolon:
east = forest  
The game should now work as expected.

Getting Started in TADS 3
[Previous]   [Next]