aboutsummaryrefslogtreecommitdiff
path: root/engines/avalanche/chunkxfk.cpp
diff options
context:
space:
mode:
authoruruk2013-06-17 10:38:38 +0200
committeruruk2013-06-17 10:38:38 +0200
commita2adda516bdf790651283201a666f253a8bfcc49 (patch)
treebdc6479a6889d15d1b25e47e28f0c86f093a9610 /engines/avalanche/chunkxfk.cpp
parent2f0e43bb2e402bbcf65175934d21ade6febaad60 (diff)
downloadscummvm-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.cpp237
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;
+}