Constant Story "Bloodline"; Constant Headline "^An Interactive Coming-of-age^Copyright (c) 1998 by Liza Daly.^First time players should type ~about.~^^"; Include "parser"; Include "verblib"; ! Properties !Property follow_dir 0; Property treasure_number; Property player_number; Property start_treasures; Constant total_players 3; Global num_moves = 25; ! Attributes Attribute rollable; ! Class definitions Class Human has animate proper; Class Clothes with before [; Disrobe, Drop, ThrowAt: "As if! You're only 13!"; ]; Class Treasure with before [; Take, Drop: "Patience. You can only take or lose the treasures as the game proceeds."; Examine: print_ret "One of the ten game treasures. It looks just like a small plastic replica of ", (a) self, "."; ], list_together "~treasures~"; Class Piece with before[; Take: "You can't remove the pieces from the board while the game is in play!"; Push: "That's not the way to play."; ]; ! Object definitions Object Basement "In the Basement" with description [; if (self hasnt visited) { print "Jenny's basement has been the site of some of the most important developments in your life. It's the first place you sipped beer. It's the first place you saw a porn magazine (even though Jenny insisted her dad reads them for the articles). And tonight, it might be the setting for your first kiss. If only you knew whether Randy liked you...^^"; } "The basement is perfect for slumber parties - it's big, it's carpeted, it's got a TV, and best of all, a separate door to the outside that can be opened without her parents waking up. Mid-party, the room is covered in sleeping bags, emptied junk food containers, and teenagers. Stairs lead up to the rest of the house."; ], out_to [; <>; ], u_to [; if (self hasnt general) { give self general; "Jenny grabs your arm. ~Are you crazy? You'll wake up my parents!~"; } else { "Jenny's right. There's nothing interesting up there, anyway."; } ], has light static; Object -> Carpet "carpet" with name "carpet" "floor", description "Shag.", has static scenery concealed; Object -> Stairs "stairs" with name "stairs" "steps", description "They go up, Ray.", before [; Climb: <>; ], has static scenery concealed; Object -> Backdoor "door" with name "door", description "It leads out to Jenny's garage, and from there to the street.", before [; Open: "Leave in the middle of the game? Hardly."; ], has static scenery openable concealed; Object -> Bags "sleeping bags" with name "bags" "sleeping bags" "sleeping", description "They're everywhere. You dropped yours not far from Randy's, but you've lost sight of them both.", before [; Take: "Save the clean-up for tomorrow."; Enter: "It's still way early for that."; ], has enterable static scenery concealed; Object -> Teens "teenagers" with name "teens" "teenagers" "guests" "friends" "kids", description "Most of the people in your relatively small class, and almost all your friends.", has pluralname static scenery animate; Object -> Pam "Pam" with name "Pam", description "Pam is like your best friend in the whole world. She's way prettier than you, so she's usually got boys just falling all over her. As a result, you take her advice on guys seriously. Tonight, she's engrossed in flipping her hair at Billy over by the TV.", life [; Kiss: "Admittedly, the thought has crossed your mind."; default: "Pam is way into her conversation with Billy, although she's pulled herself out of it a few times to talk to you."; ], has animate proper scenery; Object -> Billy "Billy" with name "Billy", description "Billy is so not your type, but Pam likes him so you have to be nice. Besides, he's pretty okay, although you'd prefer if he were paying more attention to Pam than that stupid slasher movie on TV.", life [; Kiss: "Like wouldn't Pam just kill you? Besides, he's no Randy."; default: "No way. Talking to another guy when you're completely trying for Randy is just so bad."; ], has animate proper scenery; Object -> Sarah "Sarah" with name "Sarah", description [; if (self hasnt general) { give self general; "Oops! You totally forgot she wasn't here anymore. Her mom gave her this stupid curfew and she had to leave hours ago. Totally lame, right?"; } else { "Er, hello? She's not here anymore!"; } ], life [; default: "You're talking to someone who left the party hours ago. Totally weird."; ], has animate proper scenery; Object -> TV "television" with name "tv" "television" "tele" "movie" "slasher" "film" "show", description [; print "Jenny put a slasher movie in with the volume off. Every time you look, something totally gross happens.^^"; switch(random(5)) { 1: "Onscreen, an actress has just been served a pizza topped with human eyes! Yech!"; 2: "Ew. A crazed man in the film seems to be chainsawing off his own hand."; 3: "In this scene, a man in a trenchcoat hands a woman some flowers, and then begins chasing her with a giant knife."; 4: "In the movie, limbs are flying everywhere."; 5: "There's some action now involving a shower, an electric steakknife, and an entire sorority, but you have to turn away."; } ], has static scenery concealed; Object -> Food "junk food" with name "junk food" "food" "trash" "soda" "soda cans" "cans" "popcorn", description "Wreckage from the party. Empty bags of popcorn, sticky soda cans. It'll all have to be cleaned up tomorrow.", before [; Take: "Wait until morning. There's more important things on your mind now."; Eat: "Like, gross."; ], has pluralname scenery concealed; Human -> Randy "Randy" with name "Randy" "Randy Garri" "Garri", player_number 2, start_treasures 4, description [; if (self hasnt general) { give self general; print "^You gaze longingly at Randy for a moment. God, he's cute. If you don't get to kiss him or something tonight, you'll just die."; } else { print "You can't help but stare again. He is just so hot."; } if (children(self) ) { print "^^He's playing the game and holding "; WriteListFrom( child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT ); } "."; ], life [; Show, Give: if (noun == Note) { "Woah! That'd be like totally stupid! What are you smoking?!"; } if (noun == Card) { "Personal crisis aside, you are supposed to at least pretend to beat him."; } if (noun ofclass Treasure) { "This game doesn't work that way."; }; Kiss: "Woah, not yet! What if he doesn't like you?"; default: "You're way too entranced in his eyes."; ], has animate proper; Human -> Jenny "Jenny" with name "Jenny" "Herschel" "Jenny Herschel", player_number 3, start_treasures 1, description [; print "Sarah put Jenny's hair in braids earlier, and then used a whole can of hairspray to get them to stick off the top of her head. It looks completely stupid, but then that's what slumber parties are for."; if (children(self) ) { print "^^She's absorbed in the game, holding "; WriteListFrom( child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT ); "."; } new_line; rtrue; ], life [; Kiss: "Admittedly, the thought has crossed your mind."; Show, Give: "There's nothing in your possession you'd want her to see."; default: "There's no reply. She's completely distracted between watching the game and keeping an eye out for her parents."; ], has animate proper transparent; Object -> Game "game of Bloodline" with name "game" "board" "bloodline", article "the", description [; print "It's a simple game, once you get the hang of it. Collect the treasures, and make it to the ~finish line~ first. Each turn, you can either roll the dice and move your piece, or draw a card.^^The current game position has "; if (num_moves > 9) { "Jenny very far away from the finish line, on the mauve square, Randy's piece on the silver circle, seven spaces away, and your piece closest - only five spaces away."; } else { "Jenny out of the game, Randy's piece on the bronze triangle (one space from the end), and your piece only five spaces away."; } ], before[; Receive: "All the pieces needed for the game are already on the board."; Take: "No way. The game's not over yet."; ], daemon [; num_moves = num_moves - 1; switch(num_moves) { 24: "^Jenny leans forward over the game board, considering her next move."; 22: move Note to player; "^Pam gets up from the group near the TV and comes over to you. ~Read this and don't show it to anyone!~ She hands you a note, winks, and returns to the group."; 19: "^Jenny sighs, and leans over the game board. ~Okay, I'm going to draw a card.~"; 18: move Dice to Randy; move child(Jenny) to Randy; "^Jenny picks up a card, turns it over slowly, and then groans. ~Shit.~^^Randy peeks over her shoulder, first brushing his hair out of his eyes in a way that's totally adorable. ~Rockin'!~ he exclaims. ~I'll take that, Jen.~ He takes her last treasure gleefully."; 17: "^Randy is sorting his treasures. He looks up and stares at you for a long, wonderful moment. ~Looks like it's just us now,~ he says to you.^^Oh my God!"; 14: "^Jenny, out of the game but still watching, looks annoyed. ~Hurry up, Randy. I wanna know what happens.~"; 13: "^Randy rolls his eyes. ~I'm hurrying!~ You glare at Jenny. How dare she!"; 11: "^~Okay,~ Randy says finally. ~I'm gonna roll for it.~"; 10: "^Randy tosses the dice. They come up double three's."; 9: "^~Excellent!~ Randy moves his piece forward. He's only one away from the finish line."; 8: move Dice to Player; "^Randy hands the dice to you. ~Your turn,~ he says, as your fingers touch briefly.^^Pam sidles up to you. ~Let him win!~ she whispers. ~Guys hate it when girls beat them.~ Before you can answer, she's gone back to the group."; 6: "^Jenny pokes you with one slippered foot."; 4: "Jenny throws a potato chip at you, which you pick out of your hair. ~Hurry up, stupid!~"; 2: "^Randy coughs politely. Uh oh. He's getting pissed at you."; 1: print "^Both Jenny and Randy have totally lost patience with you.^^~Oh, just forget it,~ Jenny says. ~She's not even paying attention.~^^They get up and join the rest of the group. Randy throws you a look of total disgust.^^"; deadflag = 3; } ], has supporter; Piece -> -> Jenny_Piece "Jenny's game piece" with name "piece" "Jenny^s piece" "Jenny^s" "game piece" "Jenny^s game piece", description [; if (num_moves > 18) { "Jenny's piece is on the mauve square - far, far from the finish line."; } else { "Jenny's out of the game, remember?"; } ], has proper; Piece -> -> Randy_Piece "Randy's game piece" with name "piece" "Randy^s piece" "Randy^s" "game piece" "Randy^s game piece", description [; if (num_moves > 9) { "Randy's piece is on the silver circle, seven spaces from the finish line."; } else { "Randy's piece is only one space away from the end of the game."; } ], has proper; Piece -> -> Player_Piece "your game piece" with name "piece" "my piece" "mine" "my" "game piece" "my game piece", description [; print "Your piece is five spaces away from the finish line. "; if (num_moves > 9 && num_moves < 18) { "If Randy does really well on his turn, he might be able to finish."; } else { "With the card in your hand, you can win instantly."; } new_line; rtrue; ], has proper; Treasure T1 "hairy chicken" with name "hairy" "chicken" "hairy chicken" "treasure", treasure_number 1, description " "; Treasure T2 "prosthetic ear (left)" with name "prosthetic" "ear" "left" "prosthetic ear", treasure_number 2, description " "; Treasure T3 "corned mutton" with name "corned" "corn" "mutton" "corned mutton", description " "; Treasure T4 "vial of plague" with name "vial" "plague" "vial of plague" "ebola", description " "; Treasure T5 "sea cucumber" with name "sea" "cucumber", description " "; Treasure T6 "useful rock" with name "rock" "useful", description " "; Treasure T7 "critical reference manual" with name "critical" "reference manual" "reference" "book", description " "; Treasure T8 "mad cow" with name "mad" "cow" "moo", description " "; Treasure T9 "dirty duck" with name "dirty" "duck", description " "; Treasure T10 "overripe banana" with name "overripe" "banana", article "an", description " "; Object Card "game card" with name "card" "game card", description "One of many special game cards, with Bloodline logo on one side and its meaning printed on the other. It reads, ~Move six spaces forward.~ Throwing down this card from your position means you could instantly win the game.", before [; Take: "Jenny looks at you funny. ~You can only have one card at time. Which you'd know if you were listening to the rules instead of babbling to Pam again.~"; Drop: if (num_moves > 8) "It's not your turn yet, dummy."; else { if (self hasnt general && Dice hasnt general) { give self general; "Wait. If you drop this, you'll like possibly ruin any chance with Randy because he could totally hate being beaten by a girl. But if you do let him win, you're just promoting the stereotype of girls being stupid.^^This sucks! You don't know what to do."; } else { deadflag=4; "You put down the winning card, and ceremoniously move your piece to the last square.^^As if on cue, there's a sudden quiet moment in the movie on TV. Pam leaves her place next to Billy and gapes at you in disbelief. Jenny, seemingly unsurprised, begins packing up the game and seems to be congratulating you. You're not listening at all, though.^^All you can do is stare at Randy. He looks at you and makes this completely fake smile. ~Hey, good game.~^^ Larry Beckman (gross!) suddenly appears behind him and punches him in the shoulder. ~Yo - let's go throw some eggs off the roof.~^^Randy looks at you with an expression you just know is total disgust. ~Yeah,~ he says to Larry, as Larry disappears out the door with a fresh carton. Getting up, Randy says to you, ~Uh, see ya later.~^^Right. Not if you don't just jump off the planet first."; } } ]; Object Instructions "instructions for Bloodline" with name "instructions", description [; <>; ]; Object Note "note from Pam" with name "note" "paper", description [; if (self hasnt general) { print "You unfold the note from Pam, and read it, eyes widening:^"; } print "~Alison talked to Larry, who had gym with Tommy Russell, who ate lunch with Ally, who asked Randy about you and he said he thinks he LIKE LIKES you!~^"; if (self hasnt general) { print "^You can barely breathe. Now all you have to do is not screw up...^"; give self general; } rtrue; ]; Object Dice "pair of dice" with name "die" "dice", description "Just an ordinary pair of dice, suitable for rolling.", before [; Roll: if (num_moves > 8) "Duh. It's not your turn yet."; else { if (self hasnt general && Card hasnt general) { give self general; "You hesitate. You can win at any moment with the card in your hand. Letting Randy win just to satisfy his male ego and give you a better shot at him is just way un-feminist. Aunt Janet would just shit.^^You really aren't sure what to do. Randy is staring at you expectantly."; } else { deadflag = 5; "~I'm gonna roll,~ you say. Pam looks up from the TV and gives you an excited thumbs-up.^^ You toss the dice. Everyone around the game board leans over expectantly.^^ Double twos! You try to look disappointed - it's not enough for you to cross the finish line. Randy reaches for the dice but Jenny stops him. ~Don't prolong the inevitable. You totally won, just like you always do.~ Randy grins at her - he's got just the best teeth!^^ Jenny, seemingly unsurprised, begins packing up the game and seems to be congratulating him. You're not listening at all, though.^^All you can do is stare at Randy. He looks at you with a huge, gorgeous smile. ~Hey, good game.~^^ Larry Beckman suddenly appears behind him and taps him on the shoulder. ~Yo - let's go throw some eggs off the roof.~^^Randy looks at you and you're so sure he's winking knowingly. ~Yeah,~ he says to Larry, with obvious sarcasm. Getting up, Randy says to you, ~Hey... see ya later.~^^And you know you will."; } } ], has rollable; Human Tracy "Tracy" with description [; switch(random(4)) { 1: "Self-consciously, you play with your hair."; 2: "Ergh, dry lips. You try to lick them surreptiously."; 3: "Gross. These jeans make you look like a total blob."; 4: "You briefly brush your face, feeling for a break-out."; } ], add_to_scope Dice instructions, player_number 1, number, start_treasures 5; ! Initial objects Clothes Jeans "blue jeans" with name "jeans" "bluejeans" "blue jeans", description "They're worn, baggy and comfortable. Exactly what you wouldn't have chosen if you'd known Randy would be here.", has clothing; Clothes Shirt "t-shirt" with name "shirt" "t-shirt", description "Your standard issue Gap pocket tee. In green.", has clothing; ! Begin subroutines [ Initialise i j k l; ChangePlayer(Tracy); location = Basement; objectloop(i ofclass Treasure) { while (l ~= 1) { j = random(total_players); objectloop(k ofclass Human) { if (k.player_number == j && children(k) < k.start_treasures) { move i to k; l=1; } } } l=0; } move Shirt to player; give Shirt worn; move Jeans to player; give Jeans worn; move Card to player; StartDaemon (Game); give Game ~openable; move Dice to Jenny; "^^Jenny snapped her gum - audible even over the screams coming from the TV. ~Okay, like, shut up. I'm going to read the opening of the game...~^^Randy cut her off. ~Do we need to hear this again?~^^~Way!~ She rolled her eyes for effect. ~She hasn't played before,~ Jenny nodded at you, ~so just sit there and shut up. It's not like you won't win anyway.~ Randy settled back, and Jenny cleared her throat theatrically.^^~'In his will, Baron von Frufenhortz left behind an enormous fortune to whichever of his ruthless relatives could capture the most of ten magical treasures he'd hidden in his Transklovanian castle. In this game, you will use cunning, daring and luck to outwit your opponents in the search for the treasures, and the race to bring them to the finish line. The game proceeds as each player rolls dice or plays special cards...'~^^ Pam slid in behind you, whispering in your ear. ~I know why you're playing this stupid game.~ You tried to swat her away, but she was insistent. ~It's because Randy likes it, and you like Randy.~^^You remember blushing furiously. ~Shut up!~ you hissed. ~I'm trying to listen to the rules.~^^Pam laughed. ~There's only one rule you need to know - boys HATE when girls like us beat them.~ She cackled and disappeared.^^ Now, almost an hour later, the board game has worn out all but the most determined players. You've done well, which is surprising, since Pam's words and Randy's hot bod were the only things on your mind as you've played through the game of...^^^^"; ]; [ Deathmessage; if (deadflag == 3) { print "You are a complete freak to all guys"; } if (deadflag == 4) { print "Randy will hate you forever"; } if (deadflag == 5) { print "You are totally going to make it tonight"; } ]; [ XyzzySub; "Like, what a nerd."; ]; [ RollSub; if (noun hasnt rollable) "That isn't something you can roll."; else { print_ret "You roll ", (the) noun; } ]; [ PlaySub; if (noun == Card) { <>; } else { print_ret "You don't know how to play ", (the) noun; } ]; [ AboutSub; "~Bloodline~ is a work of interactive fiction produced for the 1998 IF Mini-Competition (sponsored by Lucian ~Lucian~ Smith). Thanks, LP!^^ Questions, bug reports, and miscellaneous paper products should go to Liza Daly (gecko@@64retina.net). Thanks to Matthew Amster-Burton, Mark Musante and Lucian for beta-testing, and thanks to the denizens of the MUD for the treasure suggestions.^^ Visit ifMUD: You don't need the sleep. (http://fovea.retina.net:4001/)^^ Keep circulating the games."; ]; [ HelpSub; if (Instructions hasnt general) { give Instructions general; "~Hey, lemmie see that?~ you ask Jenny. She hands you the instructions for the game, which basically tell you what you already know:^^ When it is a given player's turn, you can either play a card in your hand, draw a new card, or roll the dice to advance your player piece.^^ ~Thanks, Jenny.~ You return the instructions to her."; } else { "When it is a given player's turn, you can either play a card in your hand, draw a new card, or roll the dice to advance your player piece."; } ]; [ SmileSub; if (noun) { if (noun == Randy) { "You flash Randy a dazzling smile, sure to win him over."; } else { "Save your pearly whites for Randy."; } } else { "You smile indiscriminately."; } ]; Include "grammar-mini"; Verb "roll" * noun -> Roll; Verb "play" * noun -> Play; Verb "xyzzy" * -> Xyzzy; Verb meta "about" "info" * -> About; Verb meta "help" * -> Help; Verb "draw" * noun -> Take; Verb "smile" "grin" * -> Smile * "at" noun -> Smile;