Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
1997 utility that reads TIE Fighter .tie mission files and prints out the mission's goals, especially the bonus goals and their score which are not available in-game.
uses tierec,strngtol;
type
fgdesk=record
name:string;
typ:string;
end;
var f:file;
header:fheader;
fg:flightgroup;
msg:message;
gblgoals:array[1..3] of globalgoals;
i:integer;
primgoal:array[1..24] of string[80];
secgoal:array[1..24] of string[80];
bonusgoal:array[1..24] of string[80];
pgcount,sgcount,bgcount:integer;
strings:stringz;
fgdesc:array[1..99] of fgdesk;
fgdescnum:integer;
res_x:array[0..974] of byte;
{--------------------------------------------}
procedure setFGStrings;
function cl(s:string):string;
begin
while pos(#0,s)<>0 do delete(s,pos(#0,s),1);
cl:=s;
end;
begin
strings.name:=fg.name;
strings.name:=cl(strings.name);
strings.typ:=ShipDesc(fg.typ);
strings.typ:=cl(strings.typ);
fgdesc[fgdescnum].name:=strings.name;
fgdesc[fgdescnum].typ:=strings.typ;
inc(fgdescnum);
end;
{--------------------------------------------}
function getGenTyp(gen:byte):string;
begin
case gen of
0:getGenTyp:='Unknown 0';
1:getGenTyp:='FlightGroup';
2:getGenTyp:='Unknown 2';
3:getGenTyp:='Unknown 3';
4:getGenTyp:='Unknown 4';
5:getGenTyp:='Unknown 5';
6:getGenTyp:='Unknown 6';
7:getGenTyp:='Unknown 7';
end;
end;
{--------------------------------------------}
function IffCode(iff:byte):string;
var s:string;
begin
case iff of
0:s:='Rebel';
1:s:='Imperial';
2:s:=header.iff1;
3:s:=header.iff2;
4:s:=header.iff3;
5:s:=header.iff4;
end;
while pos(#0,s)<>0 do delete(s,pos(#0,s),1);
if iff=2 then delete(s,1,1);
Iffcode:=s;
end;
{--------------------------------------------}
function getanz(nr:byte):string;
begin
case nr of
0:begin if fg.num=1 then getanz:='' else getanz:='100% of ';end;
1:getanz:='50% of ';
2:getanz:='At least one of ';
3:getanz:='All but one of ';
4:begin
if fg.specrand<>0 then getanz:='?'
else getanz:=st(fg.specraft);
end;
5:getanz:='100% of ';
6:getanz:='75% of ';
7:getanz:='50% of ';
8:getanz:='25% of ';
9:getanz:='At least one of ';
10:getanz:='All but one of ';
end;{case}
end; {-->Getanz}
function getaction(act:byte):string;
begin
case act of
00:getaction:='always';
01:getaction:='must have arrived';
02:getaction:='must be destroyed';
03:getaction:='must be attacked';
04:getaction:='must be captured';
05:getaction:='must be inspected';
06:getaction:='must be boarded';
07:getaction:='must have finished docking';
08:getaction:='must be disabled';
09:getaction:='must have survived';
10:getaction:='not specified';
12:getaction:='must have completed mission';
19:getaction:='must be dropped off';
20:getaction:='must be reinforced';
21:getaction:='must be inspected or captured';
22:getaction:='must been boarded';
else getaction:='**--FUCKED--**';
end;{case}
end;{-->getaction}
function bonuspoints(b:byte):string;
begin
if b<=$7f then bonuspoints:=st(b*50)
else if b>=$88 then bonuspoints:='-'+st((b-$88)*50)
else bonuspoints:='-'+st((b)*50);
end;
{--------------------------------------------}
procedure setgoal;
begin
if fg.difflevel in [1,3] then exit;
if fg.actprimgoal<>10 then begin
if fg.numprimgoal=4 then
primgoal[pgcount]:=strings.typ+' '+strings.name+' '+Getanz(fg.numprimgoal)+' '+Getaction(fg.actprimgoal)+'.'
else primgoal[pgcount]:=Getanz(fg.numprimgoal)+strings.typ+' '+strings.name+' '+Getaction(fg.actprimgoal)+'.';
inc(pgcount);
end;{Primgoals}
if fg.actsecgoal<>10 then begin
if fg.numsecgoal=4 then
secgoal[sgcount]:=strings.typ+' '+strings.name+' '+Getanz(fg.numsecgoal)+' '+Getaction(fg.actsecgoal)+'.'
else secgoal[sgcount]:=Getanz(fg.numsecgoal)+strings.typ+' '+strings.name+' '+Getaction(fg.actsecgoal)+'.';
inc(sgcount);
end;{Secgoals}
if fg.actbonusgoal<>10 then begin
if fg.numprimgoal=4 then
bonusgoal[bgcount]:=strings.typ+' '+strings.name+' '+Getanz(fg.numbonusgoal)+' '+Getaction(fg.actbonusgoal)+'.'
else bonusgoal[bgcount]:=Getanz(fg.numbonusgoal)+strings.typ+' '+strings.name+' '+Getaction(fg.actbonusgoal)+
' ('+bonuspoints(fg.bonuspoints)+')'+'.';
inc(bgcount);
end;{Bonusgoals}
end;
{--------------------------------------------}
function GBGoalBuilt(cond,gen,ext,num:byte):string;
var s:string;
_cond,_gen,_ext,_num:string;
begin
GBGoalBuilt:='';
if (cond=0) or (cond=10) then exit;
_cond:=GetAction(cond);
_num:=GetAnz(num+5);
case gen of
1:begin
_gen:='FlightGroup';
_ext:=fgdesc[ext].name;
end;
2:begin
_gen:='Ship Type';
_ext:=ShipDesc(ext);
end;
5:begin
_gen:='IFF';
_ext:=IffCode(ext)+' Craft';
end;
else begin
_gen:='Unknown';
_ext:='Unknown';
end;
end;
s:=_num+'all '+_ext+' '+_cond;
GBGoalBuilt:=S;
end;
{--------------------------------------------}
procedure setGlobalGoals;
begin
with strings do begin
gblpg1:=GBGoalBuilt(GBLGoals[1].cond1,GBLGoals[1].gentyp1,GBLGoals[1].exttyp1,GBLGoals[1].numtyp1);
gblpg2:=GBGoalBuilt(GBLGoals[1].cond2,GBLGoals[1].gentyp2,GBLGoals[1].exttyp2,GBLGoals[1].numtyp2);
if GBLGoals[1].op=0 then gblpgo:='AND'
else gblpgo:='OR';
gblsg1:=GBGoalBuilt(GBLGoals[2].cond1,GBLGoals[2].gentyp1,GBLGoals[2].exttyp1,GBLGoals[2].numtyp1);
gblsg2:=GBGoalBuilt(GBLGoals[2].cond2,GBLGoals[2].gentyp2,GBLGoals[2].exttyp2,GBLGoals[2].numtyp2);
if GBLGoals[2].op=0 then gblpgo:='AND'
else gblpgo:='OR';
gblbg1:=GBGoalBuilt(GBLGoals[3].cond1,GBLGoals[3].gentyp1,GBLGoals[3].exttyp1,GBLGoals[3].numtyp1);
gblbg2:=GBGoalBuilt(GBLGoals[3].cond2,GBLGoals[3].gentyp2,GBLGoals[3].exttyp2,GBLGoals[3].numtyp2);
if GBLGoals[3].op=0 then gblpgo:='AND'
else gblpgo:='OR';
end;
end;
{--------------------------------------------}
procedure OutPut;
procedure wo(s:string);
begin
if s<>'' then WriteLn(s);
end;
begin
with strings do begin
WriteLn(Paramstr(1));
WriteLn('---> Primary Goals <---');
wo(gblpg1);
if gblpg2<>'' then WriteLn(gblpgo);
wo(gblpg2);
for i:=1 to pgcount do WriteLn(Primgoal[i]);
(***)
if (gblsg1<>'') or (gblsg2<>'') or (sgcount>1) or (secgoal[1]<>'') then begin
WriteLn('---> Secondary Goals <---');
wo(gblsg1);
if gblsg2<>'' then WriteLn(gblsgo);
wo(gblsg2);
for i:=1 to sgcount do WriteLn(secgoal[i]);
end;
(***)
if (gblbg1<>'') or (gblbg2<>'') or (bgcount>1) or (bonusgoal[1]<>'') then begin
WriteLn('---> Bonus Goals <---');
wo(gblbg1);
if gblbg2<>'' then WriteLn(gblbgo);
wo(gblbg2);
for i:=1 to bgcount do WriteLn(bonusgoal[i]);
end;
end;
end;
begin
pgcount:=1;sgcount:=1;bgcount:=1;fgdescnum:=1;
assign(f,ParamStr(1));
reset(f,1);
blockRead(f,header,sizeof(header));
for i:=1 to header.unitcount do begin
{> Single FlightGroup Operations <}
BlockRead(f,fg,sizeof(fg));
setfgstrings;
setgoal;
{> Single FlightGroup Operations end <}
end;
for i:=1 to header.messagecount do begin
BlockRead(f,msg,sizeof(msg));
end;
blockRead(f,gblgoals[1],9);
seek(f,filepos(f)+19);
blockRead(f,gblgoals[2],9);
seek(f,filepos(f)+19);
blockRead(f,gblgoals[3],9);
blockRead(f,res_x,sizeof(res_x));
setGlobalGoals;
output;
(* WriteLn(filepos(f),'/',filesize(f)); *)
close(f);
end.
unit tierec;
interface
type
stringz=record
Name:string;
Typ:String;
iffid:String;
difflevel:String;
gblpg1:string;
gblpg2:string;
gblpgo:string;
gblsg1:string;
gblsg2:string;
gblsgo:string;
gblbg1:string;
gblbg2:string;
gblbgo:string;
end;
Fheader=record
ident:word;
unitcount:byte;
res1:byte;
messagecount:byte;
res2:array[0..4] of byte;
BriefPers:byte;
res3:array[0..12] of byte;
pgcompmsg1:array[0..62] of char;
res4:byte;
pgcompmsg2:array[0..62] of char;
res5:byte;
sgcompmsg1:array[0..62] of char;
res6:byte;
sgcompmsg2:array[0..62] of char;
res7:byte;
pgfailmsg1:array[0..62] of char;
res10:byte;
pgfailmsg2:array[0..62] of char;
res11:word;
iff1:array[0..10] of char;
res12:byte;
iff2:array[0..10] of char;
res13:byte;
iff3:array[0..10] of char;
res14:byte;
iff4:array[0..10] of char;
res15:word;
end;
order=record
order:byte;
speed:byte;
repnum:byte;
srepnum:byte;
res1:byte;
res2:byte;
gentyptgt1:byte;
exttyptgt1:byte;
gentyptgt2:byte;
exttyptgt2:byte;
res3:word;
gentyptgt3:byte;
exttyptgt3:byte;
gentyptgt4:byte;
exttyptgt4:byte;
res4:word;
end;
flightgroup=record
Name:array[0..10] of char;
res1:byte;
pilname:array[0..10] of char;
res2:byte;
cargo1:array[0..10] of char;
res3:byte;
cargo2:array[0..10] of char;
res4:byte;
specraft:byte;
specrand:byte;
Typ:byte;
num:byte;
stat:byte;
missle:byte;
beam:byte;
iffid:byte;
ailevel:byte;
color:byte;
radiocnt:byte;
res5:byte;
formation:byte;
res6:byte;
res7:byte;
res8:byte;
waves:byte;
res9:byte;
you:byte;
res10:array[0..5] of byte;
difflevel:byte;
arract1:byte;
gentyp1:byte;
exttyp1:byte;
res11:array[0..7] of char;
actdelay:byte;
res12:array[0..9] of char;
arrfgnum:byte;
arrhyp:byte;
depfgnum:byte;
dephyp:byte;
altarrfgnum:byte;
altarrhyp:byte;
altdepfgnum:byte;
altdephyp:byte;
orders:array[1..3]of order;
actprimgoal:byte;
numprimgoal:byte;
actsecgoal:byte;
numsecgoal:byte;
res13:byte;
res14:byte;
actbonusgoal:byte;
numbonusgoal:byte;
bonuspoints:byte;
res16:array[0..118] of char;
visonbrief:byte;
res17:array[0..4] of char;
end;
message=record
msg:array[0..62] of char;
res1:byte;
act1:byte;
gentyp1:byte;
exttyp1:byte;
op:byte;
act2:byte;
gentyp2:byte;
exttyp2:byte;
res2:byte;
shortid:array[0..14] of char;
res3:byte;
delay:byte;
res4:byte;
end;
globalgoals=record
cond1:byte;
gentyp1:byte;
exttyp1:byte;
numtyp1:byte;
cond2:byte;
gentyp2:byte;
exttyp2:byte;
numtyp2:byte;
op:byte;
end;
globaliffnames=record
iffnr1:array[0..10] of char;
sep1:byte;
iffnr2:array[0..10] of char;
sep2:byte;
iffnr3:array[0..10] of char;
sep3:byte;
iffnr4:array[0..10] of char;
sep4:byte;
end;
radiomessage=record
Message:array[0..62] of char;
res1:byte;
Type1:byte;
which1:byte;
exact1:byte;
op:byte;
Type2:byte;
which2:byte;
exact2:byte;
res2:byte;
msgid:array[0..14] of char;
res3:byte;
delay:byte;
res4:byte;
end;
globalgoal=record
condition1:byte;
crafttype1:byte;
ExactCraft:byte;
craftanz1:byte;
condition2:byte;
crafttype2:byte;
ExactCraf2:byte;
craftanz2:byte;
op:byte;
end;
orderrec=record
Mainorder:byte;
speed:byte;
res1:longint;
typetgt1:byte;
tgt1:byte;
typtgt2:byte;
tgt2:byte;
res2:word;
typtgt3:byte;
tgt3:byte;
typtgt4:byte;
tgt4:byte;
res3:word;
end;
oneship=record
name:array[0..10] of char;
res1:array[0..12] of byte;
cargo1:array[0..10] of char;
res2:byte;
cargo2:array[0..10] of char;
res3:byte;
speccraft:byte;
specraftrandom:byte;
Typ:byte;
anz:byte;
situation:byte;
rockets:byte;
beam:byte;
owner:byte;
rang:byte;
res5:byte;
speech:byte;
res6:byte;
formation:byte;
res7:array[0..2] of byte;
waves:byte;
res8:byte;
playerpos:byte;
res9:array[0..5] of byte;
level:byte;
incomsit:byte;
res10:byte;
fgforsit:byte;
res11:array[0..7] of char;
incomtime:byte;
res12:array[0..9] of char;
arrMother:byte;
arrMethod:byte;
depMother:byte;
depMethod:byte;
res13:longint;
order:array[1..3] of orderrec;
Primgoaltype:byte;
Anzprimgoaltype:byte;
Secgoaltype:byte;
Anzsecgoaltype:byte;
Secretgoaltype:byte;
Anzsecretgoaltype:byte;
BonusGoalType:byte;
AnzBonusGoalType:byte;
bonuspoints:byte;
res15:array[0..124] of byte;
end;
shipstrings=record
name:string[11];
cargo1:string[11];
cargo2:string[11];
speccraft:String[2];
Typ:String;
anz:string[2];
situation:string[32];
rockets:string[32];
beam:string[32];
owner:string[32];
rang:string[32];
speech:string[3];
formation:string[32];
waves:string[2];
playerpos:string[2];
level:String[10];
primgoaltype:string[50];
anzprimgoaltype:string[20];
secgoaltype:string[50];
anzsecgoaltype:string[20];
secretgoaltype:string[50];
anzsecretgoaltype:string[20];
bonusgoaltype:string[50];
anzbonusgoaltype:string[20];
bonuspoints:string[10];
end;
function ShipDesc(b:byte):String;
implementation
function ShipDesc(b:byte):String;
begin
case b of
1 : ShipDesc:='X-Wing';
2 : ShipDesc:='Y-Wing';
3 : ShipDesc:='A-Wing';
4 : ShipDesc:='B-Wing';
5 : ShipDesc:='TIE Fighter';
6 : ShipDesc:='TIE Interceptor';
7 : ShipDesc:='TIE Bomber';
8 : ShipDesc:='TIE Advanced';
9 : ShipDesc:='TIE Defender';
10 : ShipDesc:='TIE New 1';
11 : ShipDesc:='TIE New 2';
12 : ShipDesc:='Missile Boat';
13 : ShipDesc:='TIE New 4';
14 : ShipDesc:='Z-95 Headhunter';
15 : ShipDesc:='Star Fighter 2';
16 : ShipDesc:='Assault Gunboat';
17 : ShipDesc:='Shuttle';
18 : ShipDesc:='Escort Shuttle';
19 : ShipDesc:='Patrol Craft 1';
20 : ShipDesc:='Patrol Craft 2';
21 : ShipDesc:='Transport';
22 : ShipDesc:='Assault Transport';
23 : ShipDesc:='New Transport 2';
24 : ShipDesc:='Tug';
25 : ShipDesc:='New Tug';
26 : ShipDesc:='Container A';
27 : ShipDesc:='Container B';
28 : ShipDesc:='Container C';
29 : ShipDesc:='Container D';
30 : ShipDesc:='Heavy Lifter';
31 : ShipDesc:='Bulk Barge';
32 : ShipDesc:='Freighter';
33 : ShipDesc:='Cargo Ferry';
34 : ShipDesc:='Modular Conveyer';
35 : ShipDesc:='Con Transport';
36 : ShipDesc:='New Freighter 3';
37 : ShipDesc:='New Freighter 4';
38 : ShipDesc:='Corellian Transport';
39 : ShipDesc:='Millenium';
40 : ShipDesc:='Corvette';
41 : ShipDesc:='Modified Corvette';
42 : ShipDesc:='Nebulon-B Frigate';
43 : ShipDesc:='Modified Frigate';
44 : ShipDesc:='Star Galleon';
45 : ShipDesc:='Carrack Cruiser';
46 : ShipDesc:='Strike Cruiser';
47 : ShipDesc:='Escort Carrier';
48 : ShipDesc:='Dreadnaught';
49 : ShipDesc:='Calamari';
50 : ShipDesc:='Light Calamari';
51 : ShipDesc:='Interdictor';
52 : ShipDesc:='V-Class SD';
53 : ShipDesc:='Star Destroyer';
54 : ShipDesc:='Super Destroyer';
55 : ShipDesc:='Container E';
56 : ShipDesc:='Ship 2';
57 : ShipDesc:='Ship 3';
58 : ShipDesc:='Ship 4';
59 : ShipDesc:='Ship 5';
60 : ShipDesc:='Platform A';
61 : ShipDesc:='Platform B';
62 : ShipDesc:='Platform C';
63 : ShipDesc:='Platform D';
64 : ShipDesc:='Platform E';
65 : ShipDesc:='Platform F';
66 : ShipDesc:='Platform 7';
67 : ShipDesc:='Platform 8';
68 : ShipDesc:='Platform 9';
69 : ShipDesc:='Platform 10';
70 : ShipDesc:='Satellite';
71 : ShipDesc:='Satellite 2';
72 : ShipDesc:='Satellite 3';
73 : ShipDesc:='Satellite 4';
74 : ShipDesc:='Satellite 5';
75 : ShipDesc:='Mine Type A';
76 : ShipDesc:='Mine Type B';
77 : ShipDesc:='Mine Type C';
78 : ShipDesc:='Mine 4';
79 : ShipDesc:='Mine 5';
80 : ShipDesc:='Probe Type A';
81 : ShipDesc:='Probe Type B';
82 : ShipDesc:='Probe 3';
83 : ShipDesc:='Buoy 1';
84 : ShipDesc:='Buoy 2';
85 : ShipDesc:='Space Objects';
else ShipDesc:='Unbekannt';
end;
end;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment