I said I would, right?
(local ; Correct answers' hashes, in original order. ; Determined by https://helmet.kafuka.org/sci/kq4_cp.html [answers 8] = [666 393 526 377 365 453 383 441] ) (instance CopyProtection of Room (method (doit &tmp i ch hash myPick [yourAnswer 40]) ; Just like in PQ2, we grab the current time, then mask out ; the lower bits to limit the range to a number from 0 to 7. (= myPick (& (GetTime gtTIME_OF_DAY) 7)) ; Clear out the first character of our answer to effectively ; make it blank. (= yourAnswer 0) ; Request our input as before... (Print "TO: Detective Bonds\nFROM: Captain Hall\nSUBJECT: ID of evidence photo\n\nPlease provide the LAST name of the person pictured in the attached evidence photo for homicide case 186751.\n\nPlease respond in box below, ASAP!\n" #icon 701 0 myPick #edit @yourAnswer 20 ) ; Now we use some trickery from KQ4, but different. (= hash 0) (= i 0) ; While the character at position i is nonzero... (while (= ch (StrAt @yourAnswer i)) ; Anything between 'a' and 'z' gets turned to uppercase. ; We don't bother putting it *back* in yourAnswer though. (if (and (>= ch 97) (<= ch 122)) (= ch (- ch 32))) ; Add this value to our running total. (= hash (+ hash ch)) (++ i) ) ; Either the hash we calculated is the correct one, or ; we entered "bobalu". (if (or (== hash [answers myPick]) (== hash 437) ) (gRoom newRoom: 1) ; or wherever your game starts. else (Print "Sorry Bonds, you'll need to do better than that!") (= gQuitGame true) ) ) )
And presto! I’d talk about some of the other games’ copy protection schemes but for example KQ5’s doesn’t pass the decompiler. Probably because of a difficulty involving endless loops. Still, feel free to suggest something.