diff options
Diffstat (limited to 'engines/avalanche/avmenu.cpp')
-rw-r--r-- | engines/avalanche/avmenu.cpp | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/engines/avalanche/avmenu.cpp b/engines/avalanche/avmenu.cpp new file mode 100644 index 0000000000..3cfff7d8b6 --- /dev/null +++ b/engines/avalanche/avmenu.cpp @@ -0,0 +1,312 @@ +#include "ptoc.h" + + +#include "graph.h" +/*#include "Crt.h"*/ +/*#include "Tommys.h"*/ + +typedef matrix<'\0','\377',0,15,byte> fonttype; + +fonttype font; +word storage_seg,storage_ofs; +byte result; +string registrant; + +void icons() +{ + untyped_file f; + word gd,gm; byte bit; + byte v; + + assign(f,"menu.avd"); + reset(f,1); + + for( bit=0; bit <= 3; bit ++) + { + port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; + for( gd=70; gd <= 266; gd ++) + blockread(f,mem[0xa000*gd*80+6],9); + + for( gd=0; gd <= 32; gd ++) + { + blockread(f,v,1); + for( gm=0; gm <= 5; gm ++) + mem[0xa000*73+((70+gd+gm*33)*80)]=v; /* 79 */ + } + + } + close(f); + + bit=getpixel(0,0); + + setfillstyle(1, 7); for( gd=0; gd <= 5; gd ++) bar(114, 73+gd*33,583, 99+gd*33); + setfillstyle(1,15); for( gd=0; gd <= 5; gd ++) bar(114, 70+gd*33,583, 72+gd*33); + setfillstyle(1, 8); for( gd=0; gd <= 5; gd ++) bar(114,100+gd*33,583,102+gd*33); + +} + +void load_regi_info(); + + +static char decode1(char c) +{ + byte b; + + char decode1_result; + b=ord(c)-32; + decode1_result=chr(( (b & 0xf) << 3) + ((cardinal)(b & 0x70) >> 4)); + return decode1_result; +} + + + +static char decode2(char c) +{ + char decode2_result; + decode2_result=chr( ((ord(c) & 0xf) << 2) + 0x43); + return decode2_result; +} + + + +static boolean checker(string proper,string check) +{ + byte fv; boolean ok; + + boolean checker_result; + ok=true; + for( fv=1; fv <= length(proper); fv ++) + if ((ord(proper[fv]) & 0xf)!=((cardinal)(ord(check[fv])-0x43) >> 2)) + ok=false; + + checker_result=ok; + return checker_result; +} + +void load_regi_info() +{ + text t; + byte fv; + string x; + byte namelen,numlen; + string namechk,numchk; + string reginum; + + + /*$I-*/ + assign(t,"register.dat"); reset(t); + /*$I+*/ + + if (ioresult!=0) + { + registrant="(Unregistered evaluation copy.)"; + return; + } + + for( fv=1; fv <= 53; fv ++) t >> NL; + t >> x >> NL; + close(t); + + namelen=107-ord(x[1]); numlen=107-ord(x[2]); + + registrant=copy(x,3,namelen); + reginum=copy(x,4+namelen,numlen); + namechk=copy(x,4+namelen+numlen,namelen); + numchk=copy(x,4+namelen+numlen+namelen,numlen); + + for( fv=1; fv <= namelen; fv ++) registrant[fv]=decode1(registrant[fv]); + for( fv=1; fv <= numlen; fv ++) reginum[fv]=decode1(reginum[fv]); + + if ((! checker(registrant,namechk)) || (! checker(reginum,numchk))) + registrant="\?\"!\? ((.)"; + else + registrant=registrant+" ("+reginum+")."; + +} + +void flesh_colours() {; /* assembler; +asm + mov ax,$1012; + mov bx,21; { 21 = light pink (why?) */ + /* mov cx,1; + mov dx,seg @flesh; + mov es,dx; + mov dx,offset @flesh; + int $10; + + mov dx,seg @darkflesh; + mov es,dx; + mov dx,offset @darkflesh; + mov bx,5; { 5 = dark pink. */ + /*int $10; + + jmp @TheEnd; + + @flesh: + db 56,35,35; + + @darkflesh: + db 43,22,22; + + @TheEnd: */ + } + +void setup() +{ + integer gd,gm; + file<fonttype> ff; + + if (paramstr(1)!="jsb") exit(255); + checkbreak=false; + val(paramstr(2),storage_seg,gd); + val(paramstr(3),storage_ofs,gd); + + assign(ff,"avalot.fnt"); + reset(ff); ff >> font; close(ff); + + gd=3; gm=1; initgraph(gd,gm,""); + setvisualpage(1); + + icons(); +} + +void big(word x,word y, string z, boolean notted); +static word start,image; + + +static void generate(byte from, boolean& notted) +{ + byte fv; + + image=0; + for( fv=0; fv <= 7; fv ++) + image += (from & (1 << fv)) << fv; + + image += image << 1; + image=hi(image)+lo(image)*256; + if (notted) image=~ image; +} + +void big(word x,word y, string z, boolean notted) +{ + byte fv,ff;byte bit; + + start=x+y*80; + + for( fv=1; fv <= length(z); fv ++) + { + for( ff=1; ff <= 12; ff ++) + { + generate(font[z[fv]][ff+1], notted); + for( bit=0; bit <= 2; bit ++) + { + port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; + memw[0xa000*start+ ff*160]=image; + memw[0xa000*start+80+ff*160]=image; + } + } + start += 2; + } + bit=getpixel(0,0); +} + +void centre(integer y, string z) +{ + big(40-(length(z)),y,z,false); +} + +void option(byte which, string what) +{ + big(16,41+which*33,string((char)(which+48))+')',true); + big(24,41+which*33,what,true); +} + +void invert(integer x1,integer y1,integer x2,integer y2) +{ + word s; pointer p; + + s=imagesize(x1,y1,x2,y2); + getmem(p,s); + getimage(x1,y1,x2,y2,p); + putimage(x1,y1,p,4); + sound(y1); delay(30); + sound(600-y2); delay(20); + nosound; delay(200); + putimage(x1,y1,p,0); + delay(250); +} + +void wait() +{ + word x; char r; boolean pressed; + + x=0; pressed=false; + do { + setfillstyle(6,15); bar(x ,330,x-1,337); + setfillstyle(1, 0); bar(x-2,330,x-3,337); + delay(40); x += 1; + + if (keypressed()) + { + r=readkey(); + if (r=='\0') + { + r=readkey(); /* and...? */ + } else + { /* Not an extended keystroke. */ + if (set::of(range('1','6'),cspace,cescape,creturn, eos).has(r)) pressed=true; + } + } + + } while (!((x==640) || pressed)); + + if ((r==cspace) || (r==creturn)) r='1'; + if (r==cescape) r='6'; + if (pressed) + { + result=ord(r)-48; + invert(48,37+result*33,114,69+result*33); + } else result=177; +} + +void show_up() +{ + setvisualpage(0); +} + +void loadmenu() +{ + untyped_file f; byte bit; + + assign(f,"mainmenu.avd"); + reset(f,1); + for( bit=0; bit <= 3; bit ++) + { + port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; + blockread(f,mem[0xa000*0],59*80); + } + close(f); + bit=getpixel(0,0); +} + +int main(int argc, const char* argv[]) +{ + pio_initialize(argc, argv); + setup(); + loadmenu(); + load_regi_info(); + option(1,"Play the game."); + option(2,"Read the background."); + option(3,"Preview... perhaps..."); + option(4,"View the documentation."); + option(5,"Registration info."); + option(6,"Exit back to DOS."); + centre(275,registrant); + centre(303,"Make your choice, or wait for the demo."); + + show_up(); + wait(); + mem[storage_seg*storage_ofs]=result; + closegraph(); + return EXIT_SUCCESS; +} |