Imagine a road running north and south. It is divided in several places into “rooms”, and the player consistently moves between them with >NORTH
and >SOUTH
.
Almost everywhere each “slice” of road is precisely one room—there’s no >EAST
, >WEST
, >IN
, or >OUT
to any of the road locations.
And then there’s a “wide spot” in the road. Say the road passes through a town, so now we have stuff to the east and west, shops maybe.
First approximation, maybe we just attach the shops directly to the road. But now let us imagine that we have to implement the sidewalks in front of the shops as a navigable location. Is there a particularly clever way to implement this particular map topology?
One “orthodox” IF solution, which uses only canonical map directions and simple connections/topology is to just “stack” the sidewalks between the road and the shops. So now we have something like (from west to east): west shop; west sidewalk; road; east sidewalk; east shop. Movement north from either sidewalk or the road takes you to the single road location directly north of the “wide spot” and moving south from there would take you to the middle location. This is simple, fairly straighforward, and the main objection is that it feels a little clumsy and cluttered.
Another orthodoxy solution, I think less elegant, is more or less the same as above, only using four locations instead of five: west shop; west side of road; east side of road; east shop. Movement from either road location north takes you to the road just north of the wide spot, and moving south from there is either not possible (the player has to use southeast or southwest) or prompts the player for disambiguation (do you want to use the east sidewalk or the west sidewalk). This eliminates some of the clutter but makes navigation less intuitive and disrupts the “feel” of being a north-south road.
Leaving these aside, there are a variety of “non-euclidean” solutions: entering the wide spot from the north takes you to a “middle of the road” location; moving east from there takes you to the east sidewalk; moving west from the east sidewalk takes you to the west sidewalk (skipping the middle of the road location) or something similar. In “real” terms this is probably more intuitive (if you’re crossing a real street you probably think of it as moving from one side to the other, with stopping in the middle not a serious possibility in most circumstances). But it’s also counterintuitive in terms of normal rules of IF navigation. And mapping—as a player, I’d probably find this sort of situation vaguely irritating.
I’m writing in TADS3/adv3, and the contrib module ConSpace
offers the ability to define fairly complex room nesting behaviors. This smooths some of the sharp corners off the situation, but I’m not sure if it’s something players would still find jarring. A simple example (in TADS3) with code:
#charset "us-ascii"
#include <adv3.h>
#include <en_us.h>
roadGroup: SpaceConnector;
roadGroupNorth: roadGroup;
roadGroupSouth: roadGroup;
class RoadRoom: Room
connectionGroup = [ roadGroup ]
actorInPrep = 'on'
actorIntoPrep() {
if(gActor.locationBefore.getOutermostRoom.ofKind(RoadRoom))
return('over to');
else
return('onto');
}
;
class RoadRoomNorth: RoadRoom
connectionGroup = [ roadGroupNorth ]
north = northRoad
east = northeastSidewalk
west = northwestSidewalk
;
class RoadRoomSouth: Room
connectionGroup = [ roadGroupSouth ]
south = southRoad
east = southeastSidewalk
west = southwestSidewalk
;
// North part of downtown
northRoadMain: RoadRoomNorth 'North End Of Downtown' 'north end of downtown' 'middle of the road'
"This is a road running north and south. The road is flanked to
the east and west by shops. "
south = southRoadMain
;
+me: Person;
+pebble: Thing 'small round pebble' 'pebble'
"A small, round pebble. "
;
northeastSidewalk: RoadRoomNorth 'Northeast Sidewalk'
"This is the sidewalk to the east of the road. The Northeast Shop is
just to the east, and the Northwest Shop is across the road to the
west. "
south = southeastSidewalk
west = northwestSidewalk
east = northeastShop
;
northwestSidewalk: RoadRoomNorth 'Northwest Sidewalk'
"This is the sidewalk to the west of the road. The Northwest Shop is
just west of here, and the Northeast Shop is off to the east, across
the road. "
south = southwestSidewalk
east = northeastSidewalk
west = northwestShop
;
northeastShop: Room 'Northeast Shop'
"This is the Northeast Shop. The only exit is to the west. "
west = northeastSidewalk
;
northwestShop: Room 'Northwest Shop'
"This is the Northwest Shop. A doorway east opens onto the sidewalk. "
east = northwestSidewalk
;
// South part of downtown
southRoadMain: RoadRoomSouth 'South End Of Downtown' 'south end of downtown' 'middle of the road'
"This is a road running north and south. The road is flanked to
the east and west by shops. "
north = northRoadMain
;
southeastSidewalk: RoadRoomSouth 'Southeast Sidewalk'
"This is the sidewalk to the east of the road. The Southeast Shop is
just to the east, and the Southwest Shop is across the road to the
west. "
north = northeastSidewalk
west = southwestSidewalk
east = southeastShop
;
southwestSidewalk: RoadRoomSouth 'Southwest Sidewalk'
"This is the sidewalk to the west of the road. The Southwest Shop is
just west of here, and the Southeast Shop is off to the east, across
the road. "
north = northwestSidewalk
east = southeastSidewalk
west = southwestShop
;
southeastShop: Room 'Southeast Shop'
"This is the Southeast Shop. The only exit is to the west. "
west = southeastSidewalk
;
southwestShop: Room 'Southwest Shop'
"This is the Southwest Shop. A doorway east opens onto the sidewalk. "
east = southwestSidewalk
;
// Outside of downtown
northRoad: Room 'North Road'
"This is the north road. Everything interesting is south of here. "
south = northRoadMain
;
southRoad: Room 'South Road'
"This is the south road. Downtown, such as it is, lies to the north. "
north = southRoadMain
;
versionInfo: GameID
name = 'sample'
byline = 'nobody'
authorEmail = 'nobody <foo@bar.com>'
desc = '[This space intentionally left blank]'
version = '1.0'
IFID = '12345'
;
gameMain: GameMainDef
initialPlayerChar = me
;
This gives us a short north-south road and two “slices” of road that are “wide”, having sidewalks and shops alongside the road. A transcript that illustrates the topology:
North End Of Downtown
This is a road running north and south. The road is flanked to the east and
west by shops.
You see a pebble here.
>e
You walk over to the northeast sidewalk.
>l
Northeast Sidewalk
This is the sidewalk to the east of the road. The Northeast Shop is just to
the east, and the Northwest Shop is across the road to the west.
On the middle of the road, you see a pebble.
>e
Northeast Shop
This is the Northeast Shop. The only exit is to the west.
>w
Northeast Sidewalk
This is the sidewalk to the east of the road. The Northeast Shop is just to
the east, and the Northwest Shop is across the road to the west.
On the middle of the road, you see a pebble.
>w
You walk over to the northwest sidewalk.
>l
Northwest Sidewalk
This is the sidewalk to the west of the road. The Northwest Shop is just west
of here, and the Northeast Shop is off to the east, across the road.
On the middle of the road, you see a pebble.
>w
Northwest Shop
This is the Northwest Shop. A doorway east opens onto the sidewalk.
>e
Northwest Sidewalk
This is the sidewalk to the west of the road. The Northwest Shop is just west
of here, and the Northeast Shop is off to the east, across the road.
On the middle of the road, you see a pebble.
>s
Southwest Sidewalk
This is the sidewalk to the west of the road. The Southwest Shop is just west
of here, and the Southeast Shop is off to the east, across the road.
>n
Northwest Sidewalk
This is the sidewalk to the west of the road. The Northwest Shop is just west
of here, and the Northeast Shop is off to the east, across the road.
On the middle of the road, you see a pebble.
>s
Southwest Sidewalk
This is the sidewalk to the west of the road. The Southwest Shop is just west
of here, and the Southeast Shop is off to the east, across the road.
>s
South Road
This is the south road. Downtown, such as it is, lies to the north.
>n
South End Of Downtown
This is a road running north and south. The road is flanked to the east and
west by shops.
>n
North End Of Downtown
This is a road running north and south. The road is flanked to the east and
west by shops.
You see a pebble here.
>n
North Road
This is the north road. Everything interesting is south of here.
>s
North End Of Downtown
This is a road running north and south. The road is flanked to the east and
west by shops.
You see a pebble here.
>e
You walk over to the northeast sidewalk.
>s
Southeast Sidewalk
This is the sidewalk to the east of the road. The Southeast Shop is just to
the east, and the Southwest Shop is across the road to the west.
>w
You walk into the southwest sidewalk.
>s
South Road
This is the south road. Downtown, such as it is, lies to the north.
This works, but is to too confusing? Are the examples of this sort of thing being implemented more cleanly/organically/popularly that I’m missing?
Basically the “everything is a square box” approach is mechanically simplest and least confusing (in the sense that it’s the thing that anyone who has ever played any IF would recognize)…but it feels the most cluttered (more moves to cross the road every time) and least “organic” (it’s a bunch of boxes and it “feels” like a bunch of boxes).
Things like the ConSpace
example “feel” the most like a “real” space and map reasonably well to what real-world navigation “feels” like (we cross the road to get to the other side, not to reach a waypoint in the middle of the road and thence make a further decision to proceed). But it’s also the least “IF intuitive” (that is, least like “standard” navigation) and potentially more of an irritation to map.