!--------------------------------------------------------------------------
! QUESTION: How can I put a compass rose on the statusline, showing the
! available exits?
! 
! This solution was proposed by Joachim Baumann (21 November 1994).  It
! suffers from a few problems: first, long location names overwrite the
! compass rose; second, it's a bit of a space hog on machines with small
! screens; third, it seems to run quite slowly (certainly, the update is
! noticeable).  The first problem is easy to sort out; the second can be
! solved by providing an option to turn it on and off; the speed can
! probably be improved by writing the compass rose information to three
! strings and changing it only when the location changes.
!--------------------------------------------------------------------------

Switches v5;
Constant Story "COMPASS ROSE";
Constant Headline "^An interactive demonstration^by Joachim Baumann^";

Replace DrawStatusLine;
Include "parser";
Include "verblib";
Include "grammar";

! The following constants describe the positions of the different parts of
! the windrose.
Constant U_POS 28;
Constant W_POS 30;
Constant C_POS 31;
Constant E_POS 32;
Constant IN_POS 34;

[ DrawStatusLine i;
    ! Switch to status window and reverse it.
    @split_window 3; @set_window 1; style reverse; font off;
    @set_cursor 1 1; spaces (0->33)-1;
    @set_cursor 2 1; spaces (0->33)-1;
    @set_cursor 3 1; spaces (0->33)-1;
    
    ! Now the original DrawStatusLine routine.
    @set_cursor 1 2;  print (name) location;
    if ((0->1)&2 == 0) {   
        @set_cursor 1 51; print "Score: ", sline1;
        @set_cursor 1 64; print "Moves: ", sline2;
    }
    else {   
        @set_cursor 1 51; print "Time: ";
        i = sline1 % 12; if (i < 10) print " ";
        if (i == 0) i = 12;
        print i, ":";
        if (sline2 < 10) print "0";
        print sline2;
        if ((sline1/12) > 0) print " pm"; else print " am";
    }

    ! And now print the directions of the location (if not dark).  This is
    ! the interesting part (for me at least).
    if (location ~= thedark) {
        ! First line
        if (location.u_to ~= 0)  { @set_cursor 1 U_POS; print "U"; }
        if (location.nw_to ~= 0) { @set_cursor 1 W_POS; print "@@92"; }
        if (location.n_to ~= 0)  { @set_cursor 1 C_POS; print "|"; }
        if (location.ne_to ~= 0) { @set_cursor 1 E_POS; print "/"; }
        if (location.in_to ~= 0) { @set_cursor 1 IN_POS; print "I"; }

        ! Second line
        if (location.w_to ~= 0)  { @set_cursor 2 W_POS; print "-"; }
                                   @set_cursor 2 C_POS; print "o";
        if (location.e_to ~= 0)  { @set_cursor 2 E_POS; print "-"; }

        ! Third line
        if (location.d_to ~= 0)  { @set_cursor 3 U_POS; print "D"; }
        if (location.sw_to ~= 0) { @set_cursor 3 W_POS; print "/"; }
        if (location.s_to ~= 0)  { @set_cursor 3 C_POS; print "|"; }
        if (location.se_to ~= 0) { @set_cursor 3 E_POS; print "@@92"; }
        if (location.out_to ~= 0){ @set_cursor 3 IN_POS; print "O"; }
    }

    ! switch to main window 
    @set_cursor 1 1; style roman; @set_window 0; font on;
];

Object  Room "Room"
 has    light
 with   description "This is a bare room, with exits in many \
            directions. To open or close an exit, type for example \
            ~sesame north~.",
        n_to Room, ne_to Room, e_to Room, se_to Room, s_to Room,
        sw_to Room, w_to Room, nw_to Room, u_to Room, d_to Room,
        in_to Room, out_to Room,
        before [ i;
         Sesame:
            if (noun notin Compass) rfalse;
            i = noun.door_dir;
            if (self.i == 0) self.i = self;
            else self.i = 0;
            "Your surroundings have subtly changed.";
        ];

[ Initialise;
    location = Room;
    "^^^^Welcome to the demonstration...^";
];

[ SesameSub; "Nothing happens."; ];
[ SesameInSub; <<Sesame in_obj>>; ];
[ SesameOutSub; <<Sesame out_obj>>; ];

Verb "sesame"
    * noun -> Sesame
    * "in" -> SesameIn
    * "out" -> SesameOut;

End;