diff options
author | uruk | 2013-06-17 10:38:38 +0200 |
---|---|---|
committer | uruk | 2013-06-17 10:38:38 +0200 |
commit | a2adda516bdf790651283201a666f253a8bfcc49 (patch) | |
tree | bdc6479a6889d15d1b25e47e28f0c86f093a9610 /engines/avalanche/chunkxfk.cpp | |
parent | 2f0e43bb2e402bbcf65175934d21ade6febaad60 (diff) | |
download | scummvm-rg350-a2adda516bdf790651283201a666f253a8bfcc49.tar.gz scummvm-rg350-a2adda516bdf790651283201a666f253a8bfcc49.tar.bz2 scummvm-rg350-a2adda516bdf790651283201a666f253a8bfcc49.zip |
AVALANCHE: Initial PtoC output.
Diffstat (limited to 'engines/avalanche/chunkxfk.cpp')
-rw-r--r-- | engines/avalanche/chunkxfk.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/engines/avalanche/chunkxfk.cpp b/engines/avalanche/chunkxfk.cpp new file mode 100644 index 0000000000..70748b9a5f --- /dev/null +++ b/engines/avalanche/chunkxfk.cpp @@ -0,0 +1,237 @@ +#include "ptoc.h" + + +#include "graph.h" +/*#include "Tommys.h"*/ +/*#include "Crt.h"*/ + + +enum flavourtype {ch_ega,ch_bgi, last_flavourtype}; + +struct chunkblocktype { + flavourtype flavour; + integer x,y; + integer xl,yl; + longint size; + boolean natural; + + boolean memorise; /* Hold it in memory? */ +}; + +const array<1,44,char> chunkheader = +string("Chunk-type AVD file, for an Avvy game.")+'\32'+'\261'+'\x30'+'\x1'+'\x75'+'\261'; + +const integer arraysize = 12000; + +array<1,30,longint> offsets; +byte num_chunks,this_chunk; +integer gd,gm; +untyped_file f; +array<0,arraysize,byte> aa; + +void finder() +{ + char r; integer x,y; + + setfillstyle(0,0); setcolor(14); + x=320; y=100; setwritemode(xorput); + do { + bar(0,0,200,10); + outtextxy(0,0,strf(x)+','+strf(y)); + line(x-20,y,x+20,y); line(x,y-20,x,y+20); + do {; } while (!keypressed()); + line(x-20,y,x+20,y); line(x,y-20,x,y+20); + switch (readkey()) { + case '\15': return; break; + case '8': y -= 10; break; + case '4': x -= 10; break; + case '6': x += 10; break; + case '2': y += 10; break; + case '\0': switch (readkey()) { + case cup: y -= 1; break; + case cdown: y += 1; break; + case cleft: x -= 1; break; + case cright: x += 1; break; + } + break; + } + } while (!false); +} + +void load() +{ + byte a1 /*absolute $A400:800*/; + byte bit; + untyped_file f; + + + assign(f,"place50.avd"); reset(f,1); + seek(f,177); + for( bit=0; bit <= 3; bit ++) + { + port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; + blockread(f,a1,12080); + } + + close(f); + bit=getpixel(0,0); + setvisualpage(1); setactivepage(1); + finder(); + setvisualpage(0); setactivepage(0); +} + +void loadtemp() +{ + byte a0 /*absolute $A000:800*/; + byte bit; + untyped_file f; + + + assign(f,"chunkbi4.avd"); reset(f,1); + seek(f,177); + for( bit=0; bit <= 3; bit ++) + { + port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; + blockread(f,a0,12080); + } + close(f); + + bit=getpixel(0,0); + + finder(); +} + +void open_chunk() +{ + assign(f,"chunk50.avd"); + rewrite(f,1); + blockwrite(f,chunkheader,sizeof(chunkheader)); + blockwrite(f,num_chunks,1); + blockwrite(f,offsets,num_chunks*4); + + this_chunk=0; +} + +void close_chunk() +{ + seek(f,45); + blockwrite(f,offsets,num_chunks*4); /* make sure they're right! */ + close(f); +} + +void mgrab(integer x1,integer y1,integer x2,integer y2, word size) +{ + integer yy; word aapos; byte length,bit; + + if (size>arraysize) + { + restorecrtmode(); + output << "*** SORRY! *** Increase the arraysize constant to be greater" << NL; + output << " than " << size << '.' << NL; + exit(0); + } + + aapos=0; + + length=x2-x1; + + for( bit=0; bit <= 3; bit ++) + { + port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; + for( yy=y1; yy <= y2; yy ++) + { + move(mem[0xa400*yy*80+x1],aa[aapos],length); + aapos += length; + } + } + bit=getpixel(0,0); + +} + +void grab(integer x1,integer y1,integer x2,integer y2,integer realx,integer realy, flavourtype flav, + boolean mem,boolean nat) + /* yes, I *do* know how to spell "really"! */ +{ + word s; + pointer p; + chunkblocktype ch; + +/* rectangle(x1,y1,x2,y2); exit;*/ + this_chunk += 1; + offsets[this_chunk]=filepos(f); + + + s=imagesize(x1,y1,x2,y2); + getmem(p,s); + getimage(x1,y1,x2,y2,p); + + { + ch.flavour=flav; + ch.x=realx; ch.y=realy; + + ch.xl=x2-x1; + ch.yl=y2-y1; + ch.size=s; + ch.memorise=mem; + ch.natural=nat; + } + + setvisualpage(1); + setactivepage(1); + input >> NL; + putimage(ch.x,ch.y,p,0); + + if (flav==ch_ega) + { + freemem(p,s); + s=4*(((x2 / 8)-(x1 / 8))+2)*(y2-y1+1); + { + ch.size=s; + ch.x=ch.x / 8; + ch.xl=((realx-ch.x*8)+(x2-x1)+7) / 8; + mgrab(ch.x,ch.y,ch.x+ch.xl,ch.y+ch.yl,s); + } + } else + /* For BGI pictures. */ + { + ch.x=ch.x / 8; + ch.xl=(ch.xl+7) / 8; + ch.size=imagesize(ch.x*8,ch.y,(ch.x+ch.xl)*8,ch.y+ch.yl); + } + + input >> NL; + setvisualpage(0); + setactivepage(0); + + blockwrite(f,ch,sizeof(ch)); + + switch (flav) { + case ch_ega : if (! nat) blockwrite(f,aa,s); break; + case ch_bgi : { + if (! nat) blockwrite(f,p,s); + freemem(p,s); + } + break; + } +/* rectangle(x1,y1,x2,y2);*/ +} + +int main(int argc, const char* argv[]) +{ + pio_initialize(argc, argv); + gd=3; gm=0; initgraph(gd,gm,"c:\\bp\\bgi"); + load(); + loadtemp(); + setwritemode(xorput); + + num_chunks=4; + + open_chunk(); + + grab( 46, 53,107, 81,246, 88,ch_ega,false,false); /*1 - all numbers are */ + grab(115, 53,175, 81,248, 88,ch_ega,false,false); /*2 door stages. */ + grab(180, 53,241, 81,246, 88,ch_ega,false,false); /*3 */ + grab(180, 53,246, 84,246, 88,ch_bgi,true ,true ); /*4 */ + close_chunk(); + return EXIT_SUCCESS; +} |