mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-13 07:14:59 +00:00
176 lines
3.9 KiB
C++
176 lines
3.9 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* This code is based on the original source code of Lord Avalot d'Argent version 1.3.
|
|
* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
|
|
*/
|
|
|
|
/* regname's name starts at $7D1 (2001). */
|
|
|
|
namespace Avalanche {
|
|
|
|
const array<1, 56, char> padding =
|
|
"For all the Etruscan armies were ranged beneath his eye";
|
|
|
|
text txi, txo;
|
|
string x, y;
|
|
word fv;
|
|
file<byte> f;
|
|
byte sum, n;
|
|
string name, number;
|
|
|
|
string chkname, chknum, regname, regnum;
|
|
|
|
|
|
char decode1(char c) {
|
|
byte b;
|
|
|
|
char decode1_result;
|
|
b = ord(c) - 32;
|
|
decode1_result = chr(((b & 0xf) << 3) + ((cardinal)(b & 0x70) >> 4));
|
|
return decode1_result;
|
|
}
|
|
|
|
char encode1(char c) {
|
|
byte b;
|
|
|
|
char encode1_result;
|
|
b = ord(c);
|
|
b = ((cardinal)(b & 0x78) >> 3) + ((b & 0x7) << 4);
|
|
encode1_result = chr(b + 32);
|
|
return encode1_result;
|
|
}
|
|
|
|
char encode2(char c) {
|
|
char encode2_result;
|
|
encode2_result = chr((((ord(c) & 0xf) << 2) + 0x43));
|
|
return encode2_result;
|
|
}
|
|
|
|
string enc1(string x) {
|
|
string y;
|
|
byte fv;
|
|
|
|
string enc1_result;
|
|
y = x;
|
|
for (fv = 1; fv <= length(y); fv ++) y[fv] = encode1(y[fv]);
|
|
enc1_result = y;
|
|
return enc1_result;
|
|
}
|
|
|
|
string enc2(string x) {
|
|
string y;
|
|
byte fv;
|
|
|
|
string enc2_result;
|
|
y = x;
|
|
for (fv = 1; fv <= length(y); fv ++) y[fv] = encode2(y[fv]);
|
|
enc2_result = y;
|
|
return enc2_result;
|
|
}
|
|
|
|
boolean checker(string proper, string check) {
|
|
byte fv;
|
|
boolean ok;
|
|
|
|
boolean checker_result;
|
|
ok = true;
|
|
for (fv = 1; fv <= length(proper); fv ++)
|
|
if ((ord(proper[fv]) & 0xf) != ((cardinal)(ord(check[fv]) - 0x43) >> 2))
|
|
ok = false;
|
|
|
|
checker_result = ok;
|
|
return checker_result;
|
|
}
|
|
|
|
void unscramble() {
|
|
byte namelen, numlen;
|
|
|
|
|
|
namelen = 107 - ord(x[1]);
|
|
numlen = 107 - ord(x[2]);
|
|
|
|
regname = copy(x, 3, namelen);
|
|
regnum = copy(x, 4 + namelen, numlen);
|
|
chkname = copy(x, 4 + namelen + numlen, namelen);
|
|
chknum = copy(x, 4 + namelen + numlen + namelen, numlen);
|
|
|
|
for (fv = 1; fv <= namelen; fv ++) regname[fv] = decode1(regname[fv]);
|
|
for (fv = 1; fv <= numlen; fv ++) regnum[fv] = decode1(regnum[fv]);
|
|
|
|
if ((! checker(regname, chkname)) || (! checker(regnum, chknum))) {
|
|
output << "CHECK ERROR: " << regname << '/' << chkname << ';' << regnum << '/' << chknum << '.' << NL;
|
|
exit(0);
|
|
} else output << "--- Passed both checks. ---" << NL;
|
|
}
|
|
|
|
int main(int argc, const char *argv[]) {
|
|
|
|
pio_initialize(argc, argv);
|
|
output << "Name? ";
|
|
input >> name >> NL;
|
|
output << "Number? ";
|
|
input >> number >> NL;
|
|
|
|
x = string(chr(107 - ord(name[0]))) + chr(107 - ord(number[0]));
|
|
|
|
|
|
x = x + enc1(name) + 'J' + enc1(number) + enc2(name) + enc2(number);
|
|
|
|
number = "";
|
|
fv = 1;
|
|
while ((length(number) + length(x)) < 57) {
|
|
number = number + padding[fv - 1];
|
|
fv = fv + 1;
|
|
}
|
|
x = x + enc1(number);
|
|
|
|
|
|
output << x << NL;
|
|
output << NL;
|
|
unscramble();
|
|
|
|
assign(txi, "v:register.raw");
|
|
reset(txi);
|
|
assign(txo, "a:register.dat");
|
|
rewrite(txo);
|
|
|
|
for (fv = 1; fv <= 53; fv ++) {
|
|
txi >> y >> NL;
|
|
txo << y << NL;
|
|
}
|
|
|
|
txi >> y >> NL;
|
|
txo << x << NL;
|
|
|
|
while (! eof(txi)) {
|
|
txi >> y >> NL;
|
|
txo << y << NL;
|
|
}
|
|
|
|
close(txi);
|
|
close(txo);
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
} // End of namespace Avalanche.
|