mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-18 07:39:08 +00:00
244 lines
5.1 KiB
C++
244 lines
5.1 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 original Mortville Manor DOS source code
|
|
* Copyright (c) 1988-1989 Lankhor
|
|
*/
|
|
|
|
#include "mortevielle/outtext.h"
|
|
#include "mortevielle/level15.h"
|
|
#include "mortevielle/sprint.h"
|
|
#include "mortevielle/var_mor.h"
|
|
#include "common/str.h"
|
|
|
|
namespace Mortevielle {
|
|
|
|
Common::String delig;
|
|
const byte tabdr[32] = {
|
|
32, 101, 115, 97, 114, 105, 110,
|
|
117, 116, 111, 108, 13, 100, 99,
|
|
112, 109, 46, 118, 130, 39, 102,
|
|
98, 44, 113, 104, 103, 33, 76,
|
|
85, 106, 30, 31
|
|
};
|
|
|
|
|
|
const byte tab30[32] = {
|
|
69, 67, 74, 138, 133, 120, 77, 122,
|
|
121, 68, 65, 63, 73, 80, 83, 82,
|
|
156, 45, 58, 79, 49, 86, 78, 84,
|
|
71, 81, 64, 66, 135, 34, 136, 91
|
|
};
|
|
|
|
|
|
|
|
const byte tab31[32]= {
|
|
93, 47, 48, 53, 50, 70, 124, 75,
|
|
72, 147, 140, 150, 151, 57, 56, 51,
|
|
107, 139, 55, 89, 131, 37, 54, 88,
|
|
119, 0, 0, 0, 0, 0, 0, 0
|
|
};
|
|
|
|
void deline(int num , char *l , int &tl);
|
|
typedef unsigned char uchar;
|
|
|
|
static void cinq_huit(char &c, int &idx, byte &pt, bool &the_end) {
|
|
/*
|
|
const uchar rap[32] = {
|
|
(uchar)',', (uchar)':', (uchar)'@', (uchar)'!', (uchar)'?', (uchar)'-', (uchar)'\207',
|
|
(uchar)'\240', (uchar)'\205', (uchar)'\203', (uchar)'\202', (uchar)'\212', (uchar)'\210', (uchar)'/',
|
|
(uchar)'\213', (uchar)'\214', (uchar)'\242', (uchar)'\047', (uchar)'\223', (uchar)'"', (uchar)'\227',
|
|
(uchar)'\226', (uchar)'0', (uchar)'1', (uchar)'2', (uchar)'3', (uchar)'4', (uchar)'5',
|
|
(uchar)'6', (uchar)'7', (uchar)'8', (uchar)'9'
|
|
};
|
|
*/
|
|
uint16 oct, ocd;
|
|
|
|
/* 5-8 */
|
|
oct = t_mot[idx];
|
|
oct = ((uint16)(oct << (16 - pt))) >> (16 - pt);
|
|
if (pt < 6) {
|
|
idx = idx + 1;
|
|
oct = oct << (5 - pt);
|
|
pt = pt + 11;
|
|
oct = oct | ((uint)t_mot[idx] >> pt);
|
|
} else {
|
|
pt = pt - 5;
|
|
oct = (uint)oct >> pt;
|
|
}
|
|
|
|
switch (oct) {
|
|
case 11 : {
|
|
c = '$';
|
|
the_end = true;
|
|
}
|
|
break;
|
|
case 30:
|
|
case 31 : {
|
|
ocd = t_mot[idx];
|
|
ocd = (uint16)(ocd << (16 - pt)) >> (16 - pt);
|
|
if (pt < 6) {
|
|
idx = idx + 1;
|
|
ocd = ocd << (5 - pt);
|
|
pt = pt + 11;
|
|
ocd = ocd | ((uint)t_mot[idx] >> pt);
|
|
} else {
|
|
pt = pt - 5;
|
|
ocd = (uint)ocd >> pt;
|
|
}
|
|
if (oct == 30) c = chr(tab30[ocd]);
|
|
else c = chr(tab31[ocd]);
|
|
if (c == '\0') {
|
|
the_end = true;
|
|
c = '#';
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
c = chr(tabdr[oct]);
|
|
}
|
|
} /* 5-8 */
|
|
|
|
/**
|
|
* Decode and extract the line with the given Id
|
|
*/
|
|
void deline(int num, char *l , int &tl) {
|
|
int i, j, ts;
|
|
char let;
|
|
byte ps, k;
|
|
bool the_end;
|
|
|
|
/* DETEX */
|
|
/*debug(' => DeLine');*/
|
|
delig = "";
|
|
ts = t_rec[num].indis;
|
|
ps = t_rec[num].point;
|
|
i = ts;
|
|
tl = 1;
|
|
j = 1;
|
|
k = ps;
|
|
the_end = false;
|
|
do {
|
|
cinq_huit(let, i, k, the_end);
|
|
l[j] = let;
|
|
if (j < 254) delig = delig + let;
|
|
j = j + 1;
|
|
} while (!the_end);
|
|
tl = j - 1;
|
|
if (tl < 255)
|
|
delig.deleteLastChar(); // Remove trailing '$'
|
|
} /* DETEX */
|
|
|
|
|
|
void afftex(char *ch, int x, int y, int dx, int dy, int typ);
|
|
|
|
|
|
static int l_motsuiv(int p, char *ch, int &tab) {
|
|
int c;
|
|
|
|
int l_motsuiv_result;
|
|
c = p;
|
|
while ((ch[p] != ' ') && (ch[p] != '$') && (ch[p] != '@'))
|
|
++p;
|
|
l_motsuiv_result = tab * (p - c);
|
|
return l_motsuiv_result;
|
|
}
|
|
|
|
void afftex(char *ch, int x, int y, int dx, int dy, int typ) {
|
|
bool the_end;
|
|
int xf, yf;
|
|
int xc, yc;
|
|
int tab, p;
|
|
Common::String s;
|
|
int i, j;
|
|
|
|
|
|
/* debug(' .. Afftex');*/
|
|
putxy(x, y);
|
|
if (res == 1) tab = 10;
|
|
else tab = 6;
|
|
dx = dx * 6;
|
|
dy = dy * 6;
|
|
xc = x;
|
|
yc = y;
|
|
xf = x + dx;
|
|
yf = y + dy;
|
|
p = 1;
|
|
the_end = (ch[p] == '$');
|
|
s = "";
|
|
while (! the_end) {
|
|
switch (ch[p]) {
|
|
case '@' : {
|
|
writeg(s, typ);
|
|
s = "";
|
|
p = p + 1;
|
|
xc = x;
|
|
yc = yc + 6;
|
|
putxy(xc, yc);
|
|
}
|
|
break;
|
|
case ' ' : {
|
|
s = s + ' ';
|
|
xc = xc + tab;
|
|
p = p + 1;
|
|
if (l_motsuiv(p, ch, tab) + xc > xf) {
|
|
writeg(s, typ);
|
|
s = "";
|
|
xc = x;
|
|
yc = yc + 6;
|
|
if (yc > yf) {
|
|
do {
|
|
;
|
|
} while (!keypressed());
|
|
i = y;
|
|
do {
|
|
j = x;
|
|
do {
|
|
putxy(j, i);
|
|
writeg(" ", 0);
|
|
j = j + 6;
|
|
} while (!(j > xf));
|
|
i = i + 6;
|
|
} while (!(i > yf));
|
|
yc = y;
|
|
}
|
|
putxy(xc, yc);
|
|
}
|
|
}
|
|
break;
|
|
case '$' : {
|
|
the_end = true;
|
|
writeg(s, typ);
|
|
}
|
|
break;
|
|
default: {
|
|
s = s + ch[p];
|
|
p = p + 1;
|
|
xc = xc + tab;
|
|
}
|
|
} /* case */
|
|
}
|
|
}
|
|
|
|
} // End of namespace Mortevielle
|