Constant Story "A Surreal Experience"; Constant Headline "^A Demonstration of Bitwise Attributes^"; Release 2; constant MAX_SCORE = 1; Include "Parser"; Include "VerbLib"; !---------------------------------------------------------------------------- ! This little game demonstrates what I call bitwise attributes. It's a rather ! clumsy but powerful way to create attributes beyond the 16 available in v5 ! games, a number which I find to be insufficient. Another advantage is they ! can be grouped together in some kind of relationship; in this example, a ! variable called "talked" is set up to track what has or hasn't been asked. ! You could just as easily create a ! variable called "pressed" for which buttons have been pressed on a machine, ! or if any object has been manipulated in any way. ! ! Although an extremely simple example, I hope that this game shows how ! bitwise attributes can contribute to create very dynamic interactions with ! objects, especially NPCs. Feel free to adopt this method in your own games ! if you find it useful. Maybe you can find a use for other bitwise operators ! such as XOR, NOT and SHIFT LEFT/RIGHT, or improve and expand on the model ! presented here. If you do, I'd be interested to hear from you. ! ! For those who have not come across binary digits before, have a quick read ! of the relevant parts of a C or C++ manual. ! ! paris.downes@gmail.com !---------------------------------------------------------------------------- object room "White Room" with description "The room is white, luminous and almost completely empty.", has light; object -> man "man" with name 'man', description "He's eating an icecream and smoking a cigar.", describe [; if (room hasnt visited) "^A man stands before you, eating an icecream and smoking a cigar.^^~Hello.~ he says, ~Ask me about myself to demonstrate bitwise attributes.~"; ], talked 0, ! When this variable is treated as a binary number, each bit can represent an attribute since attributes are ! basically just binary flags themselves. You therefore have 8 or even 16 new attributes to use. Unfortunately ! they can't really be named so it takes a bit of work to keep track of them, but if you keep a record of them ! somewhere it's not too difficult. life [; ask: ! To test if certain bits are on (and the state of the other bits don't matter), OR the variable with the ! COMPLEMENT of what your testing for. If the result is 255 ( = $$11111111) then the test is true. switch (second) { 'man','himself': if ((self.talked | $$10010101) == 255) { score++; print "~You've already asked me about everything I know.~^^He vanishes into a puff of smoke."; deadflag = 2; rtrue; } print "~Why don't you ask me about my "; if (self.talked == 0) "icecream or my cigar?~"; if ((self.talked & $$01100000) == $$01100000) "icecream?~"; if ((self.talked & $$00001010) == $$00001010) "cigar?~"; 'icecream': if ((self.talked | $$11110101) == 255) "~Bits 4 and 2 (the icecream) have already been set.~"; self.talked = self.talked + $$00001010; "~Okay, the icecream is represented by bits 4 and 2, so let's set them.^^00001010~"; 'cigar': if ((self.talked | $$10011111) == 255) "~Bits 7 and 8 (the cigar) have already been set.~"; self.talked = self.talked + $$01100000; "~Okay, the cigar is represented by bits 7 and 8, so let's set them.^^01100000~"; 'bitwise','attributes': "~Have a look at the source code, the comments should explain everything. You could also Email the author at: paris.downes@@64gmail.com~"; } ], article "a", has animate transparent; object -> icecream "icecream" ! 00001010 = bit 4,2 with name 'icecream', description "The man seems to be enjoying it immensely.", has scenery; object -> cigar "cigar" ! 01100000 = bits 7,8 with name 'cigar', description "The man is taking short puffs of a thick, obnoxious smelling cigar.", has scenery; [ Initialise; location = room; ]; Include "Grammar";