scummvm/engines/avalanche/chunkxfk.cpp

297 lines
5.9 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
/*
* This code is based on the original source code of Lord Avalot d'Argent version 1.3.
* Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman.
*/
#include "graph.h"
/*#include "Tommys.h"*/
/*#include "Crt.h"*/
namespace Avalanche {
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;
}
} // End of namespace Avalanche.