! Hints An Inform 6 library by L. Ross Raszewski ! Version 2 To produce nicely formatted hints. ! Upgraded and made easier to use ! ! REQUIRES DoMenu.H, Center.H, and AltMenu.H ! ! New in this version: The hint may now be in the short_name rather than the ! descriptionof the hint. I don't know what I was thinking. ! Multilingual support. ! The hints left descriptor has been moved to the function HintIdent, which ! you may replace if you so desire. Hintident is called with three ! arguments, x - set to 1 before the hint is printed, 2 after. ! i - the number of hints left ! j - the total number of hints ! ! The hint_menu no longer needs to be called hint_menu. in fact, it can't, ! unless it's defined before inclusion. Instead, set the global hint_menu ! equal to your hint menu. ! Predefine Helpsub to change its message. ! define NO_GRAMMAR to prevent the grammar from being included. ! ! Upon reflection, the older version of this library was clumsy and inflexible ! This system is well suited to adaptive hints and other wonderful things. ! Grammar - ! The verb "Hint" ("Help") calls up the hint menu, which should begin with an ! AltMenu Menu object called hint_menu. (The first time, you are given the ! option to disable the hints.) ! The children of hint_menu should be the top level hints or categories, and ! so on etc until you reach the actual hints. The hint categories are ! objects of the class "HintTopic", whose short names are the names of the ! hints. The children of a HintTopic are of class Hint. Their descriptions ! contain the actual hints, which are displayed in order. ! Example hierarchy (This is NOT code, it's more a sort of tree): ! Menu hint_menu ! Menu "Prologue" ! HintTopic "What do I do here?" ! Hint with desc. "Look around." ! Hint w/d "Move around." ! Menu "Part 1" ! HintTopic "Who am I?" ! Hint w/d "You are Perry Simm" ! HintTopic "What Do I do?" ! Hint w/d "Not a lot" ! Hint w/d "Nothing at all" ! Hint w/d "because this ain't a real game" ! ! The player sees the menu titled whatever you choose to call the hint_menu, ! on which an option is Prologue. Under prologue is the option ! "What do I do here?" Selecting that will display "Look Around". If the ! player asks for another hint, he gets it. if not, revealed hints are ! re-reveled when he reenters the menu. That is, if the player had read ! the first two hints under "What do I do", then went back to the game, he ! could at any time go back to the hint menu, navigate to "What do I do" ! and would automatically have the first two hints displayed. ! HINT_STYLE must be defined before inclusion (or else it defaults to 0) ! if it's 0, then the hint is displayed thus: ! Not a lot (2 left) ! if it's 1, you get: ! Not a lot [1/4] ! if it's 2, you get: ! [3 hints left]-> Not a lot ! [2 hints left]-> ! (Note that when it's 2, you don't get the first hint when you first ! enter a topic; you get [x hints left]-> ) ! ! You can move the hintTopics about, or even do wretched things to ! their children. (I wouldn't, but you can) In an adaptive hint system, ! you could nove the appropriate HintTopic (with its children already inside) ! into the hint_menu when you want the hint available. ! ! The title_bar property of a HintTopic specifies the top line of the hint ! status line. It defaults to "InvisiHints" I've included WaitForKey(); ! in case you don't have it already. ! ! Questions, comments, rude suggestions? I'm at rraszews@skipjack.bluecrab.org System_file; #ifndef hint_menu; global hint_menu; #endif; #IFNDEF LASTH__TX; Constant LASTH__TX = "^^^[That's All Folks!]^"; #ENDIF; #IFNDEF HINTD__TX; Constant HINTD__TX = "HINTS disabled."; #ENDIF; #IFNDEF WaitForKey; [ WaitForKey str i; if (str==0) str="(Please Press Any Key)"; print (string) str; @read_char 1 0 0 i; ]; #EndIf; [ HintIdent x i j; switch(x){ 1: if (HINT_STYLE==2) { print "[",i, " hint"; if (i>1) print "s"; print " left]-> "; return 1;} 2: if (HINT_STYLE==1) { j=children(self)-i; print " [",j,"/",j+i,"]"; }; if (HINT_STYLE==0) { print " (", i, " hint"; if (i>1) print "s"; print " left.)"; } } return 0; ]; #IFNDEF Helpsub; [ HelpSub; if (hint_menu hasnt general) {print "[Warning: It is recognized that the temptation for help \ may at times be so exceedingly strong that you might fetch hints \ prematurely. Therefore, you may at any time during the story type \ HINTS OFF, and this will disallow the seeking out of help for the \ present session of the story. If you still want a hint now, indicate \ HINT.]"; give hint_menu general; rtrue;} if (hint_menu has locked) print_ret "Hints have been disabled."; hint_menu.select(); ]; #ENDIF; [ HelpOffSub; print (string) HINTD__TX; give hint_menu locked; rtrue; ]; #ifndef HINT_STYLE; Constant HINT_STYLE 0; #ENDIF; Class HintTopic class Option, with printsn [; print (name) self;], number 0, title_bar "InvisiHints", select [ o i j; if (pretty_flag==0) { self.title_bar(); self.printsn(); print "^Press ENTER for another hint, Q to return to the menu."; jump disph; } @erase_window -1; @split_window 3; @set_window 1; i=0->33; if (i==0) i=80; @set_cursor 1 1; style reverse; spaces(i); CenterU(self.title_bar,1); @set_cursor 2 1; spaces (i); style bold; CenterU(self.printsn,2); style roman; style reverse; @set_cursor 3 1; spaces(i); @set_cursor 3 2; print "RETURN = read hint"; j=i-17; @set_cursor 3 j; print "Q = previous menu"; style roman; font off; @set_window 0; .disph; print "^^^^^"; i=0; objectloop (o in self) { if (o has general) { o.GiveHint(); new_line; i++;} } i=children(self)-i; if (i==0) { WaitForKey(LASTH__TX); return 2;} for (o=child(self):o has general:o=sibling(o)); do { if (HintIdent(1,i,j)==1) { do { @read_char 1 0 0 j; } until (j == 'Q' or 'q' or 27 or 10 or 13 or 132); if (j== 'Q' or 'q' or 27) return 2; if (j== 10 or 13 or 132) o.GiveHint(); i--; jump loopover; } o.GiveHint(); i--; if (i==0) jump loopover; HintIdent(2,i,j); do { @read_char 1 0 0 j; } until (j == 'Q' or 'q' or 27 or 10 or 13 or 132); if (j== 'Q' or 'q' or 27) { give o ~general; return 2;} .loopover; o=sibling(o); new_line; } until (i==0); WaitForKey(LASTH__TX); return 2; ]; Class Hint with GiveHint [; if (self provides description) PrintOrRun(self,description,1); else print (name) self; give self general;]; #IFNDEF NO_GRAMMAR; Verb meta "Help" "Hint" "hints" "clues" "clue" * "off" ->HelpOff * ->Help; #ENDIF;