& - And. | - Or. The bitwise operator AND (&) is used to test two values against each other, and results in setting bits which are active in both arguments. This can be used for a few things, but in Hercules this operator is usually used to create bit-masks in scripts. The bitwise operator OR (|) sets to 1 a binary position if the binary position of one of the numbers is 1. This way a variable can hold several values we can check, known as bit-mask. A variable currently can hold up to 32 bit-masks (from position 0 to position 1). This is a cheap(skate) and easy way to avoid using arrays to store several checks that a player can have. A bit-mask basically is (ab)using the variables bits to set various options in one variable. With the current limit in variables it is possible to store 32 different options in one variable (by using the bits on position 0 to 31). Example(s): - Basic example of the & operator, bit example: 10 & 2 = 2 Why? : 10 = 2^1 + 2^3 (2 + 8), so in bits, it would be 1010 2 = 2^1 (2), so in bits (same size) it would be 0010 The & (AND) operator sets bits which are active (1) in both arguments, so in the example 1010 & 0010, only the 2^1 bit is active (1) in both. Resulting in the bit 0010, which is 2. - Basic example of creating and using a bit-mask: .@options = 2|4|16; // (note: this is the same as 2+4+16, or 22) if (.@options & 1) mes "Option 1 is activated"; if (.@options & 2) mes "Option 2 is activated"; if (.@options & 4) mes "Option 3 is activated"; if (.@options & 8) mes "Option 4 is activated"; if (.@options & 16) mes "Option 5 is activated"; This would return the messages about option 2, 3 and 5 being shown (since we've set the 2,4 and 16 bit to 1). ^ - Xor. The bitwise operator XOR (eXclusive OR) sets a binary position to 0 if both numbers have the same value in the said position. On the other hand, it sets to 1 if they have different values in the said binary position. This is another way of setting and unsetting bits in bit-masks. Example: - First let's set the quests that are currently in progress: inProgress = 1|8|16; // quest 1,8 and 16 are in progress - After playing for a bit, the player starts another quest: if( inProgress&2 == 0 ){ // this will set the bit for quest 2 (inProgress has that bit set to 0) inProgress = inProgress^2; mes "Quest 2: find a newbie and be helpful to him for an hour."; close; } - After spending some time reading info on Xor's, the player finally completes quest 1: if( inProgress&1 && isComplete ) { // this will unset the bit for quest 1 (inProgress has that bit set to 1) inProgress = inProgress^1; mes "Quest 1 complete!! You unlocked the secrets of the Xor dynasty, use them wisely."; close; }