7 #define ADS ":::AGSalphainfo " VERSION " by rofl0r:::"
9 static int usage(char *argv0
) {
10 fprintf(stderr
, ADS
"\nusage:\n%s [-s spriteno] DIR\n"
11 "prints alphachannel flags of all sprites, or specified sprite, in game file.\n"
12 "gamefile is typically ac2game.dta or game28.dta inside DIR.\n"
17 #define SPF_ALPHACHANNEL 0x10
19 int main(int argc
, char**argv
) {
20 int c
, flags
= 0, spriteno
= -1;
21 while ((c
= getopt(argc
, argv
, "s:")) != EOF
) switch(c
) {
22 case 's': spriteno
= atoi(optarg
); break;
23 default: return usage(argv
[0]);
25 if(!argv
[optind
]) return usage(argv
[0]);
26 char *dir
= argv
[optind
];
30 if(!ADF_find_datafile(dir
, fnbuf
, sizeof(fnbuf
)))
33 enum ADF_open_error aoe
= ADF_open(a
, fnbuf
);
34 if(aoe
!= AOE_success
&& aoe
<= AOE_gamebase
) {
35 fprintf(stderr
, "failed to open/process data file: %s\n", AOE2str(aoe
));
37 } else if (aoe
!= AOE_success
) {
38 fprintf(stderr
, "warning: failed to process some non-essential parts (%s) of gamefile, probably from a newer game format\n", AOE2str(aoe
));
41 off_t off
= ADF_get_spriteflagsstart(a
);
42 unsigned nsprites
= ADF_get_spritecount(a
);
45 FILE *f
= fopen(fnbuf
, "rb");
47 fseeko(f
, off
, SEEK_SET
);
48 unsigned char *buf
= malloc(nsprites
);
49 fread(buf
, 1, nsprites
, f
);
53 static const char *offon
[] = { "OFF", "ON" };
54 for(i
=0;i
<nsprites
;++i
) {
55 if(spriteno
== -1 || spriteno
== i
)
56 printf("sprite %zu: alpha %s\n", i
, offon
[!!(buf
[i
] & SPF_ALPHACHANNEL
)]);