⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamecode.pas

📁 千年2的脱机源代码
💻 PAS
字号:
unit Gamecode;

interface

uses
  SysUtils,Classes,Windows;

//加密使用字符从第一行第一个 N 开始解密使用字符从第1行第5个 U 开始 字符总长度256
const
GameKey : array [0..127] of byte =
($4E, $3E, $54, $53, $56, $55, $4A, $6C, $77, $64, $63, $42, $4D, $46, $6A, $6E,
 $41, $4B, $62, $3F, $71, $78, $76, $79, $65, $47, $7A, $66, $4C, $50, $3D, $5F,
 $45, $52, $40, $5A, $5C, $61, $6D, $5D, $43, $68, $67, $6F, $57, $44, $3B, $51,
 $75, $58, $5B, $3C, $74, $6B, $70, $72, $5E, $60, $69, $49, $48, $4F, $59, $73,
 $2E, $33, $1E, $01, $13, $22, $10, $0B, $28, $2D, $20, $0D, $19, $3C, $3B, $06,
 $11, $1C, $0C, $00, $3D, $1D, $2F, $21, $03, $02, $05, $04, $2C, $31, $3E, $23,
 $32, $24, $27, $38, $1F, $39, $25, $12, $0A, $09, $18, $1B, $2A, $29, $3A, $0E,
 $35, $07, $26, $0F, $2B, $36, $14, $37, $3F, $34, $30, $16, $08, $15, $17, $1A); 
                                
function decode(Source: Pchar; len: integer; Dest: Pchar):integer;   //解密
function encode(Source: Pchar; len: integer; Dest: Pchar):integer;   //加密
function CharToAscii(Source: PChar; Len: Integer):string;               
function AsciiToChar(PDestChar, PSource: PChar; size: integer): integer;

implementation

function decode(Source: Pchar; len: integer ; Dest: Pchar):integer;   //解密
var
    a1, d1: byte;
    i, count, di, si :integer;
begin
result := len div 4 * 3 ;  //返回解密后数据长度
i := 0;
while i < len do
begin
    d1 := byte(Source[i]);
    if (d1 = $3B) or (d1 = $7A) then
    begin
    end;
    d1 := d1 and $0FF;
    d1 := GameKey[d1 + 05];
    byte(Source[i]) := d1;
    inc(i);
end;

di := 0;
si := 0;
count := len div 4;                        //循环次数
for i := 1 to count do
begin
    a1 := ord(Source[di]);               //解密数据 (取4个.转化3个)
    a1 := a1 shl 2;
    d1 := ord(Source[di + 1]);
    d1 := d1 shr 4;
    a1 := a1 or d1;
    Dest[si] := chr(a1);

    a1 := ord(Source[di + 1]);
    a1 := a1 shl 4;
    d1 := ord(Source[di + 2]);
    d1 := d1 shr 2;
    a1 := a1 or d1;
    Dest[si + 1] := chr(a1);
  
    a1 := ord(Source[di + 2]);
    a1 := a1 shl 6;
    d1 := ord(Source[di + 3]);
    a1 := a1 or d1;
    Dest[si + 2] := chr(a1);

    di := di + 4;
    si := si + 3;
end;
end;

function encode(Source: Pchar; len: integer; Dest: Pchar):integer;   //加密
var
  a1, d1 : byte;
  i, count, di, si : integer;
begin
result := len div 3 * 4 ;  //返回加密后数据长度
di := 0;
si := 0;
count := len div 3;           //定义循环次数
for i := 1 to count do
begin
    a1 := ord (Source[di]);   //第一次转换  取3个 输出4个
    a1 := a1 shr 2;
    Dest[si] := chr(a1);

    a1 := ord(Source[di]);
    a1 := a1 and 3;
    a1 := a1 shl 4;
    d1 := ord (Source[di +1]);
    d1 := d1 shr 4;
    a1 := a1 or d1;
    Dest[si +1] := chr(a1);

    a1 := ord(Source[di + 1]);
    a1 := a1 and $0F;
    a1 := a1 shl 2;
    d1 := ord(Source[di + 2]);
    d1 := d1 shr 6;
    a1 := a1 or d1;
    Dest[si + 2] := chr(a1);

    a1 := ord ( Source[di + 2]) ;
    a1 := a1 and $3F;
    Dest[si + 3] := chr (a1) ;

    //第二次转换
    d1 := ord(Dest[si]);          //第 1 个
    d1 := GameKey[d1];
    Dest[si] := chr(d1);

    d1 := ord(Dest[si + 1]);          //第 2 个
    d1 := GameKey[d1];
    Dest[si + 1] := chr(d1);

    d1 := ord(Dest[si + 2]);          //第 3 个
    d1 := GameKey[d1];
    Dest[si + 2] := chr(d1);

    d1 := ord(Dest[si + 3]);          //第 4 个
    d1 := GameKey[d1];
    Dest[si + 3] := chr(d1);

    di := di + 3;
    si := si + 4;
end;
end;

function CharToAscii(Source: PChar; len: Integer):string;
var
  Source2  : string;
  i     : Integer;
  p     : Integer;
  ascii : string;
begin
SetLength(ascii, 2*len);
ascii:='';
for i:=0 to len-1 do
begin
    p := integer(Source[i]);
    Source2 := IntToHex(p, 2);
    ascii := ascii + Source2;
end;
result := ascii;
end;

function StrToHex(C: PChar): byte;
var
   m1, m2 : byte;
begin
case c[0] of
    '0','1','2','3','4','5','6','7','8','9' : m1 := StrToInt(c[0]);
    'A','a' : m1 := 10;
    'B','b' : m1 := 11;
    'C','c' : m1 := 12;
    'D','d' : m1 := 13;
    'E','e' : m1 := 14;
    'F','f' : m1 := 15;
end;
case c[1] of
    '0','1','2','3','4','5','6','7','8','9' : m2 := StrToInt(c[1]);
    'A','a' : m2 := 10;
    'B','b' : m2 := 11;
    'C','c' : m2 := 12;
    'D','d' : m2 := 13;
    'E','e' : m2 := 14;
    'F','f' : m2 := 15;
end;
result := m1 * 16 + m2;
end;

function AsciiToChar(PDestChar, PSource: PChar; size: integer): integer;
var
    i : integer;
    str : array [0..1] of Char;
    temp : byte;
begin
if size mod 2 = 1 then
begin
    MessageBox(0, '待转化字符的长度出错', '错误', MB_OK);
    result := 0;
    exit;
end;
size := size div 2;
for i := 0 to size do
begin
    CopyMemory(@str, @PSource[i * 2], 2);
    temp := StrToHex(@str);
    PDestChar[i] := Char(temp);
end;
result := size;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -