program TFDRA303Fix; uses crt, dos, windows; var rapath: string[200]; rareg: string[40]; installed:boolean; procedure cntin; var pause: char; begin writeln; writeln('Press any key to continue.'); repeat until keypressed; pause:=ReadKey(); end; {cntin} Procedure checkreg; var rapath1: string[200]; key : HKEY; rapth : array[1..200] of char; bl, ret : DWORD; s : string; teller:integer; begin s :='ra_folder'; bl:=200; rapath1:=''; RegOpenKeyEx( HKEY_LOCAL_MACHINE, 'SOFTWARE\Electronic Arts\EA Games\Command and Conquer The First Decade', 0, KEY_QUERY_VALUE, key ); ret := RegQueryValueEx( key, @s[1], nil, nil, @rapth, @bl); for teller:=1 to (bl-1) do rapath1:=concat(rapath1,rapth[teller]); RegCloseKey( key ); {writeln(); writeln(concat('"',rapath1,'"')); writeln(ret); writeln(bl);} if ret<>0 then installed:=false; if rapath1 = '' then installed:=false; if installed=true then rapath:=rapath1; end; {checkreg} Procedure changeReg; begin swapvectors; Exec(GetEnv('COMSPEC'),Concat('/C reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Westwood\', rareg ,'" /v FolderPath /t REG_SZ /d "" /f >nul')); swapvectors; Exec(GetEnv('COMSPEC'),Concat('/C reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Westwood\', rareg ,'" /v InstallPath /t REG_SZ /d "',rapath, '\RA95.EXE" /f >nul')); swapvectors; Exec(GetEnv('COMSPEC'),Concat('/C reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Westwood\', rareg ,'" /v AftermathInstalled /t REG_DWORD /d 0x1 /f >nul')); swapvectors; Exec(GetEnv('COMSPEC'),Concat('/C reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Westwood\', rareg ,'" /v CStrikeInstalled /t REG_DWORD /d 0x1 /f >nul')); swapvectors; Exec(GetEnv('COMSPEC'),Concat('/C reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Westwood\', rareg ,'" /v Version /t REG_DWORD /d 0x30003 /f >nul')); swapvectors; Exec(GetEnv('COMSPEC'),Concat('/C reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Westwood\', rareg ,'" /v WolapiInstallComplete /t REG_DWORD /d 0x1 /f >nul')); swapvectors; writeln('Done'); end; {changeReg} procedure checkdat; var F:file; n:integer; begin assign(f,Concat(rapath,'\_RA95.LCF')); {$I-} reset(f,1); n:=IOResult; if n<>0 then begin writeln(); writeln(); writeln('RA 3.03 config file _RA95.LCF not found. Aborting.'); installed:=false; end; close(f); {$I+} end; {checkdat} Procedure hackdat; type hack = record offset : integer; value : byte; end; var F:file; data:array [1..5] of hack; buffer:array[1..500] of byte; t,n,fsize:integer; actual:word; ralan:string[7]; begin assign(f,Concat(rapath,'\RA95.DAT')); {$I-} reset(f,1); n:=IOResult; if n<>0 then begin writeln(); writeln(); writeln('RA 3.03 main data file RA95.DAT not found. Aborting.'); installed:=false; end else begin ralan:=''; case filesize(f) of 2375680 : begin ralan:='English'; rareg:='Red Alert Windows 95 Edition'; data[5].offset:=1888624; end; 2385920 : begin ralan:='German'; rareg:='Alarmstufe Rot Windows 95 Edition'; data[5].offset:=1889104; end; 2386432 : begin ralan:='French'; rareg:='Alerte Rouge version Windows 95'; data[5].offset:=1889104; end; end; if ralan='' then begin writeln(); writeln(); writeln('Incorrect filesize. Cannot identify language.'); installed:=false; end else begin data[1].offset :=696108 ; data[1].value := 195; data[2].offset :=696722 ; data[2].value := 190; data[3].offset :=696725 ; data[3].value := 255; data[4].offset :=696726 ; data[4].value := 255; data[5].value := 03; for t:=1 to 5 do Begin seek(f,data[t].offset); blockwrite(f,data[t].value,1,actual); end; close(f); {$I+} {Reading _RA95.LCF} assign(f,Concat(rapath,'\_RA95.LCF')); reset(f,1); fsize:= filesize(f); blockread (f,buffer,fsize,actual); close(f); {writing new RA95.LCF} assign(f,Concat(rapath,'\RA95.LCF')); rewrite(f,1); blockwrite (f,buffer,fsize,actual); close(f); writeln('Done'); writeln(); write(ralan); writeln(' version detected.'); end; end; end; {hackdat} begin writeln('C&C The First Decade: Red Alert v3.03 fix Written by Nyerguds'); writeln('-----------------------------------------'); writeln(); installed:=true; write('Reading from registry... '); checkreg; if installed=true then begin writeln('Done'); write('Checking Red Alert 3.03 patch... '); checkdat; if installed=true then begin writeln('Done'); write('Fixing Red Alert 3.03 patch... '); hackdat; if installed=true then begin write('Fixing Red Alert registry items... '); changeReg; end; end; end else begin writeln(); writeln(); writeln('The First Decade registry entries not found. Aborting.'); end; cntin; end.