#include #include #define UBYTE unsigned char #define ULONG unsigned int #define UDUB unsigned long UBYTE Hex2Char(UBYTE x); void StoreLabel(UDUB *LabelMatrix, UBYTE *M_ENC, ULONG ri); ULONG PrintLabel(UBYTE *M_SCRIPT, UDUB *LabelMatrix, ULONG ri, ULONG si); void LinkShit(UBYTE *linkup, UBYTE *M_ROM, ULONG pos); UBYTE Hex2Char(UBYTE x) { x&=0xf; if (x<0xA) x+=0x30; else x+=0x37; return (x); } void StoreLabel(UDUB *LabelMatrix, UBYTE *M_ENC, ULONG ri) { UBYTE x; UDUB Label; Label=M_ENC[ri+3]; Label<<=8; Label+=M_ENC[ri+2]; Label<<=8; Label+=M_ENC[ri+1]; for (x=0;x<255;x++) { // search the label matrix if (!(LabelMatrix[x])) { // if this slot's got no data in it, if ((ri-0x4127F)<=Label) LabelMatrix[x]=Label; // if the jump is a forward one, put the data in it. this prevents the storing of labels which are before the jump, because i don't know how to put them up there in the file. // if (x) printf("%x, ",x); // debug shit x=254; // end the loop } } } ULONG PrintLabel(UBYTE *M_SCRIPT, UDUB *LabelMatrix, ULONG ri, ULONG si) { UBYTE x; UBYTE y=0; for (x=0;x<255;x++) { if (((ri-0x4127F)==LabelMatrix[x]) && LabelMatrix[x]) { if (!y) { y=1; M_SCRIPT[si++]=0x0D; M_SCRIPT[si++]=0x0A; M_SCRIPT[si++]=0x0D; M_SCRIPT[si++]=0x0A; M_SCRIPT[si++]='<'; M_SCRIPT[si++]='L'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='b'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; M_SCRIPT[si++]=Hex2Char((LabelMatrix[x]>>18)&0xf); M_SCRIPT[si++]=Hex2Char((LabelMatrix[x]>>16)&0xf); M_SCRIPT[si++]=Hex2Char((LabelMatrix[x]>>12)&0xf); M_SCRIPT[si++]=Hex2Char((LabelMatrix[x]>>8)&0xf); M_SCRIPT[si++]=Hex2Char((LabelMatrix[x]>>4)&0xf); M_SCRIPT[si++]=Hex2Char(LabelMatrix[x]&0xf); M_SCRIPT[si++]='>'; M_SCRIPT[si++]=0x0D; M_SCRIPT[si++]=0x0A; } LabelMatrix[x]=0; // i put this outside the loop so that it runs through the entire matrix and cleans out any matching labels, because there might be many. } } return si; } void LinkShit(UBYTE *linkup, UBYTE *M_ROM, ULONG pos) { // puts the 0-terminating string at pos into linkup. UBYTE x; // data at pos UBYTE Counter; // position in linkup for (x=0;x!=20;x++) linkup[x]=0; // flush linkup Counter=0; while (x=M_ROM[pos++]) { if (((x>0x80) && (x<0x9E)) || ((x>0xDF) && (x<0xEB))) { // generic 16-bit -> SJS linkup[Counter++]=x; x=M_ROM[pos++]; linkup[Counter++]=x; } else if ((x>0x2D) && (x<0x80)) { // hiragana 8-bit -> SJS linkup[Counter++]=0x82; linkup[Counter++]=0x72+x; } } return; } int main(void) { FILE *fin; FILE *fout; UBYTE *M_ROM; // game UBYTE *M_ENC; // Encoded Script UBYTE *M_SCRIPT; // script (to be written with this program) ULONG ri; // ROM Index ULONG si; // Script Index UDUB LabelMatrix[255];// list of all labels ULONG templong; // temp (32 bits, unsigned) ULONG templong2; // temp (32 bits, unsigned) UBYTE x; // the data within in the byte at hand UBYTE tmp; // temp (8 bits, unsigned) UBYTE linkup[30]; // string for possible links (00's if no string) printf("\n*** Radical Dreamers Script Decoder ***\n*** (c) 2000-2002 DEMIFORCE ***\n\n"); if (!(fin=fopen("rad-j.smc","rb"))) { printf("Plz rename the rom to rad-j.smc before using.\n\n"); exit(1); } M_ROM=malloc(0x200000); fread(M_ROM,1,0x200000,fin); fclose(fin); if (!(fin=fopen("rad-j.zst","rb"))) { printf("Plz rename your savestate to rad-j.zst before using. tx\n\n"); exit(1); } M_ENC=malloc(0x200000); fread(M_ENC,1,0x200000,fin); fclose(fin); M_SCRIPT=malloc(0x500000); for (x=0;x!=20;x++) linkup[x]=0; for (x=0;x!=255;x++) LabelMatrix[x]=0; si=0; ri=0x4127F; x=0; while (ri<0x6127F) { x=M_ENC[ri]; si=PrintLabel(M_SCRIPT, LabelMatrix, ri, si); if (((x>0x80) && (x<0x9E)) || ((x>0xDF) && (x<0xEB))) { // generic 16-bit -> SJS M_SCRIPT[si++]=x; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=x; } else if ((x>0x2D) && (x<0x80)) { // hiragana 8-bit -> SJS tmp=x-0x2D; M_SCRIPT[si++]=0x82; M_SCRIPT[si++]=0x9f+tmp; } else if ((x>0x27) && (x<0x2E)) { // 8-bit links tmp=(x-0x28); tmp<<=1; templong=M_ROM[tmp+0xe401]; tmp=M_ROM[tmp+0xe400]; templong<<=8; templong+=(tmp+0xe600); LinkShit(linkup, M_ROM, templong); for (tmp=0;linkup[tmp];tmp++) M_SCRIPT[si++]=linkup[tmp]; if (linkup[tmp+2]==0xFF) ri++; // in case it's in the middle of something } else { switch (x) { default: // generic M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x01: // 01 (16-bit) links ri++; x=M_ENC[ri]; templong=x; templong<<=1; templong2=M_ROM[templong+0xe401]; templong=M_ROM[templong+0xe400]; templong2<<=8; templong2+=templong; templong2+=0xe600; LinkShit(linkup, M_ROM, templong2); for (tmp=0;linkup[tmp];tmp++) M_SCRIPT[si++]=linkup[tmp]; break; case 0x03: // M_SCRIPT[si++]='<'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='p'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='U'; M_SCRIPT[si++]='p'; M_SCRIPT[si++]='>'; break; case 0x04: // dunno (24-bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x05: // ClearBG (8bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='C'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]='B'; M_SCRIPT[si++]='G'; M_SCRIPT[si++]='>'; break; case 0x06: // ClearText (8bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='C'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]='T'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='x'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='>'; // M_SCRIPT[si++]=0x0D; // M_SCRIPT[si++]=0x0A; break; case 0x07: // FadeIn (24-bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='F'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='I'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x08: // FadeOut (24-bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='F'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='O'; M_SCRIPT[si++]='u'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x09: // Indent (24bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='I'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='x'; M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='y'; M_SCRIPT[si++]='>'; break; case 0x0A: // who knows (16bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x0B: // PlaySong (16bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='P'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='y'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='g'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; /* case 0x0C: // Indent (0C 00) if (!M_ENC[ri+1]) { M_SCRIPT[si++]='<'; M_SCRIPT[si++]='I'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='>'; ri++; } else { M_SCRIPT[si++]='<'; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='C'; M_SCRIPT[si++]='>'; } break; */ case 0x0D: // Volume (24bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='V'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='u'; M_SCRIPT[si++]='m'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x0E: // who knows (32bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x10: // Play Sound M_SCRIPT[si++]='<'; M_SCRIPT[si++]='P'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='y'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='u'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x11: // Text display speed (16bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='T'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='x'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='p'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x12: // Delay (16-bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='D'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='y'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x13: // M_SCRIPT[si++]='<'; M_SCRIPT[si++]='W'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='i'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='p'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='>'; break; case 0x14: // SET (32bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]=' '; templong=M_ENC[ri+2]; templong<<=8; templong+=M_ENC[ri+1]; templong-=0xAB6D; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; M_SCRIPT[si++]=Hex2Char((templong>>12)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>8)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>4)&0xf); M_SCRIPT[si++]=Hex2Char((templong)&0xf); M_SCRIPT[si++]=' '; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri+=3; x=M_ENC[ri]; M_SCRIPT[si++]='>'; break; case 0x15: // Random (16bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='R'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='n'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='m'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; ri++; templong=M_ENC[ri]+0x1493; M_SCRIPT[si++]=Hex2Char((templong>>12)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>8)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>4)&0xf); M_SCRIPT[si++]=Hex2Char((templong)&0xf); M_SCRIPT[si++]='>'; break; case 0x16: // ADD (32bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='A'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=' '; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; templong=M_ENC[ri+2]; templong<<=8; templong+=M_ENC[ri+1]; templong-=0xAB6D; ri+=3; M_SCRIPT[si++]=Hex2Char((templong>>12)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>8)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>4)&0xf); M_SCRIPT[si++]=Hex2Char((templong)&0xf); x=M_ENC[ri]; M_SCRIPT[si++]='>'; break; case 0x17: // SUB (32bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='u'; M_SCRIPT[si++]='b'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='c'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=' '; M_SCRIPT[si++]='f'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='m'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; templong=M_ENC[ri+2]; templong<<=8; templong+=M_ENC[ri+1]; templong-=0xAB6D; ri+=3; M_SCRIPT[si++]=Hex2Char((templong>>12)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>8)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>4)&0xf); M_SCRIPT[si++]=Hex2Char((templong)&0xf); x=M_ENC[ri]; M_SCRIPT[si++]='>'; break; case 0x18: // Arithmatic OR (32bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='O'; M_SCRIPT[si++]='R'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; templong=M_ENC[ri+2]; templong<<=8; templong+=M_ENC[ri+1]; templong-=0xAB6D; M_SCRIPT[si++]=Hex2Char((templong>>12)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>8)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>4)&0xf); M_SCRIPT[si++]=Hex2Char((templong)&0xf); M_SCRIPT[si++]=' '; M_SCRIPT[si++]='w'; M_SCRIPT[si++]='i'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='h'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri+=3; x=M_ENC[ri]; M_SCRIPT[si++]='>'; break; case 0x19: // Arithmatic AND (32bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='A'; M_SCRIPT[si++]='N'; M_SCRIPT[si++]='D'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; templong=M_ENC[ri+2]; templong<<=8; templong+=M_ENC[ri+1]; templong-=0xAB6D; M_SCRIPT[si++]=Hex2Char((templong>>12)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>8)&0xf); M_SCRIPT[si++]=Hex2Char((templong>>4)&0xf); M_SCRIPT[si++]=Hex2Char((templong)&0xf); M_SCRIPT[si++]=' '; M_SCRIPT[si++]='w'; M_SCRIPT[si++]='i'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='h'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri+=3; x=M_ENC[ri]; M_SCRIPT[si++]='>'; break; case 0x1A: // Goto (32bit) StoreLabel(LabelMatrix, M_ENC, ri); M_SCRIPT[si++]='<'; M_SCRIPT[si++]='G'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; ri++; x=M_ENC[ri+2]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri++; x=M_ENC[ri-2]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x1B: // if/goto (64bit) StoreLabel(LabelMatrix, M_ENC, ri); M_SCRIPT[si++]='<'; M_SCRIPT[si++]='I'; M_SCRIPT[si++]='f'; M_SCRIPT[si++]=' '; x=M_ENC[ri+4]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; x=M_ENC[ri+5]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; x=M_ENC[ri+6]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; x=M_ENC[ri+7]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='G'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); x=M_ENC[ri+2]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); x=M_ENC[ri+1]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; ri+=7; break; case 0x1C: // if/then shit (48bit?) StoreLabel(LabelMatrix, M_ENC, ri); M_SCRIPT[si++]='<'; M_SCRIPT[si++]='G'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; ri++; x=M_ENC[ri+2]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri++; x=M_ENC[ri-2]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=' '; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='f'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; ri++; x=M_ENC[ri+1]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri++; x=M_ENC[ri-1]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='m'; M_SCRIPT[si++]='s'; M_SCRIPT[si++]='>'; break; case 0x1D: // choice thingy StoreLabel(LabelMatrix, M_ENC, ri); M_SCRIPT[si++]='<'; M_SCRIPT[si++]='C'; M_SCRIPT[si++]='h'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='i'; M_SCRIPT[si++]='c'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]=' '; x=M_ENC[ri+3]; M_SCRIPT[si++]='0'; M_SCRIPT[si++]='x'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); x=M_ENC[ri+2]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); x=M_ENC[ri+1]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); ri+=4; if ((x=M_ENC[ri])!=0xFF) { M_SCRIPT[si++]=' '; M_SCRIPT[si++]='i'; M_SCRIPT[si++]='f'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); } M_SCRIPT[si++]='>'; break; case 0x1E: // start timer for 1C (8bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]='t'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]='C'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='c'; M_SCRIPT[si++]='k'; M_SCRIPT[si++]='>'; break; case 0x1F: // Line Feed M_SCRIPT[si++]=0xD; M_SCRIPT[si++]=0xA; break; case 0x20: ri++; x=M_ENC[ri]; if (!x) { // Player (20 00) M_SCRIPT[si++]='<'; M_SCRIPT[si++]='S'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]='g'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='>'; } else { M_SCRIPT[si++]='<'; M_SCRIPT[si++]='P'; M_SCRIPT[si++]='l'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='y'; M_SCRIPT[si++]='e'; M_SCRIPT[si++]='r'; M_SCRIPT[si++]=' '; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; } break; case 0x22: M_SCRIPT[si++]='<'; // LoadGFX (32bit) M_SCRIPT[si++]='L'; M_SCRIPT[si++]='o'; M_SCRIPT[si++]='a'; M_SCRIPT[si++]='d'; M_SCRIPT[si++]='G'; M_SCRIPT[si++]='F'; M_SCRIPT[si++]='X'; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; /* case 0x23: // who knows M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; */ case 0x24: // who knows (24bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; case 0x27: // who knows (16bit) M_SCRIPT[si++]='<'; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]=','; M_SCRIPT[si++]=' '; ri++; x=M_ENC[ri]; M_SCRIPT[si++]=Hex2Char((x>>4)&0xf); M_SCRIPT[si++]=Hex2Char(x&0xf); M_SCRIPT[si++]='>'; break; } } ri++; } M_SCRIPT[si++]='<'; M_SCRIPT[si++]='E'; M_SCRIPT[si++]='O'; M_SCRIPT[si++]='F'; M_SCRIPT[si++]='>'; M_SCRIPT[si++]=0xD; M_SCRIPT[si++]=0xA; // for (x=0;x!=255;x++) { // printf("%x, ",LabelMatrix[x]); // } if (!(fout=fopen("script-j.txt","wb"))) { printf("Plz make a file called script-j.txt before using. tx\n"); exit(1); } fwrite(M_SCRIPT,1,si,fout); fclose(fout); free(M_ROM); free(M_ENC); free(M_SCRIPT); printf("Successfully decoded rad-j.zst into script-j.txt.\n\n"); exit(0); }