Can someone (*cough* David *cough* ) explain with relation to the low-level disassembly what exactly this change does? What's the check and where is it taking place? Internally does the PoP2 code screen work the same way as PoP1's, such that one code at random is assigned an open potion?

2) Is it possible to hex edit the EXE (preferably 1.1's) such that each code can take me to a different level, and have each level (or whichever levels I want) exit back to the code screen? Just wanted to experiment and try out an idea I had...

Red: This is from IR C2.
The original code is 39 76 F6 = cmp [bp-0A],si
Green: Yes. Although it would be more precise to say that this is the IR equivalent of the changed byte from 1.0.
Purple: I don't know yet.
Brown: I think they are correct.

Andrew wrote:PURPLE: Would love to know more details about how it works once you've figured it out.

This is interesting... It seems that cprot_select() returns 0xFFFE (-2) if:
The cheat mode is active, you type the cheat word (makinit) on the copy protection screen, and press enter.
In this case the game accepts any choice.

David wrote:This is interesting... It seems that cprot_select() returns 0xFFFE (-2) if:
The cheat mode is active, you type the cheat word (makinit) on the copy protection screen, and press enter.
In this case the game accepts any choice.

What?! Wow, it's true, IR has an in-built way to skip the code screen as long as cheats are active! Did you figure out where exactly the code accepts "makinit" when entered on the copyprot screen?

As far as I can tell they removed this from 1.0 onwards, so it was probably just meant for testing purposes during development. I'd love to know where the copyprot code differs in the disassembly of 1.0.

This consists of multiple parts:
1. The cheat word itself is loaded (in cheat mode only) from prince.dat, "TXT4" resource 10, at the beginning of cprot_select(). It's stored in cheat_str.
2. At label key_other: If the user presses a key that does not do anything, then the key is added to the typed_keys[] array.
3. After the user presses enter, the code compares the typed string and the cheat word, case insensitively. If they match, then cprot_select() returns -2 (instead of the index of the selected symbol).
4. This is detected by the code you marked purple.

Andrew wrote:
I'd love to know where the copyprot code differs in the disassembly of 1.0.

Andrew wrote:
2) Is it possible to hex edit the EXE (preferably 1.1's) such that each code can take me to a different level, and have each level (or whichever levels I want) exit back to the code screen? Just wanted to experiment and try out an idea I had...

As for the texts on that screen, they are in PRINCE.DAT.The newest PR can export/import them correctly.
txt408005.bin = "Select the symbol that appears"
txt408006.bin = "on page %d of the manual"
Note that you must leave the terminating zero byte at the end!