! People Don't Talk Like That
! a GxScript demonstration by Brendan Barnwell
!
! Please contact me with questions/comments/etc. at [email protected]
!
! Development log
!       Date            What the dilly-o
!       2001/04/17      Began!
!

Constant Story "People Don't Talk Like That";
Constant Headline "^a GxScript demonstration by Brendan Barnwell^(Please send questions/comments/etc. to <e>BrenBarn@@64aol.com</e>)^";

Include "Parser";

Include "Entry";

! Entry stuff
       Enterer Game;
       EnterInitialise -> GameInitialize
with execute [;
location=StartingRoom;
"^^^~This will be nice,~ you think to yourself.  ~A relaxing evening with Leonard and Laura.~^";
];

Include "OKBGlulx";
Include "OKBStyle";
Include "OKBLib";       ! Small library that defines Room and Thing classes

Include "Verblib";
Include "Grammar";

Include "GxScript";

       Room StartingRoom "An Unremarkable Room"
with name 'unremarkable',
description "This room is thoroughly unremarkable.  There's an exit to the south.",
s_to OtherRoom;

! This object is affected by one of Leonard's lines of dialogue
       Thing -> Device "strange device"
with name 'device' 'strange',
description [;
if (self hasnt general) "That's one funky-looking device.";
else "Whoa, it's a three-headed monkey.";
];

       Room OtherRoom "Another Unremarkable Room"
with name 'unremarkable',
description "Just as unremarkable as the first room (which is back to the north).",
n_to StartingRoom;

! This device affects conversation with the alien
       Thing -> LanguageButton "button"
with name 'button',
description "It's a button.  Hmmm. . .",
before [;
Push:
       if (Alien.node()~=AlienEnglish) {
Alien.choosenode(AlienEnglish); "Hmmm. . .";
       }
       else {
Alien.choosenode(Alien); "Hrm.";
       }
];

       Man Leonard "Leonard" StartingRoom
with name 'Leonard' 'Leon' 'Leo' 'Lenny',
description "It's your ol' buddy Leonard.",
color [; return $0000FF; ],                     ! Colors set to blue on cyan
bgcolor [; return $00FFFF; ],
forget [;                                       ! This forget routine "erases" Leonard's
       if (self.lastheard>4) {         ! memory if you don't talk to him for 5 turns
self.lastheard=0;                               ! Be sure to reset lastheard!
self.reset(); self.choosenode(self);
       }
];

! A standard line of dialogue
       NLine ->-> LeonardLeonard "~Let's talk about you.~"
with content "~Let's talk about you,~ you say to Leonard.^
~Sure,~ says Leonard.";

! This line of dialogue sends the conversation back to the beginning
       RLine ->->-> LeonardMemory "~How's your memory these days, Leonard?~"
with
newnode Leonard,
content "~How's your memory these days, Leonard?~ you ask.^
~Not so hot,~ he replies ruefully.  ~For example, if you were, to, say, not talk to me for 5 turns, I'd forget this conversation ever happened (hint, hint).~";

! This line says one thing if you've asked Leonard about his hearing, and
! something different if you haven't.  Conversation is also redirected
! differently depending on whether you've asked about his hearing.
       NLine ->->-> LeonardLame "~You're lame, Leonard.~"
with
content [; print "~You're lame, Leonard~ you say cruelly.^";
if (LeonardHearing.active) "~Shut up,~ Leonard says.";
else "There is no reply.";
],
after [;
if (LeonardHearing.active) rfalse;
else Leonard.choosenode();
];

! This line kills the player if he says it
       NLine ->->->-> LeonardNoShutUp "~No, I won't shut up.~"
with content "~No,~ you taunt, ~I <e>won't</e> shut up!~^
~<a>EEEAGH</a>!~ Leonard screams, and attacks you in a frenzy.",
after [; deadflag=1; ];

! This line makes the player win if he says it
       NLine ->->->-> LeonardOKShutUp "~OK, I'll shut up.~"
with content "~OK,~ you say.  ~I'll shut up.~^
~Yay!~ says Leonard.  ~You're my best friend now!~",
after [; deadflag=2; ];

! This line adopts LeonardLame
       NLine ->->-> LeonardHearing "~How's your hearing these days, Leonard?~"
with adopting LeonardLame,
content "~How's you hearing these days, Leonard?~ you say.  ~Leonard?~";

! This line shares the children of LeonardLame
       NLine ->->->-> LeonardHello "~Hello in there!~"
with sharing LeonardLame,
content "~<e>Hello in there</e>!~ you scream into Leonard's ear.^
Leonard jumps in surprise and gives you an angry look.  ~Knock it off,~ he says.  ~Shut up.~";

! This line sends a message to Laura
       NLine ->->->-> LeonardDig "~Dig Leonard -- he's deaf!~"
with content "~Dig Leonard,~ you say, ~he's deaf!~",
after [; Laura.LeonardIsDeaf(); ];

! A normal line of dialogue
       NLine ->-> LeonardRoom "~Let's talk about this place you got here, Leonard.~"
with content "~Let's talk about this place you got here, Leonard,~ you suggest.^
~Sure thing,~ says Leonard.";

! This line redirects the conversation back to talking about the room
! Also note that this line is persistent -- it can be chosen more than once
       RLine ->->-> LeonardRoomUnremarkable "~This room is pretty unremarkable.~"
with newnode LeonardRoom,
content "~This room is pretty unremarkable,~ you remark.^
~Yeah, I guess.~";

! This line affects another object in the room (the strange device)
! It also redirects conversation back to the beginning
       RLine ->->-> LeonardDevice "~That's quite an interesting device you've got there.~"
with newnode Leonard,
content "~That's quite an interesting device you've got there,~ you say.^
~Not only that,~ says Leonard mysteriously, ~I have telepathic control over it.  Look at it again.~",
after [;
if (Device hasnt general) give Device general;
else give Device ~general;
];

! This line switches the conversation to another NPC
       NLine ->-> LeonardLaura "~How's Laura doing?~"
with content "~How's Laura doing?~ you ask.^
~Talk to her yourself,~ Leonard says.",
after [;
Laura.choosenode();
<<SwitchConversation Laura>>;
];

! This line uses a before property to "intercept" the player's words
       NLine ->-> LeonardImportant "~I have something of vital importance to tell you.~"
with before [;
deadflag=1;
"Before you can say anything, a meteor strikes the earth!";
],
content [; "Leonard is struck down."; ];

       Woman Laura "Laura" StartingRoom
with name 'Laura',
description "It's your old compadre Laura.",
color [; return $000000; ],                     ! Set colors to black on gray
bgcolor [; return $CCCCCC; ],
forget [;
! This forget routine causes Laura to break into the conversation if you don't
! talk to her for 5 turns
       if (self.lastheard>4 && self in location) {
! This is important!  If you don't reset lastheard, this routine will be called repeatedly
self.lastheard=0;
print "~Hey!~ Laura says.  ~You were talking to <e>me</e>!~^";
<<SwitchConversation Laura>>;
       }
],
LeonardIsDeaf [;
"~Haw haw haw!~ Laura chortles.  ~He sure is!~^";
];

! This line redirects conversation back to the beginning, but, unlike the
! RLine in Leonard, it is not persistent
       RLine ->-> LauraLaura "~How are you, Laura?~"
with newnode Laura,
content "~How are you, Laura,~ you ask.^
~Fine,~ she snaps.",
after [; self.deactivate(); ];          ! It is important to return false here

       NonHuman Alien "bizarre-looking alien" OtherRoom
with name 'alien' 'bizarre' 'looking' 'bizarre-looking' 'form' 'life' 'life-form' 'strange',
description "A strange life form from some other world.",
color [; return $FFFFFF; ],                     ! Set colors to white on green
bgcolor [; return $00CC00; ];
! No forget routine means "elephant" memory

       RLine ->-> AlienPeace "~I come in peace.~"
with newnode Alien,
content "~I come in peace,~ you say cautiously.^
~Bza$%rk *<e>K</e>lo<e>&</e>~ the thing replies.";

! This Holder will become the current node if the player pushes the button
       Holder ->-> AlienEnglish;

! This line kills the player if he chooses it
       NLine ->->-> AlienInsult "~You suck!~"
with content "~You suck!~ you say, taunting the alien.^
~Oh, yeah?~ he says.  Somehow you can understand him -- and apparently, vice versa.  He pulls out a ray gun and vaporizes you.",
after [; deadflag=1; ];