diff options
Diffstat (limited to 'engines/cge/talk.cpp')
-rw-r--r-- | engines/cge/talk.cpp | 548 |
1 files changed, 234 insertions, 314 deletions
diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp index 9fd32ab7d2..1dbcbad98d 100644 --- a/engines/cge/talk.cpp +++ b/engines/cge/talk.cpp @@ -25,384 +25,304 @@ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon */ -#include "cge/general.h" -#include "cge/talk.h" -#include "cge/vol.h" -#include "cge/game.h" -#include "cge/mouse.h" -#include <dos.h> -//#include <alloc.h> -//#include <mem.h> +#include "cge/general.h" +#include "cge/talk.h" +#include "cge/vol.h" +#include "cge/game.h" +#include "cge/mouse.h" +#include <dos.h> namespace CGE { -#define WID_SIZ 256 -#define POS_SIZ 256 -#define MAP_SIZ (256*8) +#define WID_SIZ 256 +#define POS_SIZ 256 +#define MAP_SIZ (256*8) +//uint8 FONT::Wid[WID_SIZ]; +//uint16 FONT::Pos[POS_SIZ]; +//uint8 FONT::Map[MAP_SIZ]; -//-------------------------------------------------------------------------- - - -//uint8 FONT::Wid[WID_SIZ]; -//uint16 FONT::Pos[POS_SIZ]; -//uint8 FONT::Map[MAP_SIZ]; - - - - - - - -FONT::FONT (const char * name) -{ - Map = farnew(uint8, MAP_SIZ); - Pos = farnew(uint16, POS_SIZ); - Wid = farnew(uint8, WID_SIZ); - if (Map == NULL || Pos == NULL || Wid == NULL) - error("No core"); - MergeExt(Path, name, FONT_EXT); - Load(); +FONT::FONT(const char *name) { + Map = farnew(uint8, MAP_SIZ); + Pos = farnew(uint16, POS_SIZ); + Wid = farnew(uint8, WID_SIZ); + if ((Map == NULL) || (Pos == NULL) || (Wid == NULL)) + error("No core"); + MergeExt(Path, name, FONT_EXT); + Load(); } - - -FONT::~FONT (void) -{ - free(Map); - free(Pos); - free(Wid); +FONT::~FONT(void) { + free(Map); + free(Pos); + free(Wid); } - - -void FONT::Load (void) -{ - INI_FILE f(Path); - if (! f.Error) - { - f.Read(Wid, WID_SIZ); - if (! f.Error) - { - uint16 i, p = 0; - for (i = 0; i < POS_SIZ; i ++) - { - Pos[i] = p; - p += Wid[i]; - } - f.Read(Map, p); +void FONT::Load(void) { + INI_FILE f(Path); + if (! f.Error) { + f.Read(Wid, WID_SIZ); + if (! f.Error) { + uint16 i, p = 0; + for (i = 0; i < POS_SIZ; i ++) { + Pos[i] = p; + p += Wid[i]; + } + f.Read(Map, p); + } } - } } - - - -uint16 FONT::Width (const char * text) -{ - uint16 w = 0; - if (text) while (* text) w += Wid[*(text ++)]; - return w; +uint16 FONT::Width(const char *text) { + uint16 w = 0; + if (text) + while (* text) + w += Wid[*(text ++)]; + return w; } - /* -void FONT::Save (void) -{ - CFILE f((const char *) Path, WRI); - if (! f.Error) - { - f.Write(Wid, WID_SIZ); - if (! f.Error) - { - f.Write(Map, Pos[POS_SIZ-1] + Wid[WID_SIZ-1]); +void FONT::Save(void) { + CFILE f((const char *) Path, WRI); + if (! f.Error) { + f.Write(Wid, WID_SIZ); + if (! f.Error) + f.Write(Map, Pos[POS_SIZ-1] + Wid[WID_SIZ-1]); } - } } */ +FONT TALK::Font(ProgName()); -//-------------------------------------------------------------------------- - - - -FONT TALK::Font(ProgName()); - - - -TALK::TALK (const char * tx, TBOX_STYLE mode) -: SPRITE(NULL), Mode(mode) -{ - TS[0] = TS[1] = NULL; - Flags.Syst = true; - Update(tx); +TALK::TALK(const char *tx, TBOX_STYLE mode) + : SPRITE(NULL), Mode(mode) { + TS[0] = TS[1] = NULL; + Flags.Syst = true; + Update(tx); } - - - -TALK::TALK (void) -: SPRITE(NULL), Mode(PURE) -{ - TS[0] = TS[1] = NULL; - Flags.Syst = true; +TALK::TALK(void) + : SPRITE(NULL), Mode(PURE) { + TS[0] = TS[1] = NULL; + Flags.Syst = true; } - - - /* -TALK::~TALK (void) -{ - uint16 i; - for (i = 0; i < ShpCnt; i ++) - { - if (FP_SEG(ShpList[i]) != _DS) // small model: always false - { - delete ShpList[i]; - ShpList[i] = NULL; +TALK::~TALK (void) { + for (uint16 i = 0; i < ShpCnt; i ++) { + if (FP_SEG(ShpList[i]) != _DS) { // small model: always false + delete ShpList[i]; + ShpList[i] = NULL; + } } - } } */ - -void TALK::Update (const char * tx) -{ - uint16 vmarg = (Mode) ? TEXT_VM : 0; - uint16 hmarg = (Mode) ? TEXT_HM : 0; - uint16 mw = 0, mh, ln = vmarg; - const char * p; - uint8 * m; - - if (! TS[0]) - { - uint16 k = 2 * hmarg; - mh = 2 * vmarg + FONT_HIG; - for (p = tx; *p; p ++) - { - if (*p == '|' || *p == '\n') - { - mh += FONT_HIG + TEXT_LS; - if (k > mw) mw = k; - k = 2 * hmarg; - } - else k += Font.Wid[*p]; +void TALK::Update(const char *tx) { + uint16 vmarg = (Mode) ? TEXT_VM : 0; + uint16 hmarg = (Mode) ? TEXT_HM : 0; + uint16 mw = 0, mh, ln = vmarg; + const char *p; + uint8 *m; + + if (!TS[0]) { + uint16 k = 2 * hmarg; + mh = 2 * vmarg + FONT_HIG; + for (p = tx; *p; p ++) { + if (*p == '|' || *p == '\n') { + mh += FONT_HIG + TEXT_LS; + if (k > mw) + mw = k; + k = 2 * hmarg; + } else + k += Font.Wid[*p]; + } + if (k > mw) + mw = k; + TS[0] = Box(mw, mh); } - if (k > mw) mw = k; - TS[0] = Box(mw, mh); - } - - m = TS[0]->M + ln * mw + hmarg; - - while (* tx) - { - if (*tx == '|' || *tx == '\n') - m = TS[0]->M + (ln += FONT_HIG + TEXT_LS) * mw + hmarg; - else - { - int cw = Font.Wid[*tx], i; - uint8 * f = Font.Map + Font.Pos[*tx]; - for (i = 0; i < cw; i ++) - { - uint8 * p = m; - uint16 n; - register uint16 b = * (f ++); - for (n = 0; n < FONT_HIG; n ++) - { - if (b & 1) * p = TEXT_FG; - b >>= 1; - p += mw; + + m = TS[0]->M + ln * mw + hmarg; + + while (* tx) { + if (*tx == '|' || *tx == '\n') + m = TS[0]->M + (ln += FONT_HIG + TEXT_LS) * mw + hmarg; + else { + int cw = Font.Wid[*tx], i; + uint8 *f = Font.Map + Font.Pos[*tx]; + for (i = 0; i < cw; i++) { + uint8 *p = m; + uint16 n; + register uint16 b = *(f++); + for (n = 0; n < FONT_HIG; n++) { + if (b & 1) + *p = TEXT_FG; + b >>= 1; + p += mw; + } + ++m; + } } - ++ m; - } + ++tx; } - ++ tx; - } - TS[0]->Code(); - SetShapeList(TS); + TS[0]->Code(); + SetShapeList(TS); } -BITMAP * TALK::Box (uint16 w, uint16 h) -{ - uint8 * b, * p, * q; - uint16 n, r = (Mode == ROUND) ? TEXT_RD : 0; - int i; +BITMAP *TALK::Box(uint16 w, uint16 h) { + uint8 *b, * p, * q; + uint16 n, r = (Mode == ROUND) ? TEXT_RD : 0; - if (w < 8) w = 8; - if (h < 8) h = 8; - b = farnew(uint8, n = w * h); - if (! b) - error("No core"); - memset(b, TEXT_BG, n); + if (w < 8) + w = 8; + if (h < 8) + h = 8; + b = farnew(uint8, n = w * h); + if (! b) + error("No core"); + memset(b, TEXT_BG, n); - if (Mode) - { - p = b; q = b + n - w; - memset(p, LGRAY, w); - memset(q, DGRAY, w); - while (p < q) - { - p += w; - * (p-1) = DGRAY; - * p = LGRAY; - } - p = b; - for (i = 0; i < r; i ++) - { - int j; - for (j = 0; j < r-i; j ++) - { - p[ j ] = TRANS; - p[w-j-1] = TRANS; - q[ j ] = TRANS; - q[w-j-1] = TRANS; - } - p[ j ] = LGRAY; - p[w-j-1] = DGRAY; - q[ j ] = LGRAY; - q[w-j-1] = DGRAY; - p += w; - q -= w; + if (Mode) { + p = b; + q = b + n - w; + memset(p, LGRAY, w); + memset(q, DGRAY, w); + while (p < q) { + p += w; + *(p - 1) = DGRAY; + *p = LGRAY; + } + p = b; + for (int i = 0; i < r; i ++) { + int j; + for (j = 0; j < r - i; j ++) { + p[j] = TRANS; + p[w - j - 1] = TRANS; + q[j] = TRANS; + q[w - j - 1] = TRANS; + } + p[j] = LGRAY; + p[w - j - 1] = DGRAY; + q[j] = LGRAY; + q[w - j - 1] = DGRAY; + p += w; + q -= w; + } } - } - return new BITMAP(w, h, b); + return new BITMAP(w, h, b); } - - - -void TALK::PutLine (int line, const char * text) +void TALK::PutLine(int line, const char *text) { // Note: (TS[0].W % 4) have to be 0 -{ - uint16 w = TS[0]->W, h = TS[0]->H; - uint8 * v = TS[0]->V, * p; - uint16 dsiz = w >> 2; // data size (1 plane line size) - uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap - uint16 psiz = h * lsiz; // - last gap, but + plane trailer - uint16 size = 4 * psiz; // whole map size - uint16 rsiz = FONT_HIG * lsiz; // length of whole text row map - - // set desired line pointer - v += (TEXT_VM + (FONT_HIG + TEXT_LS) * line) * lsiz; - - // clear whole rectangle - p = v; // assume blanked line above text - memcpy(p, p-lsiz, rsiz); p += psiz; // tricky replicate lines for plane 0 - memcpy(p, p-lsiz, rsiz); p += psiz; // same for plane 1 - memcpy(p, p-lsiz, rsiz); p += psiz; // same for plane 2 - memcpy(p, p-lsiz, rsiz); // same for plane 3 - - // paint text line - if (text) - { - uint8 * q; - p = v + 2 + TEXT_HM/4 + (TEXT_HM%4)*psiz; - q = v + size; - - while (* text) - { - uint16 cw = Font.Wid[*text], i; - uint8 * fp = Font.Map + Font.Pos[*text]; - - for (i = 0; i < cw; i ++) - { - register uint16 b = fp[i]; - uint16 n; - for (n = 0; n < FONT_HIG; n ++) - { - if (b & 1) *p = TEXT_FG; - b >>= 1; - p += lsiz; + uint16 w = TS[0]->W, h = TS[0]->H; + uint8 *v = TS[0]->V, * p; + uint16 dsiz = w >> 2; // data size (1 plane line size) + uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap + uint16 psiz = h * lsiz; // - last gap, but + plane trailer + uint16 size = 4 * psiz; // whole map size + uint16 rsiz = FONT_HIG * lsiz; // length of whole text row map + + // set desired line pointer + v += (TEXT_VM + (FONT_HIG + TEXT_LS) * line) * lsiz; + + // clear whole rectangle + p = v; // assume blanked line above text + memcpy(p, p - lsiz, rsiz); + p += psiz; // tricky replicate lines for plane 0 + memcpy(p, p - lsiz, rsiz); + p += psiz; // same for plane 1 + memcpy(p, p - lsiz, rsiz); + p += psiz; // same for plane 2 + memcpy(p, p - lsiz, rsiz); // same for plane 3 + + // paint text line + if (text) { + uint8 *q; + p = v + 2 + TEXT_HM / 4 + (TEXT_HM % 4) * psiz; + q = v + size; + + while (* text) { + uint16 cw = Font.Wid[*text], i; + uint8 *fp = Font.Map + Font.Pos[*text]; + + for (i = 0; i < cw; i ++) { + register uint16 b = fp[i]; + uint16 n; + for (n = 0; n < FONT_HIG; n ++) { + if (b & 1) + *p = TEXT_FG; + b >>= 1; + p += lsiz; + } + p = p - rsiz + psiz; + if (p >= q) + p = p - size + 1; + } + ++text; } - p = p - rsiz + psiz; - if (p >= q) p = p - size + 1; - } - ++ text; } - } } - - - - -//-------------------------------------------------------------------------- - - - - -INFO_LINE::INFO_LINE (uint16 w) -: OldTxt(NULL) -{ - TS[0] = new BITMAP(w, FONT_HIG, TEXT_BG); - SetShapeList(TS); +INFO_LINE::INFO_LINE(uint16 w) : OldTxt(NULL) { + TS[0] = new BITMAP(w, FONT_HIG, TEXT_BG); + SetShapeList(TS); } - - - - -void INFO_LINE::Update (const char * tx) -{ - if (tx != OldTxt) - { - uint16 w = TS[0]->W, h = TS[0]->H; - uint8 * v = (uint8 *) TS[0]->V; - uint16 dsiz = w >> 2; // data size (1 plane line size) - uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap - uint16 psiz = h * lsiz; // - last gape, but + plane trailer - uint16 size = 4 * psiz; // whole map size - - // claer whole rectangle - memset(v+2, TEXT_BG, dsiz); // data bytes - memcpy(v + lsiz, v, psiz - lsiz); // tricky replicate lines - * (uint16 *) (v + psiz - 2) = EOI; // plane trailer uint16 - memcpy(v + psiz, v, 3 * psiz); // tricky replicate planes - - // paint text line - if (tx) - { - uint8 * p = v + 2, * q = p + size; - - while (* tx) - { - uint16 cw = Font.Wid[*tx], i; - uint8 * fp = Font.Map + Font.Pos[*tx]; - - for (i = 0; i < cw; i ++) - { - register uint16 b = fp[i]; - uint16 n; - for (n = 0; n < FONT_HIG; n ++) - { - if (b & 1) *p = TEXT_FG; - b >>= 1; - p += lsiz; - } - if (p >= q) p = p - size + 1; +void INFO_LINE::Update(const char *tx) { + if (tx != OldTxt) { + uint16 w = TS[0]->W, h = TS[0]->H; + uint8 *v = (uint8 *) TS[0]->V; + uint16 dsiz = w >> 2; // data size (1 plane line size) + uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap + uint16 psiz = h * lsiz; // - last gape, but + plane trailer + uint16 size = 4 * psiz; // whole map size + + // claer whole rectangle + memset(v + 2, TEXT_BG, dsiz); // data bytes + memcpy(v + lsiz, v, psiz - lsiz); // tricky replicate lines + * (uint16 *)(v + psiz - 2) = EOI; // plane trailer uint16 + memcpy(v + psiz, v, 3 * psiz); // tricky replicate planes + + // paint text line + if (tx) { + uint8 *p = v + 2, * q = p + size; + + while (*tx) { + uint16 cw = Font.Wid[*tx]; + uint8 *fp = Font.Map + Font.Pos[*tx]; + + for (uint16 i = 0; i < cw; i++) { + register uint16 b = fp[i]; + for (uint16 n = 0; n < FONT_HIG; n ++) { + if (b & 1) + *p = TEXT_FG; + b >>= 1; + p += lsiz; + } + if (p >= q) + p = p - size + 1; + } + ++tx; + } } - ++ tx; - } + OldTxt = tx; } - OldTxt = tx; - } } } // End of namespace CGE |