Like many games from the early-to-mid-90's, the Xeen games use a manual-based form of copy protection consisting of asking the user to "Turn to page X, line Y, and enter word Z."
The copy protection file is stored inside the game's CC resource file. Darkside has a copy protection file named "TIMER.DRV" in DARK.CC, while Clouds has a copy protection file named "CPSTRUCT" in XEEN.CC. "CPSTRUCT" is also present in INTRO.CC, but the purpose of this is unknown. (INTRO.CC ships with Darkside, which does not need the Clouds' copy protection information at all.)
When the player tries to exit a town, the game checks whether they have already performed a copy protection check. If they have not, it loads the copy protection file and selects a random entry. After this, it uses the information stored in this entry to pop up a window asking them to turn to a specified page, line, and word number, and enter the requested word. The word the player enters is compared to the word stored in the copy protection file, and if they match the player is allowed to leave the town and the game saves the fact that they have passed a copy protection check. If it fails, they are not allowed to leave the town.
File Format Edit
The file size consists of any number of records, each 16 bytes in length, so the file size is always a multiple of 16.
The entire file is encrypted. Each byte must be XORed with an incrementing and looping counter byte, beginning at zero, incremented up to 255, after which the counter byte is reset to zero. For example, the first byte in the file is XORed with 0, the second byte with 1, the third byte with 2, and so on until the 256th byte is XORed with 255, the 257th byte is XORed with 0 and the 258th with 1.
Once decrypted, the file is broken into 16-byte entries.
- 1 byte - Page number
- 1 byte - Line number
- 1 byte - Word number
- 13 bytes - ASCIIZ word
The page, line, and word numbers are used to generate the text to ask the user to locate the specified word. Whatever they type in is compared to the stored word (which is right-padded with null bytes to fill the entire 13-byte field). If the word matches, the user has passed the copy protection check.