program TS203modfix; uses crt, dos; type hack = record offset : longint; oldvalue : byte; newvalue : byte; end; var fileok:boolean; const nocddata:array [1..39] of hack = ( // nocd hack (offset: $000754A0; oldvalue: $81; newvalue: $33), (offset: $000754A1; oldvalue: $EC; newvalue: $C0), (offset: $000754A2; oldvalue: $48; newvalue: $83), (offset: $000754A3; oldvalue: $01; newvalue: $FF), (offset: $000754A4; oldvalue: $00; newvalue: $01), (offset: $000754A5; oldvalue: $00; newvalue: $75), (offset: $000754A6; oldvalue: $53; newvalue: $01), (offset: $000754A7; oldvalue: $55; newvalue: $40), (offset: $000754A8; oldvalue: $8B; newvalue: $C3), (offset: $000756E4; oldvalue: $83; newvalue: $3B), (offset: $000756E5; oldvalue: $F8; newvalue: $05), (offset: $000756E6; oldvalue: $FF; newvalue: $00), (offset: $000756E7; oldvalue: $7E; newvalue: $1A), (offset: $000756E8; oldvalue: $15; newvalue: $71), (offset: $000756E9; oldvalue: $3B; newvalue: $00), (offset: $000756EA; oldvalue: $F8; newvalue: $0F), (offset: $000756EB; oldvalue: $74; newvalue: $85), (offset: $000756EC; oldvalue: $05; newvalue: $9F), (offset: $000756ED; oldvalue: $83; newvalue: $00), (offset: $000756EE; oldvalue: $FF; newvalue: $00), (offset: $000756EF; oldvalue: $FF; newvalue: $00), (offset: $000756F0; oldvalue: $75; newvalue: $90), (offset: $000756F1; oldvalue: $0C; newvalue: $90), (offset: $0007578F; oldvalue: $8B; newvalue: $3B), (offset: $00075790; oldvalue: $4C; newvalue: $C7), (offset: $00075791; oldvalue: $24; newvalue: $0F), (offset: $00075792; oldvalue: $10; newvalue: $85), (offset: $00075793; oldvalue: $85; newvalue: $59), (offset: $00075794; oldvalue: $C9; newvalue: $FF), (offset: $00075795; oldvalue: $7F; newvalue: $FF), (offset: $00075796; oldvalue: $15; newvalue: $FF), (offset: $00075797; oldvalue: $8B; newvalue: $A3), (offset: $00075798; oldvalue: $4C; newvalue: $00), (offset: $00075799; oldvalue: $24; newvalue: $1A), (offset: $0007579A; oldvalue: $14; newvalue: $71), (offset: $0007579B; oldvalue: $57; newvalue: $00), (offset: $0007579C; oldvalue: $8B; newvalue: $EB), (offset: $0007579D; oldvalue: $01; newvalue: $0E), (offset: $000AB8FD; oldvalue: $05; newvalue: $03) ); procedure cntin; begin writeln; writeln('Press any key to continue.'); repeat until keypressed; ReadKey(); while keypressed do ReadKey(); {Clears the keyboard buffer} end; {cntin} procedure checkdat; var f:file; buffer:array[1..12] of byte; check:array[1..12] of byte; teller,status:integer; actual:word; begin assign(f,ParamStr(1)); {$I-} reset(f,1); status:=IOResult; if status<>0 then begin writeln(); writeln('Error opening "',ParamStr(1),'"'); fileok:=false; end else begin check[1] := $D9; check[2] := $56; check[3] := $57; check[4] := $8B; check[5] := $F2; check[6] := $8D; check[7] := $4C; check[8] := $24; check[9] := $18; check[10] := $E8; check[11] := $59; check[12] := $56; seek(f,$000754A9); blockread (f,buffer,12,actual); for teller:=1 to 12 do Begin if check[teller]<>buffer[teller] then fileok:=false; end; close(f); {$I+} end; end; Procedure hackdat; var f:file; teller,status:integer; actual:word; begin write('Patching...'); assign(f,ParamStr(1)); {$I-} reset(f,1); status:=IOResult; if status<>0 then begin writeln(); writeln('Error opening "',ParamStr(1),'"'); fileok:=false; end else begin for teller:=1 to high(nocddata) do begin seek(f,nocddata[teller].offset); blockwrite(f,nocddata[teller].newvalue,1,actual); end; close(f); {$I+} writeln(' Done'); end; end; {hackdat} begin writeln('C&C The First Decade: Tiberian Sun v2.03 mod fix Written by Nyerguds'); writeln('------------------------------------------------'); writeln(); fileok:=true; if ParamCount = 0 then writeln( 'Drop a TS v2.03 exe file onto the icon of this program to patch it.') else begin checkdat; if fileok<>true then writeln( 'This is not a valid TS v2.03 exe file!') else hackdat; end; cntin; end.