mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-13 07:14:59 +00:00
344 lines
8.5 KiB
C++
344 lines
8.5 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? */
|
|
};
|
|
|
|
enum kind {walled, unwalled, last_kind};
|
|
|
|
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;
|
|
|
|
const kind w = walled;
|
|
const kind uw = unwalled;
|
|
|
|
array<1, 50, longint> offsets;
|
|
byte num_chunks, this_chunk;
|
|
integer gd, gm;
|
|
untyped_file f;
|
|
array<0, arraysize, byte> aa;
|
|
|
|
void rdln() {
|
|
char r;
|
|
return;
|
|
do {
|
|
r = readkey();
|
|
} while (!(! keypressed()));
|
|
}
|
|
|
|
void load(kind k) {
|
|
byte a1 /*absolute $A400:800*/;
|
|
byte bit;
|
|
untyped_file f;
|
|
|
|
|
|
if (k == unwalled) assign(f, "place29.avd");
|
|
else assign(f, "walled.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);
|
|
}
|
|
|
|
void finder() {
|
|
char r;
|
|
integer x, y;
|
|
return;
|
|
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 loadtemp(string which) {
|
|
byte a0 /*absolute $A000:800*/;
|
|
byte bit;
|
|
untyped_file f;
|
|
|
|
|
|
assign(f, string("corr") + which + "tmp.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, "chunk29.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, kind k)
|
|
/* 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;
|
|
}
|
|
|
|
load(k);
|
|
|
|
setvisualpage(1);
|
|
setactivepage(1);
|
|
rdln();
|
|
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);
|
|
}
|
|
|
|
rdln();
|
|
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");
|
|
setwritemode(xorput);
|
|
|
|
loadtemp("2");
|
|
|
|
num_chunks = 32;
|
|
|
|
open_chunk();
|
|
|
|
grab(0, 11, 100, 104, 260, 41, ch_ega, false, false, uw); /*1 Geida's door. */
|
|
grab(103, 12, 203, 55, 207, 61, ch_ega, false, false, uw); /*2 "Ite mingite" sign. */
|
|
grab(123, 59, 185, 103, 254, 90, ch_ega, false, false, uw); /*3 Normal N door (rt handle)*/
|
|
grab(227, 10, 289, 56, 254, 88, ch_ega, false, false, uw); /*4 Normal N door (lt handle)*/
|
|
grab(207, 63, 294, 105, 9, 47, ch_ega, false, false, w); /*5 Window in left wall. */
|
|
grab(312, 10, 416, 56, 233, 88, ch_ega, false, false, uw); /*6 North archway */
|
|
grab(331, 78, 384, 101, 32, 64, ch_ega, false, false, w); /*7 2 torches, L wall. */
|
|
grab(607, 142, 621, 157, 233, 88, ch_ega, false, false, uw); /*8 1 torch, N wall. */
|
|
grab(417, 11, 577, 59, 311, 61, ch_ega, false, false, uw); /*9 "The Wrong Way!" sign. */
|
|
|
|
loadtemp("3");
|
|
|
|
grab(0, 11, 62, 63, 557, 108, ch_ega, false, false, w); /*10 Near right candle */
|
|
grab(64, 11, 120, 63, 18, 108, ch_ega, false, false, w); /*11 Near left candle */
|
|
grab(122, 11, 169, 55, 93, 100, ch_ega, false, false, w); /*12 Far left candle */
|
|
grab(171, 11, 222, 52, 500, 100, ch_ega, false, false, w); /*13 Far right candle */
|
|
grab(32, 68, 84, 104, 285, 70, ch_ega, false, false, uw); /*14 Far window */
|
|
grab(138, 65, 190, 92, 233, 88, ch_ega, false, false, uw); /*15 Baron du Lustie pic 1 */
|
|
grab(244, 65, 296, 92, 103, 51, ch_ega, false, false, uw); /*16 Baron du Lustie pic 2 */
|
|
grab(172, 54, 280, 63, 233, 88, ch_ega, false, false, uw); /*17 "Art Gallery" sign */
|
|
grab(341, 18, 402, 47, 563, 48, ch_ega, false, false, w); /*18 Right wall torches */
|
|
grab(528, 10, 639, 160, 528, 10, ch_ega, false, false, uw); /*19 Right wall */
|
|
grab(430, 50, 526, 88, 543, 50, ch_ega, false, false, w); /*20 Window in right wall */
|
|
grab(451, 91, 494, 152, 566, 91, ch_ega, false, false, w); /*21 Door in right wall */
|
|
grab(238, 10, 307, 14, 484, 156, ch_ega, false, false, w); /*22 Near wall door: right */
|
|
grab(239, 16, 300, 20, 300, 156, ch_ega, false, false, w); /*23 Near wall door: middle */
|
|
grab(234, 22, 306, 26, 100, 156, ch_ega, false, false, w); /*24 Near wall door: left */
|
|
grab(25, 113, 87, 156, 254, 90, ch_ega, false, false, w); /*25 Far door opening stage 1 */
|
|
grab(131, 113, 193, 156, 254, 90, ch_ega, false, false, w); /*26 Far door opening stage 2 */
|
|
grab(237, 113, 299, 156, 254, 90, ch_ega, false, false, w); /*27 Far door opening stage 3 */
|
|
|
|
loadtemp("4");
|
|
|
|
grab(0, 11, 112, 160, 0, 11, ch_ega, false, false, uw); /*28 Left wall */
|
|
grab(144, 44, 197, 76, 30, 44, ch_ega, false, false, w); /*29 Shield on L wall. */
|
|
grab(149, 90, 192, 152, 35, 90, ch_ega, false, false, w); /*30 Door in L wall. */
|
|
grab(463, 28, 527, 43, 252, 100, ch_ega, false, false, w); /*31 Archway x 2 */
|
|
grab(463, 79, 527, 94, 252, 100, ch_ega, false, false, w); /*32 Archway x 3 */
|
|
|
|
close_chunk();
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
} // End of namespace Avalanche.
|