Quote from: Sabriella_Casper on February 10, 2026, 11:42:15 AMIt's wild how much the Amiga version stands out compared to the others. Those special levels really had a unique vibe that the PC/DOS ports just didn't quite capture.
Quote from: Sabriella_Casper on February 10, 2026, 11:42:15 AMIf anyone's looking to play them today, the 'Amiga' level packs for NeoLemmix are a lifesaver - they port the levels over perfectly while keeping the modern quality-of-life features.
Quote from: Dominator_101 on February 09, 2026, 01:35:09 PMOne option for this would be to display extra saves as '+X'. This could work with both negative and non negative req count really, but for the case of using a positive req counting down adding '+' in front after saving enough helps differentiate it.
Always display a positive number.
Count downwards whilst the save requirement hasn't been met - so, at this point, the number is "how many lemmings still need to be saved", which is what the player most needs to know. No "-/+", no asking the player to do sums, just show the information as plainly as possible. And, show this number in either yellow or blue.
As soon as the save requirment is met, immediately switch to showing "total saved", and continue to count upwards from there as more lems are saved. And, show this number in green.
On my actual copy of lemmings, the code for the next level depends on the percentage of lemmings rescued when completing the current one, and all different codes generated this way work. In addition, there is a variable (that I called "salt" in the listing below), the lowest 4 bit of which are encoded in the code. All different salts generate valid codes, and restoring a code also restores the salt, so subsequent codes will encode the same value. Or, in other words, if you enter a code for a different percentage you'll get the same codes for the next levels, but if you enter a code with a different salt you'll get a different set of codes.// rating: 0 .. 4
// level: 0 .. 29
// percentage: 0 .. 100
// salt: 0 .. 0x0f
function codeFor(rating, level, percentage = 100, salt = 0x00) {
const secret = "AJHLDHBBCJ".split("").map((x) => x.charCodeAt(0));
const levelIndex = 30 * rating + level;
const code = new Array(10).fill(" ".charCodeAt(0));
code[0] = ((levelIndex & 0x01) << 3) | secret[0] | ((salt & 0x01) << 1) | ((percentage & 0x01) << 2);
code[1] = ((levelIndex & 0x02) << 1) | secret[1] | ((percentage & 0x02) >> 1);
code[2] = (levelIndex & 0x04) | secret[2] | ((percentage & 0x04) >> 1) | ((salt & 0x02) >> 1);
code[3] = ((levelIndex & 0x08) >> 3) | secret[3] | ((percentage & 0x08) >> 2);
code[4] = ((levelIndex & 0x10) >> 3) | secret[4] | ((percentage & 0x10) >> 1) | ((salt & 0x04) >> 2);
code[5] = ((levelIndex & 0x20) >> 5) | secret[5] | ((percentage & 0x20) >> 3) | ((salt & 0x08) >> 2);
code[6] = ((levelIndex & 0xc0) >> 4) | secret[6] | ((percentage & 0x40) >> 6);
code[7] = (levelIndex & 0xf) + secret[7];
code[8] = (levelIndex >> 4) + secret[8];
code[9] =
((code[0] + code[1] + code[2] + code[3] + code[4] + code[5] + code[6] + code[7] + code[8]) & 0xf) + secret[9];
for (let i = 7 - (levelIndex & 0x07); i > -1; i--) {
const tmp = code[6];
code[6] = code[5];
code[5] = code[4];
code[4] = code[3];
code[3] = code[2];
code[2] = code[1];
code[1] = code[0];
code[0] = tmp;
}
return code.map((x) => String.fromCharCode(x)).join("");
}
There are some surprisingly decent levels here, given that they're designed by your kids. Good job, Val and Max! 
// rating and level both zero based
function codeFor(rating, level) {
const secret = "AJHLDHBBCJ".split("").map((x) => x.charCodeAt(0));
const percentage = 100;
const levelIndex = 30 * rating + level;
const code = new Array(10).fill(" ".charCodeAt(0));
code[0] = ((levelIndex & 0x01) << 3) | secret[0] | ((percentage & 0x01) << 2);
code[1] = ((levelIndex & 0x02) << 1) | secret[1] | ((percentage & 0x02) >> 1);
code[2] = (levelIndex & 0x04) | secret[2] | ((percentage & 0x04) >> 1);
code[3] = ((levelIndex & 0x08) >> 3) | secret[3] | ((percentage & 0x08) >> 2);
code[4] = ((levelIndex & 0x10) >> 3) | secret[4] | ((percentage & 0x10) >> 1);
code[5] = ((levelIndex & 0x20) >> 5) | secret[5] | ((percentage & 0x20) >> 3);
code[6] = ((levelIndex & 0xc0) >> 4) | secret[6] | ((percentage & 0x40) >> 6);
code[7] = (levelIndex & 0xf) + secret[7];
code[8] = (levelIndex >> 4) + secret[8];
code[9] =
((code[0] + code[1] + code[2] + code[3] + code[4] + code[5] + code[6] + code[7] + code[8]) & 0xf) + secret[9];
for (let i = 7 - (levelIndex & 0x07); i > -1; i--) {
const tmp = code[6];
code[6] = code[5];
code[5] = code[4];
code[4] = code[3];
code[3] = code[2];
code[2] = code[1];
code[1] = code[0];
code[0] = tmp;
}
return code.map((x) => String.fromCharCode(x)).join("");
}