diff options
32 files changed, 449 insertions, 394 deletions
diff --git a/engines/cge/bitmap.cpp b/engines/cge/bitmap.cpp index 4112ccb380..943f1cf154 100644 --- a/engines/cge/bitmap.cpp +++ b/engines/cge/bitmap.cpp @@ -202,18 +202,18 @@ BMP_PTR BITMAP::Code(void) { int bpl; if (V) { // 2nd pass - fill the hide table - for (i = 0; i < H; i ++) { + for (i = 0; i < H; i++) { B[i].skip = 0xFFFF; B[i].hide = 0x0000; } } - for (bpl = 0; bpl < 4; bpl ++) { // once per each bitplane + for (bpl = 0; bpl < 4; bpl++) { // once per each bitplane uint8 *bm = M; bool skip = (bm[bpl] == TRANS); uint16 j; cnt = 0; - for (i = 0; i < H; i ++) { // once per each line + for (i = 0; i < H; i++) { // once per each line uint8 pix; for (j = bpl; j < W; j += 4) { pix = bm[j]; @@ -282,7 +282,7 @@ BMP_PTR BITMAP::Code(void) { B = (HideDesc *)(V + sizV); } cnt = 0; - for (i = 0; i < H; i ++) { + for (i = 0; i < H; i++) { if (B[i].skip == 0xFFFF) { // whole line is skipped B[i].skip = (cnt + SCR_WID) >> 2; cnt = 0; @@ -334,7 +334,7 @@ bool BITMAP::SolidAt(int x, int y) { while (true) { uint16 w, t; - w = * (uint16 *) m; + w = *(uint16 *) m; m += 2; t = w & 0xC000; w &= 0x3FFF; diff --git a/engines/cge/btfile.cpp b/engines/cge/btfile.cpp index a6ba3d85b0..db0ebc2d5f 100644 --- a/engines/cge/btfile.cpp +++ b/engines/cge/btfile.cpp @@ -42,7 +42,7 @@ namespace CGE { BTFILE::BTFILE(const char *name, IOMODE mode, CRYPT *crpt) : IOHAND(name, mode, crpt) { - for (int i = 0; i < BT_LEVELS; i ++) { + for (int i = 0; i < BT_LEVELS; i++) { Buff[i].Page = new BT_PAGE; Buff[i].PgNo = BT_NONE; Buff[i].Indx = -1; @@ -54,7 +54,7 @@ BTFILE::BTFILE(const char *name, IOMODE mode, CRYPT *crpt) BTFILE::~BTFILE(void) { - for (int i = 0; i < BT_LEVELS; i ++) { + for (int i = 0; i < BT_LEVELS; i++) { PutPage(i); delete Buff[i].Page; } @@ -72,7 +72,7 @@ void BTFILE::PutPage(int lev, bool hard) { BT_PAGE *BTFILE::GetPage(int lev, uint16 pgn) { if (Buff[lev].PgNo != pgn) { - uint32 pos = pgn * sizeof(BT_PAGE); + int32 pos = pgn * sizeof(BT_PAGE); PutPage(lev); Buff[lev].PgNo = pgn; if (Size() > pos) { @@ -90,9 +90,6 @@ BT_PAGE *BTFILE::GetPage(int lev, uint16 pgn) { return Buff[lev].Page; } -// Does this work, or does it have to compare the entire buffer? -#define memicmp(s1, s2, n) scumm_strnicmp((const char *)s1, (const char *)s2, n) - BT_KEYPACK *BTFILE::Find(const char *key) { int lev = 0; uint16 nxt = BT_ROOT; @@ -101,8 +98,9 @@ BT_KEYPACK *BTFILE::Find(const char *key) { // search if (pg->Hea.Down != BT_NONE) { int i; - for (i = 0; i < pg->Hea.Count; i ++) { - if (memicmp(key, pg->Inn[i].Key, BT_KEYLEN) < 0) + for (i = 0; i < pg->Hea.Count; i++) { + // Does this work, or does it have to compare the entire buffer? + if (scumm_strnicmp((const char *) key, (const char*)pg->Inn[i].Key, BT_KEYLEN) < 0) break; } nxt = (i) ? pg->Inn[i - 1].Down : pg->Hea.Down; @@ -110,9 +108,10 @@ BT_KEYPACK *BTFILE::Find(const char *key) { ++ lev; } else { int i; - for (i = 0; i < pg->Hea.Count - 1; i ++) + for (i = 0; i < pg->Hea.Count - 1; i++) { if (scumm_stricmp((const char *)key, (const char *)pg->Lea[i].Key) <= 0) break; + } Buff[lev].Indx = i; return &pg->Lea[i]; } @@ -122,7 +121,7 @@ BT_KEYPACK *BTFILE::Find(const char *key) { int keycomp(const void *k1, const void *k2) { - return memicmp(k1, k2, BT_KEYLEN); + return scumm_strnicmp((const char *) k1, (const char*) k2, BT_KEYLEN); } @@ -136,15 +135,15 @@ void BTFILE::Make(BT_KEYPACK *keypack, uint16 count) { *Leaf = GetPage(1, n); Root->Hea.Down = n; PutPage(0, true); - while (count --) { + while (count--) { if (Leaf->Hea.Count >= ArrayCount(Leaf->Lea)) { PutPage(1, true); // save filled page Leaf = GetPage(1, ++n); // take empty page memcpy(Root->Inn[Root->Hea.Count].Key, keypack->Key, BT_KEYLEN); - Root->Inn[Root->Hea.Count ++].Down = n; + Root->Inn[Root->Hea.Count++].Down = n; Buff[0].Updt = true; } - Leaf->Lea[Leaf->Hea.Count ++] = * (keypack ++); + Leaf->Lea[Leaf->Hea.Count++] = *(keypack++); Buff[1].Updt = true; } } diff --git a/engines/cge/cfile.cpp b/engines/cge/cfile.cpp index da56587ebe..85e51a94c1 100644 --- a/engines/cge/cfile.cpp +++ b/engines/cge/cfile.cpp @@ -126,7 +126,7 @@ uint16 IOBUF::Read(uint8 *buf) { Ptr += n; if (eol) { ++ Ptr; - * (buf ++) = '\n'; + *(buf++) = '\n'; ++ total; if (Ptr >= Lim) ReadBuff(); @@ -186,14 +186,14 @@ int IOBUF::Read(void) { if (Lim == 0) return -1; } - return Buff[Ptr ++]; + return Buff[Ptr++]; } void IOBUF::Write(uint8 b) { if (Lim >= IOBUF_SIZE) WriteBuff(); - Buff[Lim ++] = b; + Buff[Lim++] = b; } diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index 287586e092..2fd196f509 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -45,7 +45,8 @@ CGEEngine::CGEEngine(OSystem *syst, const ADGameDescription *gameDescription) // Debug/console setup DebugMan.addDebugChannel(kCGEDebug, "general", "CGE general debug channel"); - debug("CGEEngine::CGEEngine"); + _isDemo = _gameDescription->flags & ADGF_DEMO; + } void CGEEngine::setup() { @@ -58,22 +59,22 @@ void CGEEngine::setup() { VGA::init(); // Initialise engine objects - Text = new TEXT(ProgName(), 128); + Text = new TEXT(this, ProgName(), 128); Vga = new VGA(M13H); Heart = new HEART; - Hero = new WALK(NULL); - Sys = new SYSTEM(); - PocLight = new SPRITE(LI); - Mouse = new MOUSE; + Hero = new WALK(this, NULL); + Sys = new SYSTEM(this); + PocLight = new SPRITE(this, LI); + Mouse = new MOUSE(this); for (int i = 0; i < POCKET_NX; i++) - Pocket[i] = new SPRITE(NULL); - Sprite = new SPRITE(NULL); - MiniCave = new SPRITE(NULL); - Shadow = new SPRITE(NULL); - HorzLine = new SPRITE(HL); - InfoLine = new INFO_LINE(INFO_W); - CavLight = new SPRITE(PR); - DebugLine = new INFO_LINE(SCR_WID); + Pocket[i] = new SPRITE(this, NULL); + Sprite = new SPRITE(this, NULL); + MiniCave = new SPRITE(this, NULL); + Shadow = new SPRITE(this, NULL); + HorzLine = new SPRITE(this, HL); + InfoLine = new INFO_LINE(this, INFO_W); + CavLight = new SPRITE(this, PR); + DebugLine = new INFO_LINE(this, SCR_WID); MB[0] = new BITMAP("BRICK"); MB[1] = NULL; HL[0] = new BITMAP("HLINE"); @@ -91,8 +92,8 @@ void CGEEngine::setup() { LI[2] = new BITMAP("LITE2"); LI[3] = new BITMAP("LITE3"); LI[4] = NULL; - Snail = new SNAIL(false); - Snail_ = new SNAIL(true); + Snail = new SNAIL(this, false); + Snail_ = new SNAIL(this, true); OffUseCount = atoi(Text->getText(OFF_USE_COUNT)); } diff --git a/engines/cge/cge.h b/engines/cge/cge.h index f8857f045f..c3f241b2fe 100644 --- a/engines/cge/cge.h +++ b/engines/cge/cge.h @@ -23,6 +23,7 @@ #ifndef CGE_H #define CGE_H +#include "cge/general.h" #include "common/random.h" #include "engines/engine.h" #include "gui/debugger.h" @@ -47,15 +48,51 @@ public: ~CGEEngine(); const ADGameDescription *_gameDescription; + bool _isDemo; virtual Common::Error run(); GUI::Debugger *getDebugger() { return _console; } + void cge_main(); + void SwitchCave(int cav); + void StartCountDown(); + void Quit(); + void ResetQSwitch(); + void OptionTouch(int opt, uint16 mask); + void LoadGame(XFILE &file, bool tiny); + void SetMapBrick(int x, int z); + void SwitchMapping(); + void LoadSprite(const char *fname, int ref, int cav, int col, int row, int pos); + void LoadScript(const char *fname); + void LoadUser(); + void RunGame(); + bool ShowTitle(const char *name); + void Movie(const char *ext); + void TakeName(); + void Inf(const char *txt); + void SelectSound(); + void SNSelect(); + void dummy() {} + void NONE(); + void SB(); + void CaveDown(); + void XCave(); + void QGame(); + void SBM(); + void GUS(); + void GUSM(); + void MIDI(); + void AUTO(); + void SetPortD(); + void SetPortM(); + void SetIRQ(); + void SetDMA(); + void MainLoop(); + private: CGEConsole *_console; - void setup(); }; diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index d49f71cd99..cd8a8ff9df 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -44,6 +44,7 @@ #include "cge/gettext.h" #include "cge/mixer.h" #include "cge/cge_main.h" +#include "cge/cge.h" #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -54,7 +55,7 @@ namespace CGE { #define STACK_SIZ (K(2)) -#define SVGCHKSUM (1956+Now+OldLev+Game+Music+DemoText) +#define SVGCHKSUM (1956 + Now + OldLev + Game + Music + DemoText) #define SVG0NAME ("{{INIT}}" SVG_EXT) #define SVG0FILE CFILE @@ -141,7 +142,6 @@ static int Startup = 1; int OffUseCount; uint16 *intStackPtr = false; - HXY HeroXY[CAVE_MAX] = {{0, 0}}; BAR Barriers[1 + CAVE_MAX] = { { 0xFF, 0xFF } }; @@ -247,12 +247,12 @@ struct SAVTAB { }; -static void LoadGame(XFILE &file, bool tiny = false) { +void CGEEngine::LoadGame(XFILE &file, bool tiny = false) { SAVTAB *st; SPRITE *spr; int i; - for (st = SavTab; st->Ptr; st ++) { + for (st = SavTab; st->Ptr; st++) { if (file.Error) error("Bad SVG"); file.Read((uint8 *)((tiny || st->Flg) ? st->Ptr : &i), st->Len); @@ -273,22 +273,22 @@ static void LoadGame(XFILE &file, bool tiny = false) { if (! tiny) { // load sprites & pocket while (! file.Error) { - SPRITE S(NULL); + SPRITE S(this, NULL); uint16 n = file.Read((uint8 *) &S, sizeof(S)); if (n != sizeof(S)) break; S.Prev = S.Next = NULL; - spr = (scumm_stricmp(S.File + 2, "MUCHA") == 0) ? new FLY(NULL) - : new SPRITE(NULL); + spr = (scumm_stricmp(S.File + 2, "MUCHA") == 0) ? new FLY(this, NULL) + : new SPRITE(this, NULL); if (spr == NULL) error("No core"); *spr = S; Vga->SpareQ->Append(spr); } - for (i = 0; i < POCKET_NX; i ++) { + for (i = 0; i < POCKET_NX; i++) { register int r = pocref[i]; Pocket[i] = (r < 0) ? NULL : Vga->SpareQ->Locate(r); } @@ -307,7 +307,7 @@ static void SaveGame(XFILE &file) { SPRITE *spr; int i; - for (i = 0; i < POCKET_NX; i ++) { + for (i = 0; i < POCKET_NX; i++) { register SPRITE *s = Pocket[i]; pocref[i] = (s) ? s->Ref : -1; } @@ -315,7 +315,7 @@ static void SaveGame(XFILE &file) { volume[0] = SNDDrvInfo.VOL2.D; volume[1] = SNDDrvInfo.VOL2.M; - for (st = SavTab; st->Ptr; st ++) { + for (st = SavTab; st->Ptr; st++) { if (file.Error) error("Bad SVG"); file.Write((uint8 *) st->Ptr, st->Len); @@ -384,8 +384,8 @@ CLUSTER Trace[MAX_FIND_LEVEL]; int FindLevel; -WALK::WALK(BMP_PTR *shpl) - : SPRITE(shpl), Dir(NO_DIR), TracePtr(-1) { +WALK::WALK(CGEEngine *vm, BMP_PTR *shpl) + : SPRITE(vm, shpl), Dir(NO_DIR), TracePtr(-1), _vm(vm) { } @@ -449,7 +449,7 @@ int WALK::Distance(SPRITE *spr) { dz = - dz; dx = dx * dx + dz * dz; - for (dz = 1; dz * dz < dx; dz ++) + for (dz = 1; dz * dz < dx; dz++) ; return dz - 1; @@ -484,7 +484,7 @@ void WALK::FindWay(CLUSTER c) { extern uint16 Target; if (c != Here) { - for (FindLevel = 1; FindLevel <= MAX_FIND_LEVEL; FindLevel ++) { + for (FindLevel = 1; FindLevel <= MAX_FIND_LEVEL; FindLevel++) { signed char x, z; Here.Split(x, z); Target = (z << 8) | x; @@ -544,13 +544,15 @@ void WALK::Reach(SPRITE *spr, int mode) { class SQUARE : public SPRITE { public: - SQUARE(void); + SQUARE(CGEEngine *vm); void Touch(uint16 mask, int x, int y); +private: + CGEEngine *_vm; }; -SQUARE::SQUARE(void) - : SPRITE(MB) { +SQUARE::SQUARE(CGEEngine *vm) + : SPRITE(vm, MB), _vm(vm) { Flags.Kill = true; Flags.BDel = false; } @@ -565,8 +567,8 @@ void SQUARE::Touch(uint16 mask, int x, int y) { } -static void SetMapBrick(int x, int z) { - SQUARE *s = new SQUARE; +void CGEEngine::SetMapBrick(int x, int z) { + SQUARE *s = new SQUARE(this); if (s) { static char n[] = "00:00"; s->Goto(x * MAP_XGRID, MAP_TOP + z * MAP_ZGRID); @@ -578,10 +580,9 @@ static void SetMapBrick(int x, int z) { } } -void dummy(void) {} -static void SwitchMapping(void); +//static void SwitchMapping(void); static void SwitchColorMode(void); -static void StartCountDown(void); +//static void StartCountDown(void); static void SwitchDebug(void); static void SwitchMusic(void); static void KillSprite(void); @@ -596,16 +597,17 @@ static void KeyClick(void) { } -static void ResetQSwitch(void) { +void CGEEngine::ResetQSwitch() { SNPOST_(SNSEQ, 123, 0, NULL); KeyClick(); } -static void Quit(void) { - static CHOICE QuitMenu[] = { { NULL, StartCountDown }, - { NULL, ResetQSwitch }, - { NULL, dummy } +void CGEEngine::Quit() { + static CHOICE QuitMenu[] = { + { NULL, &CGEEngine::StartCountDown }, + { NULL, &CGEEngine::ResetQSwitch }, + { NULL, &CGEEngine::dummy } }; if (Snail->Idle() && ! Hero->Flags.Hide) { @@ -615,7 +617,7 @@ static void Quit(void) { } else { QuitMenu[0].Text = Text->getText(QUIT_TEXT); QuitMenu[1].Text = Text->getText(NOQUIT_TEXT); - (new VMENU(QuitMenu, -1, -1))->SetName(Text->getText(QUIT_TITLE)); + (new VMENU(this, QuitMenu, -1, -1))->SetName(Text->getText(QUIT_TITLE)); SNPOST_(SNSEQ, 123, 1, NULL); KeyClick(); } @@ -652,7 +654,7 @@ static void PostMiniStep(int stp) { void SYSTEM::SetPal(void) { int i; DAC *p = VGA::SysPal + 256 - ArrayCount(StdPal); - for (i = 0; i < ArrayCount(StdPal); i ++) { + for (i = 0; i < ArrayCount(StdPal); i++) { p[i].R = StdPal[i].R >> 2; p[i].G = StdPal[i].G >> 2; p[i].B = StdPal[i].B >> 2; @@ -743,7 +745,7 @@ static void CaveUp(void) { } -static void CaveDown(void) { +void CGEEngine::CaveDown() { SPRITE *spr; if (! HorzLine->Flags.Hide) SwitchMapping(); @@ -761,13 +763,13 @@ static void CaveDown(void) { } -static void XCave(void) { +void CGEEngine::XCave() { CaveDown(); CaveUp(); } -static void QGame(void) { +void CGEEngine::QGame() { CaveDown(); OldLev = Lev; SaveSound(); @@ -778,7 +780,7 @@ static void QGame(void) { } -void SwitchCave(int cav) { +void CGEEngine::SwitchCave(int cav) { if (cav != Now) { Heart->Enable = false; if (cav < 0) { @@ -792,11 +794,10 @@ void SwitchCave(int cav) { if (Hero) { Hero->Park(); Hero->Step(0); -#ifndef DEMO + if (!_isDemo) ///// protection: auto-destruction on! ---------------------- - Vga->SpareQ->Show = STARTUP::Summa * (cav <= CAVE_MAX); + Vga->SpareQ->Show = STARTUP::Summa * (cav <= CAVE_MAX); /////-------------------------------------------------------- -#endif } CavLight->Goto(CAVE_X + ((Now - 1) % CAVE_NX) * CAVE_DX + CAVE_SX, CAVE_Y + ((Now - 1) / CAVE_NX) * CAVE_DY + CAVE_SY); @@ -811,7 +812,7 @@ void SwitchCave(int cav) { } } -SYSTEM::SYSTEM() : SPRITE(NULL) { +SYSTEM::SYSTEM(CGEEngine *vm) : SPRITE(vm, NULL), _vm(vm) { FunDel = HEROFUN0; SetPal(); Tick(); @@ -819,7 +820,6 @@ SYSTEM::SYSTEM() : SPRITE(NULL) { void SYSTEM::Touch(uint16 mask, int x, int y) { static int pp = 0; - void SwitchCave(int cav); FunTouch(); @@ -861,7 +861,7 @@ void SYSTEM::Touch(uint16 mask, int x, int y) { if (KEYBOARD::Key[ALT]) SaveMapping(); else - SwitchMapping(); + _vm->SwitchMapping(); break; case F1: SwitchDebug(); @@ -910,7 +910,7 @@ void SYSTEM::Touch(uint16 mask, int x, int y) { break; case F10 : if (Snail->Idle() && ! Hero->Flags.Hide) - StartCountDown(); + _vm->StartCountDown(); break; case 'J': if (pp == 0) @@ -955,14 +955,14 @@ void SYSTEM::Touch(uint16 mask, int x, int y) { if (mask & L_UP) { if (cav && Snail->Idle() && Hero->TracePtr < 0) - SwitchCave(cav); + _vm->SwitchCave(cav); if (!HorzLine->Flags.Hide) { if (y >= MAP_TOP && y < MAP_TOP + MAP_HIG) { int8 x1, z1; XZ(x, y).Split(x1, z1); CLUSTER::Map[z1][x1] = 1; - SetMapBrick(x1, z1); + _vm->SetMapBrick(x1, z1); } } else { @@ -1056,18 +1056,17 @@ static void SwitchMusic(void) { } -static void StartCountDown(void) { +void CGEEngine::StartCountDown() { //SNPOST(SNSEQ, 123, 0, NULL); SwitchCave(-1); } -#ifndef DEMO -static void TakeName(void) { +void CGEEngine::TakeName() { if (GET_TEXT::Ptr) SNPOST_(SNKILL, -1, 0, GET_TEXT::Ptr); else { - GET_TEXT *tn = new GET_TEXT(Text->getText(GETNAME_PROMPT), UsrFnam, 8, KeyClick); + GET_TEXT *tn = new GET_TEXT(this, Text->getText(GETNAME_PROMPT), UsrFnam, 8, KeyClick); if (tn) { tn->SetName(Text->getText(GETNAME_TITLE)); tn->Center(); @@ -1077,15 +1076,14 @@ static void TakeName(void) { } } } -#endif -static void SwitchMapping(void) { +void CGEEngine::SwitchMapping() { if (HorzLine->Flags.Hide) { int i; - for (i = 0; i < MAP_ZCNT; i ++) { + for (i = 0; i < MAP_ZCNT; i++) { int j; - for (j = 0; j < MAP_XCNT; j ++) { + for (j = 0; j < MAP_XCNT; j++) { if (CLUSTER::Map[i][j]) SetMapBrick(j, i); } @@ -1227,7 +1225,7 @@ static void SwitchDebug(void) { } -static void OptionTouch(int opt, uint16 mask) { +void CGEEngine::OptionTouch(int opt, uint16 mask) { switch (opt) { case 1 : if (mask & L_UP) @@ -1239,7 +1237,7 @@ static void OptionTouch(int opt, uint16 mask) { else if (mask & R_UP) if (! MIXER::Appear) { MIXER::Appear = true; - new MIXER(BUTTON_X, BUTTON_Y); + new MIXER(this, BUTTON_X, BUTTON_Y); } break; case 3 : @@ -1258,7 +1256,7 @@ void SPRITE::Touch(uint16 mask, int x, int y) { if (mask & (R_DN | L_DN)) Sprite = this; if (Ref / 10 == 12) { - OptionTouch(Ref % 10, mask); + _vm->OptionTouch(Ref % 10, mask); return; } if (Flags.Syst) @@ -1310,7 +1308,7 @@ void SPRITE::Touch(uint16 mask, int x, int y) { if ((mask & L_UP) && Snail->Idle()) { if (Flags.Kept) { int n; - for (n = 0; n < POCKET_NX; n ++) { + for (n = 0; n < POCKET_NX; n++) { if (Pocket[n] == this) { SelectPocket(n); break; @@ -1323,7 +1321,7 @@ void SPRITE::Touch(uint16 mask, int x, int y) { } -static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row = 0, int pos = 0) { +void CGEEngine::LoadSprite(const char *fname, int ref, int cav, int col = 0, int row = 0, int pos = 0) { static const char *Comd[] = { "Name", "Type", "Phase", "East", "Left", "Right", "Top", "Bottom", "Seq", "Near", "Take", @@ -1390,7 +1388,7 @@ static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row // make sprite of choosen type switch (type) { case 1 : { // AUTO - Sprite = new SPRITE(NULL); + Sprite = new SPRITE(this, NULL); if (Sprite) { Sprite->Goto(col, row); //Sprite->Time = 1;//-----------$$$$$$$$$$$$$$$$ @@ -1398,7 +1396,7 @@ static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row break; } case 2 : { // WALK - WALK *w = new WALK(NULL); + WALK *w = new WALK(this, NULL); if (w && ref == 1) { w->Goto(col, row); if (Hero) @@ -1435,7 +1433,7 @@ static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row l->By = 13; l->Cx = 300; l->Cy = 500; - * (long *) &l->Dx = 0; // movex * cnt + *(long *) &l->Dx = 0; // movex * cnt l->Goto(col, row); } Sprite = l; @@ -1443,13 +1441,13 @@ static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row break; } case 5 : { // FLY - FLY *f = new FLY(NULL); + FLY *f = new FLY(this, NULL); Sprite = f; //////Sprite->Time = 1;//-----------$$$$$$$$$$$$$$ break; } default: { // DEAD - Sprite = new SPRITE(NULL); + Sprite = new SPRITE(this, NULL); if (Sprite) Sprite->Goto(col, row); break; @@ -1473,7 +1471,7 @@ static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row } -static void LoadScript(const char *fname) { +void CGEEngine::LoadScript(const char *fname) { char line[LINE_MAX]; char *SpN; int SpI, SpA, SpX, SpY, SpZ; @@ -1533,30 +1531,29 @@ static void LoadScript(const char *fname) { } -static void MainLoop(void) { +void CGEEngine::MainLoop() { SayDebug(); -#ifdef DEMO - static uint32 tc = 0; - if (/* FIXME: TimerCount - tc >= ((182L*6L) * 5L) && */ Talk == NULL && Snail.Idle()) { - if (Text->getText(DemoText)) { - SNPOST(SNSOUND, -1, 4, NULL); // drumla - SNPOST(SNINF, -1, DemoText, NULL); - SNPOST(SNLABEL, -1, -1, NULL); - if (Text->getText(++ DemoText) == NULL) - DemoText = DEMO_TEXT + 1; + if (_isDemo) { + static uint32 tc = 0; + if (/* FIXME: TimerCount - tc >= ((182L * 6L) * 5L) && */ Talk == NULL && Snail->Idle()) { + if (Text->getText(DemoText)) { + SNPOST(SNSOUND, -1, 4, NULL); // drumla + SNPOST(SNINF, -1, DemoText, NULL); + SNPOST(SNLABEL, -1, -1, NULL); + if (Text->getText(++ DemoText) == NULL) + DemoText = DEMO_TEXT + 1; + } + //FIXME: tc = TimerCount; } - //FIXME: tc = TimerCount; } -#endif - Vga->Show(); Snail_->RunCom(); Snail->RunCom(); } -void LoadUser(void) { +void CGEEngine::LoadUser() { // set scene if (STARTUP::Mode == 0) { // user .SVG file found CFILE cfile = CFILE(UsrPath(UsrFnam), REA, RCrypt); @@ -1577,7 +1574,7 @@ void LoadUser(void) { } -static void RunGame(void) { +void CGEEngine::RunGame() { Text->Clear(); Text->Preload(100, 1000); LoadHeroXY(); @@ -1688,7 +1685,7 @@ static void RunGame(void) { } -void Movie(const char *ext) { +void CGEEngine::Movie(const char *ext) { const char *fn = ProgName(ext); if (INI_FILE::Exist(fn)) { LoadScript(fn); @@ -1710,13 +1707,13 @@ void Movie(const char *ext) { } -bool ShowTitle(const char *name) { +bool CGEEngine::ShowTitle(const char *name) { BITMAP::Pal = VGA::SysPal; BMP_PTR LB[] = { new BITMAP(name), NULL }; BITMAP::Pal = NULL; bool usr_ok = false; - SPRITE D(LB); + SPRITE D(this, LB); D.Flags.Kill = true; D.Flags.BDel = true; D.Center(); @@ -1751,42 +1748,43 @@ bool ShowTitle(const char *name) { } if (STARTUP::Mode < 2) { -#ifdef DEMO - strcpy(UsrFnam, ProgName(SVG_EXT)); - usr_ok = true; -#else - //----------------------------------------- + if (_isDemo) { + strcpy(UsrFnam, ProgName(SVG_EXT)); + usr_ok = true; + } else { + //----------------------------------------- #ifndef EVA #ifdef CD - STARTUP::Summa |= (0xC0 + (DriveCD(0) << 6)) & 0xFF; + STARTUP::Summa |= (0xC0 + (DriveCD(0) << 6)) & 0xFF; #else -// Boot * b = ReadBoot(getdisk()); - warning("ShowTitle: FIXME ReadBoot"); - Boot *b = ReadBoot(0); - uint32 sn = (b->XSign == 0x29) ? b->Serial : b->lTotSecs; - free(b); - sn -= ((IDENT *)Copr)->disk; - STARTUP::Summa |= Lo(sn) | Hi(sn); +// Boot * b = ReadBoot(getdisk()); + warning("ShowTitle: FIXME ReadBoot"); + Boot *b = ReadBoot(0); + uint32 sn = (b->XSign == 0x29) ? b->Serial : b->lTotSecs; + free(b); + sn -= ((IDENT *)Copr)->disk; + STARTUP::Summa |= Lo(sn) | Hi(sn); #endif + //----------------------------------------- + Movie("X00"); // paylist + Vga->CopyPage(1, 2); + Vga->CopyPage(0, 1); + Vga->ShowQ->Append(Mouse); + //Mouse.On(); + Heart->Enable = true; + for (TakeName(); GET_TEXT::Ptr;) + MainLoop(); + Heart->Enable = false; + if (KEYBOARD::Last() == Enter && *UsrFnam) + usr_ok = true; + if (usr_ok) + strcat(UsrFnam, SVG_EXT); + //Mouse.Off(); + Vga->ShowQ->Clear(); + Vga->CopyPage(0, 2); #endif - //----------------------------------------- - Movie("X00"); // paylist - Vga->CopyPage(1, 2); - Vga->CopyPage(0, 1); - Vga->ShowQ->Append(Mouse); - //Mouse.On(); - Heart->Enable = true; - for (TakeName(); GET_TEXT::Ptr;) - MainLoop(); - Heart->Enable = false; - if (KEYBOARD::Last() == Enter && *UsrFnam) - usr_ok = true; - if (usr_ok) - strcat(UsrFnam, SVG_EXT); - //Mouse.Off(); - Vga->ShowQ->Clear(); - Vga->CopyPage(0, 2); -#endif + } + if (usr_ok && STARTUP::Mode == 0) { const char *n = UsrPath(UsrFnam); if (CFILE::Exist(n)) { @@ -1808,11 +1806,10 @@ bool ShowTitle(const char *name) { Vga->CopyPage(0, 2); -#ifdef DEMO - return true; -#else - return (STARTUP::Mode == 2 || usr_ok); -#endif + if (_isDemo) + return true; + else + return (STARTUP::Mode == 2 || usr_ok); } @@ -1824,7 +1821,7 @@ void StkDump (void) { */ -void cge_main(void) { +void CGEEngine::cge_main(void) { uint16 intStack[STACK_SIZ / 2]; intStackPtr = intStack; @@ -1841,17 +1838,15 @@ void cge_main(void) { HorzLine->Flags.Hide = true; //srand((uint16) Timer()); - Sys = new SYSTEM; + Sys = new SYSTEM(this); if (Music && STARTUP::SoundOk) LoadMIDI(0); if (STARTUP::Mode < 2) Movie(LGO_EXT); if (ShowTitle("WELCOME")) { -#ifndef DEMO - if (STARTUP::Mode == 1) + if ((!_isDemo) && (STARTUP::Mode == 1)) Movie("X02"); // intro -#endif RunGame(); Startup = 2; if (FINIS) diff --git a/engines/cge/cge_main.h b/engines/cge/cge_main.h index f3a95e786c..146c3cb6c9 100644 --- a/engines/cge/cge_main.h +++ b/engines/cge/cge_main.h @@ -35,11 +35,11 @@ namespace CGE { #define TSEQ 96 -#define HTALK (TSEQ+4) -#define TOO_FAR (TSEQ+5) -#define NO_WAY (TSEQ+5) -#define POC_FUL (TSEQ+5) -#define OFF_USE (TSEQ+6) +#define HTALK (TSEQ + 4) +#define TOO_FAR (TSEQ + 5) +#define NO_WAY (TSEQ + 5) +#define POC_FUL (TSEQ + 5) +#define OFF_USE (TSEQ + 6) #define EXIT_OK_TEXT 40 #define NOMUSIC_TEXT 98 #define BADSVG_TEXT 99 @@ -57,25 +57,21 @@ namespace CGE { #define DEMO_TEXT 300 #define NOSOUND_TEXT 310 #define PAN_HIG 40 -#define WORLD_HIG (SCR_HIG-PAN_HIG) +#define WORLD_HIG (SCR_HIG - PAN_HIG) #define INFO_X 177 #define INFO_Y 164 #define INFO_W 140 - -#if defined(DEMO) #define CAVE_X 4 #define CAVE_Y 166 #define CAVE_SX 0 #define CAVE_SY 0 + +#ifdef DEMO #define CAVE_DX 23 #define CAVE_DY 29 #define CAVE_NX 3 #define CAVE_NY 1 #else -#define CAVE_X 4 -#define CAVE_Y 166 -#define CAVE_SX 0 -#define CAVE_SY 0 #define CAVE_DX 9 #define CAVE_DY 10 #define CAVE_NX 8 @@ -101,7 +97,7 @@ namespace CGE { #define SHP_MAX 1024 #define STD_DELAY 3 #define LEV_MAX 5 -#define CAVE_MAX (CAVE_NX*CAVE_NY) +#define CAVE_MAX (CAVE_NX * CAVE_NY) #define MAX_FIND_LEVEL 3 #define MAX_DISTANCE 3 #define INI_EXT ".INI" @@ -111,8 +107,8 @@ namespace CGE { #define WALKSIDE 10 #define BUSY_REF 500 #define SYSTIMERATE 6 // 12 Hz -#define HEROFUN0 (40*12) -#define HEROFUN1 ( 2*12) +#define HEROFUN0 (40 * 12) +#define HEROFUN1 ( 2 * 12) #define PAIN (Flag[0]) #define FINIS (Flag[3]) @@ -122,12 +118,14 @@ class SYSTEM : public SPRITE { public: int FunDel; - SYSTEM(); + SYSTEM(CGEEngine *vm); void SetPal(); void FunTouch(); void Touch(uint16 mask, int x, int y); void Tick(); +private: + CGEEngine *_vm; }; @@ -144,9 +142,10 @@ public: class WALK : public SPRITE { public: CLUSTER Here; - enum DIR { NO_DIR = -1, NN, EE, SS, WW } Dir; int TracePtr; - WALK(BMP_PTR *shpl); + + enum DIR { NO_DIR = -1, NN, EE, SS, WW } Dir; + WALK(CGEEngine *vm, BMP_PTR *shpl); void Tick(void); void FindWay(CLUSTER c); void FindWay(SPRITE *spr); @@ -155,6 +154,9 @@ public: void Park(void); bool Lower(SPRITE *spr); void Reach(SPRITE *spr, int mode = -1); +private: + CGEEngine *_vm; + }; @@ -163,7 +165,6 @@ CLUSTER XZ(COUPLE xy); void ExpandSprite(SPRITE *spr); void ContractSprite(SPRITE *spr); -void cge_main(void); extern WALK *Hero; extern VGA *Vga; diff --git a/engines/cge/config.cpp b/engines/cge/config.cpp index 9ffda8d635..4aa4f40c8a 100644 --- a/engines/cge/config.cpp +++ b/engines/cge/config.cpp @@ -78,92 +78,92 @@ static int DevName[] = { }; static CHOICE DevMenu[] = { - { NULL, NONE }, - { NULL, SB }, - { NULL, SBM }, - { NULL, GUS }, - { NULL, GUSM }, - { NULL, MIDI }, - { NULL, AUTO }, - { NULL, NULL } + { NULL, &CGEEngine::NONE }, + { NULL, &CGEEngine::SB }, + { NULL, &CGEEngine::SBM }, + { NULL, &CGEEngine::GUS }, + { NULL, &CGEEngine::GUSM }, + { NULL, &CGEEngine::MIDI }, + { NULL, &CGEEngine::AUTO }, + { NULL, NULL } }; static CHOICE DigiPorts[] = { - { " 210h", SetPortD }, - { " 220h", SetPortD }, - { " 230h", SetPortD }, - { " 240h", SetPortD }, - { " 250h", SetPortD }, - { " 260h", SetPortD }, - { "AUTO ", SetPortD }, + { " 210h", &CGEEngine::SetPortD }, + { " 220h", &CGEEngine::SetPortD }, + { " 230h", &CGEEngine::SetPortD }, + { " 240h", &CGEEngine::SetPortD }, + { " 250h", &CGEEngine::SetPortD }, + { " 260h", &CGEEngine::SetPortD }, + { "AUTO ", &CGEEngine::SetPortD }, { NULL, NULL } }; static CHOICE MIDIPorts[] = { - { " 220h", SetPortM }, - { " 230h", SetPortM }, - { " 240h", SetPortM }, - { " 250h", SetPortM }, - { " 300h", SetPortM }, - { " 320h", SetPortM }, - { " 330h", SetPortM }, - { " 340h", SetPortM }, - { " 350h", SetPortM }, - { " 360h", SetPortM }, - { "AUTO ", SetPortM }, + { " 220h", &CGEEngine::SetPortM }, + { " 230h", &CGEEngine::SetPortM }, + { " 240h", &CGEEngine::SetPortM }, + { " 250h", &CGEEngine::SetPortM }, + { " 300h", &CGEEngine::SetPortM }, + { " 320h", &CGEEngine::SetPortM }, + { " 330h", &CGEEngine::SetPortM }, + { " 340h", &CGEEngine::SetPortM }, + { " 350h", &CGEEngine::SetPortM }, + { " 360h", &CGEEngine::SetPortM }, + { "AUTO ", &CGEEngine::SetPortM }, { NULL, NULL } }; static CHOICE BlsterIRQ[] = { - { "IRQ 2", SetIRQ }, - { "IRQ 5", SetIRQ }, - { "IRQ 7", SetIRQ }, - { "IRQ 10", SetIRQ }, - { "AUTO ", SetIRQ }, + { "IRQ 2", &CGEEngine::SetIRQ }, + { "IRQ 5", &CGEEngine::SetIRQ }, + { "IRQ 7", &CGEEngine::SetIRQ }, + { "IRQ 10", &CGEEngine::SetIRQ }, + { "AUTO ", &CGEEngine::SetIRQ }, { NULL, NULL } }; static CHOICE GravisIRQ[] = { - { "IRQ 2", SetIRQ }, - { "IRQ 5", SetIRQ }, - { "IRQ 7", SetIRQ }, - { "IRQ 11", SetIRQ }, - { "IRQ 12", SetIRQ }, - { "IRQ 15", SetIRQ }, - { "AUTO ", SetIRQ }, + { "IRQ 2", &CGEEngine::SetIRQ }, + { "IRQ 5", &CGEEngine::SetIRQ }, + { "IRQ 7", &CGEEngine::SetIRQ }, + { "IRQ 11", &CGEEngine::SetIRQ }, + { "IRQ 12", &CGEEngine::SetIRQ }, + { "IRQ 15", &CGEEngine::SetIRQ }, + { "AUTO ", &CGEEngine::SetIRQ }, { NULL, NULL } }; static CHOICE GravisDMA[] = { - { "DMA 1", SetDMA }, - { "DMA 3", SetDMA }, - { "DMA 5", SetDMA }, - { "DMA 6", SetDMA }, - { "DMA 7", SetDMA }, - { "AUTO ", SetDMA }, + { "DMA 1", &CGEEngine::SetDMA }, + { "DMA 3", &CGEEngine::SetDMA }, + { "DMA 5", &CGEEngine::SetDMA }, + { "DMA 6", &CGEEngine::SetDMA }, + { "DMA 7", &CGEEngine::SetDMA }, + { "AUTO ", &CGEEngine::SetDMA }, { NULL, NULL } }; static CHOICE BlsterDMA[] = { - { "DMA 0", SetDMA }, - { "DMA 1", SetDMA }, - { "DMA 3", SetDMA }, - { "AUTO ", SetDMA }, + { "DMA 0", &CGEEngine::SetDMA }, + { "DMA 1", &CGEEngine::SetDMA }, + { "DMA 3", &CGEEngine::SetDMA }, + { "AUTO ", &CGEEngine::SetDMA }, { NULL, NULL } }; -void SelectSound(void) { +void CGEEngine::SelectSound() { int i; Sound.Close(); if (VMENU::Addr) SNPOST_(SNKILL, -1, 0, VMENU::Addr); Inf(Text->getText(STYPE_TEXT)); Talk->Goto(Talk->X, FONT_HIG / 2); - for (i = 0; i < ArrayCount(DevName); i ++) + for (i = 0; i < ArrayCount(DevName); i++) DevMenu[i].Text = Text->getText(DevName[i]); - (new VMENU(DevMenu, SCR_WID / 2, Talk->Y + Talk->H + TEXT_VM + FONT_HIG))->SetName(Text->getText(MENU_TEXT)); + (new VMENU(this, DevMenu, SCR_WID / 2, Talk->Y + Talk->H + TEXT_VM + FONT_HIG))->SetName(Text->getText(MENU_TEXT)); } @@ -195,10 +195,10 @@ static uint16 xdeco(const char *str) { static CHOICE *Cho; static int Hlp; -static void SNSelect(void) { +void CGEEngine::SNSelect() { Inf(Text->getText(Hlp)); Talk->Goto(Talk->X, FONT_HIG / 2); - (new VMENU(Cho, SCR_WID / 2, Talk->Y + Talk->H + TEXT_VM + FONT_HIG))->SetName(Text->getText(MENU_TEXT)); + (new VMENU(this, Cho, SCR_WID / 2, Talk->Y + Talk->H + TEXT_VM + FONT_HIG))->SetName(Text->getText(MENU_TEXT)); } @@ -211,14 +211,14 @@ static void Select(CHOICE *cho, int hlp) { } -static void NONE(void) { +void CGEEngine::NONE() { SNDDrvInfo.DDEV = DEV_QUIET; SNDDrvInfo.MDEV = DEV_QUIET; Sound.Open(); } -static void SB(void) { +void CGEEngine::SB() { SNDDrvInfo.DDEV = DEV_SB; SNDDrvInfo.MDEV = DEV_SB; Reset(); @@ -226,7 +226,7 @@ static void SB(void) { } -static void SBM(void) { +void CGEEngine::SBM() { SNDDrvInfo.DDEV = DEV_SB; SNDDrvInfo.MDEV = DEV_GM; Reset(); @@ -234,7 +234,7 @@ static void SBM(void) { } -static void GUS(void) { +void CGEEngine::GUS() { SNDDrvInfo.DDEV = DEV_GUS; SNDDrvInfo.MDEV = DEV_GUS; Reset(); @@ -242,7 +242,7 @@ static void GUS(void) { } -static void GUSM(void) { +void CGEEngine::GUSM() { SNDDrvInfo.DDEV = DEV_GUS; SNDDrvInfo.MDEV = DEV_GM; Reset(); @@ -250,7 +250,7 @@ static void GUSM(void) { } -static void MIDI(void) { +void CGEEngine::MIDI() { SNDDrvInfo.DDEV = DEV_QUIET; SNDDrvInfo.MDEV = DEV_GM; SNDDrvInfo.MBASE = DETECT; @@ -258,7 +258,7 @@ static void MIDI(void) { } -static void AUTO(void) { +void CGEEngine::AUTO() { SNDDrvInfo.DDEV = DEV_AUTO; SNDDrvInfo.MDEV = DEV_AUTO; Reset(); @@ -266,25 +266,25 @@ static void AUTO(void) { } -static void SetPortD(void) { +void CGEEngine::SetPortD() { SNDDrvInfo.DBASE = xdeco(DigiPorts[VMENU::Recent].Text); Select((SNDDrvInfo.DDEV == DEV_SB) ? BlsterIRQ : GravisIRQ, SIRQ_TEXT); } -static void SetPortM(void) { +void CGEEngine::SetPortM() { SNDDrvInfo.MBASE = xdeco(MIDIPorts[VMENU::Recent].Text); Sound.Open(); } -static void SetIRQ(void) { +void CGEEngine::SetIRQ() { SNDDrvInfo.DIRQ = ddeco(((SNDDrvInfo.DDEV == DEV_SB) ? BlsterIRQ : GravisIRQ)[VMENU::Recent].Text); Select((SNDDrvInfo.DDEV == DEV_SB) ? BlsterDMA : GravisDMA, SDMA_TEXT); } -static void SetDMA(void) { +void CGEEngine::SetDMA() { SNDDrvInfo.DDMA = ddeco(((SNDDrvInfo.DDEV == DEV_SB) ? BlsterDMA : GravisDMA)[VMENU::Recent].Text); if (SNDDrvInfo.MDEV != SNDDrvInfo.DDEV) Select(MIDIPorts, MPORT_TEXT); diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp index f522f872c9..f03a42fb35 100644 --- a/engines/cge/detection.cpp +++ b/engines/cge/detection.cpp @@ -64,7 +64,7 @@ static const ADGameDescription gameDescriptions[] = { {"vol.dat", 0, "75d385a6074c58b69f7730481f256051", 1796710}, AD_LISTEND }, - Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO_NONE + Common::PL_POL, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE }, { "soltys", "Soltys Demo", @@ -73,7 +73,7 @@ static const ADGameDescription gameDescriptions[] = { {"vol.dat", 0, "c5d9b15863cab61dc125551576dece04", 1075272}, AD_LISTEND }, - Common::PL_POL, Common::kPlatformPC, ADGF_NO_FLAGS, GUIO_NONE + Common::PL_POL, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE }, AD_TABLE_END_MARKER }; @@ -160,7 +160,7 @@ SaveStateList CGEMetaEngine::listSaves(const char *target) const { SaveStateList saveList; int slotNum = 0; - for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { + for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); filename++) { // Obtain the last 3 digits of the filename, since they correspond to the save slot slotNum = atoi(filename->c_str() + filename->size() - 3); diff --git a/engines/cge/ems.cpp b/engines/cge/ems.cpp index c21bc356dc..f1f7ece708 100644 --- a/engines/cge/ems.cpp +++ b/engines/cge/ems.cpp @@ -142,8 +142,8 @@ EMS *EMM::Alloc(uint16 siz) { if (cnt > 4) { top = (top + PAGE_MASK) & 0xFFFFC000L; - ++ pgn; - -- cnt; + pgn++; + cnt--; } if (size <= Lim - top) diff --git a/engines/cge/game.cpp b/engines/cge/game.cpp index 58334f2e53..21e8ceddeb 100644 --- a/engines/cge/game.cpp +++ b/engines/cge/game.cpp @@ -35,7 +35,7 @@ uint8 *Glass(DAC *pal, uint8 r, uint8 g, uint8 b) { uint8 *x = new uint8[256]; if (x) { uint16 i; - for (i = 0; i < 256; i ++) { + for (i = 0; i < 256; i++) { x[i] = Closest(pal, MkDAC(((uint16)(pal[i].R) * r) / 255, ((uint16)(pal[i].G) * g) / 255, ((uint16)(pal[i].B) * b) / 255)); @@ -50,7 +50,7 @@ uint8 *Mark(DAC *pal) { uint8 *x = new uint8[256]; if (x) { uint16 i; - for (i = 0; i < 256; i ++) { + for (i = 0; i < 256; i++) { x[i] = Closest(pal, MkDAC(f(pal[i].R), f(pal[i].G), f(pal[i].B))); @@ -67,8 +67,8 @@ int FLY::L = 20, FLY::B = 100; -FLY::FLY(BITMAP **shpl) - : SPRITE(shpl), Tx(0), Ty(0) { +FLY::FLY(CGEEngine *vm, BITMAP **shpl) + : SPRITE(vm, shpl), Tx(0), Ty(0), _vm(vm) { Step(new_random(2)); Goto(L + new_random(R - L - W), T + new_random(B - T - H)); } diff --git a/engines/cge/game.h b/engines/cge/game.h index 1d65d0c767..7892b1c93f 100644 --- a/engines/cge/game.h +++ b/engines/cge/game.h @@ -48,8 +48,10 @@ class FLY : public SPRITE { static int L, T, R, B; public: int Tx, Ty; - FLY(BITMAP **shpl); + FLY(CGEEngine *vm, BITMAP **shpl); void Tick(void); +private: + CGEEngine *_vm; }; } // End of namespace CGE diff --git a/engines/cge/general.cpp b/engines/cge/general.cpp index a851957b21..b07ddbc362 100644 --- a/engines/cge/general.cpp +++ b/engines/cge/general.cpp @@ -148,24 +148,23 @@ unsigned FastRand(unsigned s) { } uint16 RCrypt(void *buf, uint16 siz, uint16 seed) { - /* - if (buf && siz) { - uint8 * q = BUF + (siz-1); - seed = FastRand(seed); - * (BUF ++) ^= seed; - while (buf < q) * (BUF ++) ^= FastRand(); - if (buf == q) * BUF ^= (seed = FastRand()); - } - return seed; - */ - warning("STUB: RCrypt"); - return 0; + if (buf && siz) { + byte *b = static_cast<byte *>(buf); + byte *q = b + (siz - 1); + seed = FastRand(seed); + *b++ ^= seed; + while (buf < q) + *b++ ^= FastRand(); + if (buf == q) + *b ^= (seed = FastRand()); + } + return seed; } uint16 XCrypt(void *buf, uint16 siz, uint16 seed) { byte *b = static_cast<byte *>(buf); - for (uint16 i = 0; i < siz; i ++) + for (uint16 i = 0; i < siz; i++) *b++ ^= seed; return seed; @@ -175,7 +174,7 @@ uint16 atow(const char *a) { uint16 w = 0; if (a) while (IsDigit(*a)) - w = (10 * w) + (*(a ++) & 0xF); + w = (10 * w) + (*(a++) & 0xF); return w; } @@ -183,7 +182,7 @@ uint16 xtow(const char *x) { uint16 w = 0; if (x) { while (IsHxDig(*x)) { - register uint16 d = * (x ++); + register uint16 d = *(x++); if (d > '9') d -= 'A' - ('9' + 1); w = (w << 4) | (d & 0xF); @@ -332,7 +331,7 @@ DATACK *LoadWave(XFILE *file, EMM *emm) { int TakeEnum(const char **tab, const char *txt) { const char **e; if (txt) { - for (e = tab; *e; e ++) { + for (e = tab; *e; e++) { if (scumm_stricmp(txt, *e) == 0) { return e - tab; } diff --git a/engines/cge/gettext.cpp b/engines/cge/gettext.cpp index c1d54099f8..69e19b175c 100644 --- a/engines/cge/gettext.cpp +++ b/engines/cge/gettext.cpp @@ -36,9 +36,9 @@ namespace CGE { GET_TEXT *GET_TEXT::Ptr = NULL; -GET_TEXT::GET_TEXT(const char *info, char *text, int size, void (*click)(void)) - : Text(text), Size(min<int>(size, GTMAX)), Len(min<int>(Size, strlen(text))), - Cntr(GTBLINK), Click(click), OldKeybClient(KEYBOARD::SetClient(this)) { +GET_TEXT::GET_TEXT(CGEEngine *vm, const char *info, char *text, int size, void (*click)(void)) + : TALK(vm), Text(text), Size(min<int>(size, GTMAX)), Len(min<int>(Size, strlen(text))), + Cntr(GTBLINK), Click(click), OldKeybClient(KEYBOARD::SetClient(this)), _vm(vm) { int i = 2 * TEXT_HM + Font->Width(info); Ptr = this; Mode = RECT; @@ -82,7 +82,7 @@ void GET_TEXT::Touch(uint16 mask, int x, int y) { case Enter : Buff[Len] = '\0'; strcpy(Text, Buff); - for (p = Text; *p; p ++) { + for (p = Text; *p; p++) { char *q = strchr(ogon, *p); if (q) *p = bezo[q - ogon]; @@ -110,7 +110,7 @@ void GET_TEXT::Touch(uint16 mask, int x, int y) { if (Len < Size && 2 * TEXT_HM + Font->Width(Buff) + Font->Wid[x] <= W) { Buff[Len + 2] = Buff[Len + 1]; Buff[Len + 1] = Buff[Len]; - Buff[Len ++] = x; + Buff[Len++] = x; } } break; diff --git a/engines/cge/gettext.h b/engines/cge/gettext.h index 3fc7e4ff34..c868232677 100644 --- a/engines/cge/gettext.h +++ b/engines/cge/gettext.h @@ -42,13 +42,16 @@ class GET_TEXT : public TALK { uint16 Size, Len; uint16 Cntr; SPRITE *OldKeybClient; - void (*Click)(void); + void (*Click)(); public: static GET_TEXT *Ptr; - GET_TEXT(const char *info, char *text, int size, void (*click)(void) = NULL); - ~GET_TEXT(void); + GET_TEXT(CGEEngine *vm, const char *info, char *text, int size, void (*click)(void) = NULL); + ~GET_TEXT(); void Touch(uint16 mask, int x, int y); - void Tick(void); + void Tick(); + +private: + CGEEngine *_vm; }; } // End of namespace CGE diff --git a/engines/cge/jbw.h b/engines/cge/jbw.h index 82647ed49a..12c6609f4e 100644 --- a/engines/cge/jbw.h +++ b/engines/cge/jbw.h @@ -34,7 +34,6 @@ namespace CGE { // Defines found in cge.mak #define VOL -//#define DEMO #define INI_FILE VFILE // Or is it CFILE? #define PIC_FILE VFILE #define BMP_MODE 0 @@ -56,8 +55,8 @@ namespace CGE { #define IsAlNum(c) (IsAlpha(c) || IsDigit(c)) #define IsHxDig(c) (IsDigit(c) || ((c) >= 'A' && (c) <= 'F') || ((c) >= 'a' && (c) <= 'f')) -#define farnew(t,n) ((t *) malloc(sizeof(t) * (n))) -#define ArrayCount(a) (sizeof(a)/sizeof((a)[0])) +#define farnew(t, n) ((t *) malloc(sizeof(t) * (n))) +#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) #define MAX_TIMER 0x1800B0L typedef void (MouseFunType)(void); @@ -66,8 +65,8 @@ typedef void (MouseFunType)(void); #define Hi(d) (((int *) &d)[1]) #define LoWord(d) ((uint16) Lo(d)) #define HiWord(d) ((uint16) Hi(d)) -#define K(n) (1024*(n)) -#define MASK(n) ((1<<n)-1) +#define K(n) (1024 * (n)) +#define MASK(n) ((1 << n) - 1) typedef enum { NoKey = 0, CtrlA, CtrlB, CtrlC, CtrlD, CtrlE, CtrlF, CtrlG, CtrlH, @@ -135,18 +134,12 @@ struct KeyStatStruct { #define CGA_Cursor 0x0607 #define OFF_Cursor 0x2000 -#define TimerCount (* ((volatile long *) ((void _seg *) 0x40 + (void *) 0x6C))) -#define KeyStat (* ((volatile struct KeyStatStruct *) ((void _seg *) 0x40 + (void *) 0x17))) -#define BreakFlag (* ((volatile uint8 *) ((void _seg *) 0x40 + (void *) 0x71))) -#define PostFlag (* ((volatile uint16 *) ((void _seg *) 0x40 + (void *) 0x72))) +#define TimerCount (*((volatile long *) ((void _seg *) 0x40 + (void *) 0x6C))) +#define KeyStat (*((volatile struct KeyStatStruct *) ((void _seg *) 0x40 + (void *) 0x17))) +#define BreakFlag (*((volatile uint8 *) ((void _seg *) 0x40 + (void *) 0x71))) +#define PostFlag (*((volatile uint16 *) ((void _seg *) 0x40 + (void *) 0x72))) #define POST ((void (*)(void)) ((void _seg *) 0xF000 + (void *) 0xFFF0)) -#ifdef DEMO -#define Demo(x) x -#else -#define Demo(x) -#endif - #ifdef __cplusplus #define EC extern "C" diff --git a/engines/cge/mixer.cpp b/engines/cge/mixer.cpp index 6a3a45553a..864fb6cdba 100644 --- a/engines/cge/mixer.cpp +++ b/engines/cge/mixer.cpp @@ -40,7 +40,7 @@ extern MOUSE *Mouse; bool MIXER::Appear = false; -MIXER::MIXER(int x, int y) : SPRITE(NULL), Fall(MIX_FALL) { +MIXER::MIXER(CGEEngine *vm, int x, int y) : SPRITE(vm, NULL), Fall(MIX_FALL), _vm(vm) { Appear = true; mb[0] = new BITMAP("VOLUME"); mb[1] = NULL; @@ -55,7 +55,7 @@ MIXER::MIXER(int x, int y) : SPRITE(NULL), Fall(MIX_FALL) { // slaves int i; - for (i = 0; i < MIX_MAX; i ++) { + for (i = 0; i < MIX_MAX; i++) { static char fn[] = "V00"; wtom(i, fn + 1, 10, 2); lb[i] = new BITMAP(fn); @@ -64,8 +64,8 @@ MIXER::MIXER(int x, int y) : SPRITE(NULL), Fall(MIX_FALL) { } lb[i] = NULL; - for (i = 0; i < ArrayCount(Led); i ++) { - register SPRITE *spr = new SPRITE(lb); + for (i = 0; i < ArrayCount(Led); i++) { + register SPRITE *spr = new SPRITE(_vm, lb); spr->SetSeq(ls); spr->Goto(x + 2 + 12 * i, y + 8); spr->Flags.Tran = true; @@ -77,7 +77,7 @@ MIXER::MIXER(int x, int y) : SPRITE(NULL), Fall(MIX_FALL) { Led[ArrayCount(Led) - 1]->Flags.BDel = true; Vga->ShowQ->Insert(this); - for (i = 0; i < ArrayCount(Led); i ++) + for (i = 0; i < ArrayCount(Led); i++) Vga->ShowQ->Insert(Led[i]); //--- reset balance @@ -124,7 +124,7 @@ void MIXER::Tick(void) { if (Fall) --Fall; else { - for (int i = 0; i < ArrayCount(Led); i ++) + for (int i = 0; i < ArrayCount(Led); i++) SNPOST_(SNKILL, -1, 0, Led[i]); SNPOST_(SNKILL, -1, 0, this); } diff --git a/engines/cge/mixer.h b/engines/cge/mixer.h index 81bc7c7cdf..d589aceaea 100644 --- a/engines/cge/mixer.h +++ b/engines/cge/mixer.h @@ -48,10 +48,12 @@ class MIXER : public SPRITE { void Update(void); public: static bool Appear; - MIXER(int x, int y); - ~MIXER(void); + MIXER(CGEEngine *vm, int x, int y); + ~MIXER(); void Touch(uint16 mask, int x, int y); - void Tick(void); + void Tick(); +private: + CGEEngine *_vm; }; } // End of namespace CGE diff --git a/engines/cge/mouse.cpp b/engines/cge/mouse.cpp index 8ad12742d3..10953291f2 100644 --- a/engines/cge/mouse.cpp +++ b/engines/cge/mouse.cpp @@ -39,7 +39,7 @@ MOUSE_FUN *MOUSE::OldMouseFun = NULL; uint16 MOUSE::OldMouseMask = 0; -MOUSE::MOUSE(BITMAP **shpl) : SPRITE(shpl), Busy(NULL), Hold(NULL), hx(0) { +MOUSE::MOUSE(CGEEngine *vm, BITMAP **shpl) : SPRITE(vm, shpl), Busy(NULL), Hold(NULL), hx(0), _vm(vm) { static SEQ ms[] = { { 0, 0, 0, 0, 1 }, { 1, 1, 0, 0, 1 } diff --git a/engines/cge/mouse.h b/engines/cge/mouse.h index 78f43665cd..61503fadd1 100644 --- a/engines/cge/mouse.h +++ b/engines/cge/mouse.h @@ -69,12 +69,14 @@ public: int Buttons; SPRITE *Busy; //SPRITE * Touched; - MOUSE(BITMAP **shpl = MC); - ~MOUSE(void); - void On(void); - void Off(void); + MOUSE(CGEEngine *vm, BITMAP **shpl = MC); + ~MOUSE(); + void On(); + void Off(); static void ClrEvt(SPRITE *spr = NULL); - void Tick(void); + void Tick(); +private: + CGEEngine *_vm; }; } // End of namespace CGE diff --git a/engines/cge/snail.cpp b/engines/cge/snail.cpp index a07cf9d09b..24ed08c140 100644 --- a/engines/cge/snail.cpp +++ b/engines/cge/snail.cpp @@ -287,7 +287,7 @@ void ContractSprite(SPRITE *spr) { } int FindPocket(SPRITE *spr) { - for (int i = 0; i < POCKET_NX; i ++) + for (int i = 0; i < POCKET_NX; i++) if (Pocket[i] == spr) return i; return -1; @@ -345,7 +345,7 @@ void FeedSnail(SPRITE *spr, SNLIST snq) { if (FindPocket(NULL) < 0) { // no empty pockets? SNAIL::COM *p; - for (p = c; p->Com != SNNEXT; p ++) { // find KEEP command + for (p = c; p->Com != SNNEXT; p++) { // find KEEP command if (p->Com == SNKEEP) { PocFul(); return; @@ -423,10 +423,10 @@ const char *SNAIL::ComTxt[] = { }; -SNAIL::SNAIL(bool turbo) +SNAIL::SNAIL(CGEEngine *vm, bool turbo) : Turbo(turbo), Busy(false), TextDelay(false), Pause(0), TalkEnable(true), - Head(0), Tail(0), SNList(farnew(COM, 256)) { + Head(0), Tail(0), SNList(farnew(COM, 256)), _vm(vm) { } @@ -438,7 +438,7 @@ SNAIL::~SNAIL(void) { void SNAIL::AddCom(SNCOM com, int ref, int val, void *ptr) { _disable(); - COM *snc = &SNList[Head ++]; + COM *snc = &SNList[Head++]; snc->Com = com; snc->Ref = ref; snc->Val = val; @@ -849,7 +849,7 @@ void SNFlash(bool on) { DAC *pal = farnew(DAC, PAL_CNT); if (pal) { memcpy(pal, VGA::SysPal, PAL_SIZ); - for (int i = 0; i < PAL_CNT; i ++) { + for (int i = 0; i < PAL_CNT; i++) { register int c; c = pal[i].R << 1; pal[i].R = (c < 64) ? c : 63; @@ -906,7 +906,6 @@ static void SNMouse(bool on) { void SNAIL::RunCom(void) { static int count = 1; -// extern void SwitchCave(int); if (! Busy) { Busy = true; uint8 tmphea = Head; @@ -954,13 +953,13 @@ void SNAIL::RunCom(void) { if (sprel && TalkEnable) { if (sprel == Hero && sprel->SeqTest(-1)) sprel->Step(HTALK); - Say(Text->getText(snc->Val), sprel); + Text->Say(Text->getText(snc->Val), sprel); Sys->FunDel = HEROFUN0; } break; case SNINF : if (TalkEnable) { - Inf(Text->getText(snc->Val)); + _vm->Inf(Text->getText(snc->Val)); Sys->FunDel = HEROFUN0; } break; diff --git a/engines/cge/snail.h b/engines/cge/snail.h index 54c7809fda..9449a8081e 100644 --- a/engines/cge/snail.h +++ b/engines/cge/snail.h @@ -29,6 +29,7 @@ #define __SNAIL__ #include "cge/jbw.h" +#include "cge/cge.h" namespace CGE { @@ -89,12 +90,14 @@ public: uint16 Pause; static const char *ComTxt[]; bool TalkEnable; - SNAIL(bool turbo = false); - ~SNAIL(void); + SNAIL(CGEEngine *vm, bool turbo = false); + ~SNAIL(); void RunCom(void); void AddCom(SNCOM com, int ref = 0, int val = 0, void *ptr = NULL); void InsCom(SNCOM com, int ref = 0, int val = 0, void *ptr = NULL); bool Idle(void); +private: + CGEEngine *_vm; }; diff --git a/engines/cge/sound.cpp b/engines/cge/sound.cpp index 04e5d9464a..4a7b63fb08 100644 --- a/engines/cge/sound.cpp +++ b/engines/cge/sound.cpp @@ -82,7 +82,7 @@ void SOUND::Stop(void) { FX::FX(int size) : Emm(0L), Current(NULL) { Cache = new HAN[size]; - for (Size = 0; Size < size; Size ++) { + for (Size = 0; Size < size; Size++) { Cache[Size].Ref = 0; Cache[Size].Wav = NULL; } @@ -97,7 +97,7 @@ FX::~FX(void) { void FX::Clear(void) { HAN *p, * q; - for (p = Cache, q = p + Size; p < q; p ++) { + for (p = Cache, q = p + Size; p < q; p++) { if (p->Ref) { p->Ref = 0; delete p->Wav; @@ -112,7 +112,7 @@ void FX::Clear(void) { int FX::Find(int ref) { HAN *p, * q; int i = 0; - for (p = Cache, q = p + Size; p < q; p ++) { + for (p = Cache, q = p + Size; p < q; p++) { if (p->Ref == ref) break; else @@ -126,7 +126,7 @@ void FX::Preload(int ref0) { HAN *CacheLim = Cache + Size; int ref; - for (ref = ref0; ref < ref0 + 10; ref ++) { + for (ref = ref0; ref < ref0 + 10; ref++) { static char fname[] = "FX00000.WAV"; wtom(ref, fname + 2, 10, 5); INI_FILE file = INI_FILE(fname); diff --git a/engines/cge/startup.cpp b/engines/cge/startup.cpp index 631a64d732..4895ce9861 100644 --- a/engines/cge/startup.cpp +++ b/engines/cge/startup.cpp @@ -150,7 +150,7 @@ const char *UsrPath(const char *nam) { if (j) if (buf[--j] == '\n') buf[j] = '\0'; - if (memicmp(buf, key, i) == 0) + if (scumm_strnicmp((const char *) buf, (const char*) key, i) == 0) ok = true; } if (ok) { diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp index 1739511a49..b67d9082ac 100644 --- a/engines/cge/talk.cpp +++ b/engines/cge/talk.cpp @@ -66,7 +66,7 @@ void FONT::Load(void) { f.Read(Wid, WID_SIZ); if (! f.Error) { uint16 i, p = 0; - for (i = 0; i < POS_SIZ; i ++) { + for (i = 0; i < POS_SIZ; i++) { Pos[i] = p; p += Wid[i]; } @@ -80,7 +80,7 @@ uint16 FONT::Width(const char *text) { uint16 w = 0; if (text) while (* text) - w += Wid[*(text ++)]; + w += Wid[*(text++)]; return w; } @@ -91,14 +91,14 @@ void FONT::Save(void) { if (! f.Error) { f.Write(Wid, WID_SIZ); if (! f.Error) - f.Write(Map, Pos[POS_SIZ-1] + Wid[WID_SIZ-1]); + f.Write(Map, Pos[POS_SIZ - 1] + Wid[WID_SIZ - 1]); } } */ -TALK::TALK(const char *tx, TBOX_STYLE mode) - : SPRITE(NULL), Mode(mode) { +TALK::TALK(CGEEngine *vm, const char *tx, TBOX_STYLE mode) + : SPRITE(vm, NULL), Mode(mode), _vm(vm) { TS[0] = TS[1] = NULL; Flags.Syst = true; Update(tx); @@ -106,8 +106,8 @@ TALK::TALK(const char *tx, TBOX_STYLE mode) } -TALK::TALK(void) - : SPRITE(NULL), Mode(PURE) { +TALK::TALK(CGEEngine *vm) + : SPRITE(vm, NULL), Mode(PURE), _vm(vm) { TS[0] = TS[1] = NULL; Flags.Syst = true; } @@ -115,7 +115,7 @@ TALK::TALK(void) /* TALK::~TALK (void) { - for (uint16 i = 0; i < ShpCnt; i ++) { + for (uint16 i = 0; i < ShpCnt; i++) { if (FP_SEG(ShpList[i]) != _DS) { // small model: always false delete ShpList[i]; ShpList[i] = NULL; @@ -135,7 +135,7 @@ void TALK::Update(const char *tx) { if (!TS[0]) { uint16 k = 2 * hmarg; mh = 2 * vmarg + FONT_HIG; - for (p = tx; *p; p ++) { + for (p = tx; *p; p++) { if (*p == '|' || *p == '\n') { mh += FONT_HIG + TEXT_LS; if (k > mw) @@ -203,9 +203,9 @@ BITMAP *TALK::Box(uint16 w, uint16 h) { *p = LGRAY; } p = b; - for (int i = 0; i < r; i ++) { + for (int i = 0; i < r; i++) { int j; - for (j = 0; j < r - i; j ++) { + for (j = 0; j < r - i; j++) { p[j] = TRANS; p[w - j - 1] = TRANS; q[j] = TRANS; @@ -256,10 +256,10 @@ void TALK::PutLine(int line, const char *text) { uint16 cw = Font->Wid[*text], i; uint8 *fp = Font->Map + Font->Pos[*text]; - for (i = 0; i < cw; i ++) { + for (i = 0; i < cw; i++) { register uint16 b = fp[i]; uint16 n; - for (n = 0; n < FONT_HIG; n ++) { + for (n = 0; n < FONT_HIG; n++) { if (b & 1) *p = TEXT_FG; b >>= 1; @@ -275,7 +275,7 @@ void TALK::PutLine(int line, const char *text) { } -INFO_LINE::INFO_LINE(uint16 w) : OldTxt(NULL) { +INFO_LINE::INFO_LINE(CGEEngine *vm, uint16 w) : TALK(vm), OldTxt(NULL), _vm(vm) { TS[0] = new BITMAP(w, FONT_HIG, TEXT_BG); SetShapeList(TS); } @@ -293,7 +293,7 @@ void INFO_LINE::Update(const char *tx) { // 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 + *(uint16 *)(v + psiz - 2) = EOI; // plane trailer uint16 memcpy(v + psiz, v, 3 * psiz); // tricky replicate planes // paint text line @@ -306,7 +306,7 @@ void INFO_LINE::Update(const char *tx) { for (uint16 i = 0; i < cw; i++) { register uint16 b = fp[i]; - for (uint16 n = 0; n < FONT_HIG; n ++) { + for (uint16 n = 0; n < FONT_HIG; n++) { if (b & 1) *p = TEXT_FG; b >>= 1; diff --git a/engines/cge/talk.h b/engines/cge/talk.h index 67b4fc91d6..ba4952c3e6 100644 --- a/engines/cge/talk.h +++ b/engines/cge/talk.h @@ -75,20 +75,24 @@ protected: BITMAP *Box(uint16 w, uint16 h); public: FONT *Font; - TALK(const char *tx, TBOX_STYLE mode = PURE); - TALK(void); + TALK(CGEEngine *vm, const char *tx, TBOX_STYLE mode = PURE); + TALK(CGEEngine *vm); //~TALK (void); virtual void Update(const char *tx); virtual void Update(void) {} void PutLine(int line, const char *text); +private: + CGEEngine *_vm; }; class INFO_LINE : public TALK { const char *OldTxt; public: - INFO_LINE(uint16 wid); + INFO_LINE(CGEEngine *vm, uint16 wid); void Update(const char *tx); +private: + CGEEngine *_vm; }; } // End of namespace CGE diff --git a/engines/cge/text.cpp b/engines/cge/text.cpp index ee94983352..6d7341af0a 100644 --- a/engines/cge/text.cpp +++ b/engines/cge/text.cpp @@ -42,20 +42,20 @@ namespace CGE { TEXT *Text; TALK *Talk = NULL; -TEXT::TEXT(const char *fname, int size) { +TEXT::TEXT(CGEEngine *vm, const char *fname, int size) : _vm(vm) { Cache = new HAN[size]; MergeExt(FileName, fname, SAY_EXT); if (!INI_FILE::Exist(FileName)) error("No talk (%s)\n", FileName); - for (Size = 0; Size < size; Size ++) { + for (Size = 0; Size < size; Size++) { Cache[Size].Ref = 0; Cache[Size].Txt = NULL; } } -TEXT::~TEXT(void) { +TEXT::~TEXT() { Clear(); delete[] Cache; } @@ -63,7 +63,7 @@ TEXT::~TEXT(void) { void TEXT::Clear(int from, int upto) { HAN *p, * q; - for (p = Cache, q = p + Size; p < q; p ++) { + for (p = Cache, q = p + Size; p < q; p++) { if (p->Ref && p->Ref >= from && p->Ref < upto) { p->Ref = 0; delete p->Txt; @@ -76,7 +76,7 @@ void TEXT::Clear(int from, int upto) { int TEXT::Find(int ref) { HAN *p, * q; int i = 0; - for (p = Cache, q = p + Size; p < q; p ++) { + for (p = Cache, q = p + Size; p < q; p++) { if (p->Ref == ref) break; else @@ -180,14 +180,14 @@ char *TEXT::getText(int ref) { } -void Say(const char *txt, SPRITE *spr) { +void TEXT::Say(const char *txt, SPRITE *spr) { KillText(); - Talk = new TALK(txt, ROUND); + Talk = new TALK(_vm, txt, ROUND); if (Talk) { bool east = spr->Flags.East; int x = (east) ? (spr->X + spr->W - 2) : (spr->X + 2); int y = spr->Y + 2; - SPRITE *spike = new SPRITE(SP); + SPRITE *spike = new SPRITE(_vm, SP); uint16 sw = spike->W; if (east) { @@ -221,9 +221,9 @@ void Say(const char *txt, SPRITE *spr) { } } -void Inf(const char *txt) { +void CGEEngine::Inf(const char *txt) { KillText(); - Talk = new TALK(txt, RECT); + Talk = new TALK(this, txt, RECT); if (Talk) { Talk->Flags.Kill = true; Talk->Flags.BDel = true; diff --git a/engines/cge/text.h b/engines/cge/text.h index 64e3b1d669..161b2e813a 100644 --- a/engines/cge/text.h +++ b/engines/cge/text.h @@ -61,11 +61,14 @@ class TEXT { char *Load(int idx, int ref); int Find(int ref); public: - TEXT(const char *fname, int size); + TEXT(CGEEngine *vm, const char *fname, int size); ~TEXT(void); void Clear(int from = 1, int upto = 0x7FFF); void Preload(int from = 1, int upto = 0x7FFF); char *getText(int ref); + void Say(const char *txt, SPRITE *spr); +private: + CGEEngine *_vm; }; diff --git a/engines/cge/vga13h.cpp b/engines/cge/vga13h.cpp index f5fde14122..1804d25aa9 100644 --- a/engines/cge/vga13h.cpp +++ b/engines/cge/vga13h.cpp @@ -37,6 +37,7 @@ #include <stdlib.h> #include <string.h> #include <fcntl.h> +#include "cge/cge.h" namespace CGE { @@ -235,14 +236,16 @@ extern "C" void TimerProc (void) // decrement external timer uint16 if (Heart->XTimer) - if (*Heart->XTimer) -- *Heart->XTimer; - else Heart->XTimer = NULL; + if (*Heart->XTimer) + *Heart->XTimer--; + else + Heart->XTimer = NULL; if (! run && Heart->Enable) // check overrun flag { static uint16 oldSP, oldSS; - ++ run; // disable 2nd call until current lasts + run++; // disable 2nd call until current lasts asm mov ax,ds asm mov oldSS,ss asm mov oldSP,sp @@ -258,7 +261,7 @@ extern "C" void TimerProc (void) } asm mov ss,oldSS asm mov sp,oldSP - -- run; + run--; } } */ @@ -299,14 +302,16 @@ void ENGINE::NewTimer(...) { // decrement external timer uint16 if (Heart->XTimer) - if (*Heart->XTimer) -- *Heart->XTimer; - else Heart->XTimer = NULL; + if (*Heart->XTimer) + *Heart->XTimer--; + else + Heart->XTimer = NULL; if (! run && Heart->Enable) // check overrun flag { static uint16 oldSP, oldSS; - ++ run; // disable 2nd call until current lasts + run++; // disable 2nd call until current lasts asm mov ax,ds asm mov oldSS,ss asm mov oldSP,sp @@ -322,7 +327,7 @@ void ENGINE::NewTimer(...) { } asm mov ss,oldSS asm mov sp,oldSP - -- run; + run--; } */ @@ -343,10 +348,10 @@ void HEART::SetXTimer(uint16 *ptr, uint16 time) { } -SPRITE::SPRITE(BMP_PTR *shp) +SPRITE::SPRITE(CGEEngine *vm, BMP_PTR *shp) : X(0), Y(0), Z(0), NearPtr(0), TakePtr(0), Next(NULL), Prev(NULL), SeqPtr(NO_SEQ), Time(0), //Delay(0), - Ext(NULL), Ref(-1), Cave(0) { + Ext(NULL), Ref(-1), Cave(0), _vm(vm) { memset(File, 0, sizeof(File)); *((uint16 *)&Flags) = 0; SetShapeList(shp); @@ -404,7 +409,7 @@ BMP_PTR *SPRITE::SetShapeList(BMP_PTR *shp) { void SPRITE::MoveShapes(uint8 *buf) { BMP_PTR *p; - for (p = Ext->ShpList; *p; p ++) { + for (p = Ext->ShpList; *p; p++) { buf += (*p)->MoveVmap(buf); } } @@ -509,14 +514,14 @@ SPRITE *SPRITE::Expand(void) { break; } case 1 : { // Phase - shplist[shpcnt ++] = new BITMAP(strtok(NULL, " \t,;/")); + shplist[shpcnt++] = new BITMAP(strtok(NULL, " \t,;/")); break; } case 2 : { // Seq seq = (SEQ *) realloc(seq, (seqcnt + 1) * sizeof(*seq)); if (seq == NULL) error("No core [%s]", fname); - SEQ *s = &seq[seqcnt ++]; + SEQ *s = &seq[seqcnt++]; s->Now = atoi(strtok(NULL, " \t,;/")); if (s->Now > maxnow) maxnow = s->Now; @@ -542,7 +547,7 @@ SPRITE *SPRITE::Expand(void) { if (nea == NULL) error("No core [%s]", fname); else { - SNAIL::COM *c = &nea[neacnt ++]; + SNAIL::COM *c = &nea[neacnt++]; if ((c->Com = (SNCOM) TakeEnum(SNAIL::ComTxt, strtok(NULL, " \t,;/"))) < 0) error("%s [%s]", NumStr("Bad NEAR in ######", lcnt), fname); c->Ref = atoi(strtok(NULL, " \t,;/")); @@ -558,7 +563,7 @@ SPRITE *SPRITE::Expand(void) { if (tak == NULL) error("No core [%s]", fname); else { - SNAIL::COM *c = &tak[takcnt ++]; + SNAIL::COM *c = &tak[takcnt++]; if ((c->Com = (SNCOM) TakeEnum(SNAIL::ComTxt, strtok(NULL, " \t,;/"))) < 0) error("%s [%s]", NumStr("Bad NEAR in ######", lcnt), fname); c->Ref = atoi(strtok(NULL, " \t,;/")); @@ -571,7 +576,7 @@ SPRITE *SPRITE::Expand(void) { } } } else { // no sprite description: try to read immediately from .BMP - shplist[shpcnt ++] = new BITMAP(File); + shplist[shpcnt++] = new BITMAP(File); } shplist[shpcnt] = NULL; if (seq) { @@ -608,7 +613,7 @@ SPRITE *SPRITE::Contract(void) { delete[] e->Name; if (Flags.BDel && e->ShpList) { int i; - for (i = 0; e->ShpList[i]; i ++) + for (i = 0; e->ShpList[i]; i++) delete e->ShpList[i]; if (MemType(e->ShpList) == NEAR_MEM) delete[] e->ShpList; @@ -664,7 +669,7 @@ void SPRITE::MakeXlat(uint8 *x) { if (Flags.Xlat) KillXlat(); - for (b = Ext->ShpList; *b; b ++) + for (b = Ext->ShpList; *b; b++) (*b)->M = x; Flags.Xlat = true; } @@ -684,7 +689,7 @@ void SPRITE::KillXlat(void) { free(m); break; } - for (b = Ext->ShpList; *b; b ++) + for (b = Ext->ShpList; *b; b++) (*b)->M = NULL; Flags.Xlat = false; } @@ -918,7 +923,7 @@ VGA::VGA(int mode) bool std = true; int i; - for (i = 10; i < 20; i ++) { + for (i = 10; i < 20; i++) { char *txt = Text->getText(i); if (txt) { // puts(txt); @@ -1163,9 +1168,9 @@ void BITMAP::XShow(int x, int y) { /* uint8 rmsk = x % 4, mask = 1 << rmsk, - * scr = VGA::Page[1] + y * (SCR_WID / 4) + x / 4; - uint8 * m = (char *) M; - uint8 * v = V; + *scr = VGA::Page[1] + y * (SCR_WID / 4) + x / 4; + uint8 *m = (char *) M; + uint8 *v = V; asm push bx asm push si @@ -1304,9 +1309,9 @@ void BITMAP::Show(int x, int y) { void BITMAP::Hide(int x, int y) { /* - uint8 * scr = VGA::Page[1] + y * (SCR_WID / 4) + x / 4; + uint8 *scr = VGA::Page[1] + y * (SCR_WID / 4) + x / 4; uint16 d = FP_OFF(VGA::Page[2]) - FP_OFF(VGA::Page[1]); - HideDesc * b = B; + HideDesc *b = B; uint16 extra = ((x & 3) != 0); uint16 h = H; diff --git a/engines/cge/vga13h.h b/engines/cge/vga13h.h index edbeebf727..cf4252e5c2 100644 --- a/engines/cge/vga13h.h +++ b/engines/cge/vga13h.h @@ -33,6 +33,7 @@ #include <stddef.h> #include "cge/bitmap.h" #include "cge/snail.h" +#include "cge/cge.h" namespace CGE { @@ -198,7 +199,7 @@ public: inline bool Active(void) { return Ext != NULL; } - SPRITE(BMP_PTR *shp); + SPRITE(CGEEngine *vm, BMP_PTR *shp); virtual ~SPRITE(void); BMP_PTR Shp(void); BMP_PTR *SetShapeList(BMP_PTR *shp); @@ -223,6 +224,8 @@ public: SNAIL::COM *SnList(SNLIST type); virtual void Touch(uint16 mask, int x, int y); virtual void Tick(void); +private: + CGEEngine *_vm; }; @@ -301,7 +304,7 @@ uint8 Closest(CBLK *pal, CBLK x) { if (!L) ++L; uint16 R = f(x.R, L), G = f(x.G, L), B = f(x.B, L); - for (i = 0; i < 256; i ++) { + for (i = 0; i < 256; i++) { uint16 l = pal[i].R + pal[i].G + pal[i].B; if (! l) ++l; diff --git a/engines/cge/vmenu.cpp b/engines/cge/vmenu.cpp index cb2c2013f4..7db5a79f85 100644 --- a/engines/cge/vmenu.cpp +++ b/engines/cge/vmenu.cpp @@ -45,7 +45,7 @@ namespace CGE { -MENU_BAR::MENU_BAR(uint16 w) { +MENU_BAR::MENU_BAR(CGEEngine *vm, uint16 w) : TALK(vm), _vm(vm) { int h = FONT_HIG + 2 * MB_VM, i = (w += 2 * MB_HM) * h; uint8 *p = farnew(uint8, i), * p1, * p2; @@ -54,7 +54,7 @@ MENU_BAR::MENU_BAR(uint16 w) { memset(p + i - w, MB_RB, w); p1 = p; p2 = p + i - 1; - for (i = 0; i < h; i ++) { + for (i = 0; i < h; i++) { *p1 = MB_LT; *p2 = MB_RB; p1 += w; @@ -76,14 +76,14 @@ char *VMGather(CHOICE *list) { CHOICE *cp; int len = 0, h = 0; - for (cp = list; cp->Text; cp ++) { + for (cp = list; cp->Text; cp++) { len += strlen(cp->Text); ++h; } vmgt = new char[len + h]; if (vmgt) { *vmgt = '\0'; - for (cp = list; cp->Text; cp ++) { + for (cp = list; cp->Text; cp++) { if (*vmgt) strcat(vmgt, "|"); strcat(vmgt, cp->Text); @@ -98,14 +98,14 @@ VMENU *VMENU::Addr = NULL; int VMENU::Recent = -1; -VMENU::VMENU(CHOICE *list, int x, int y) - : TALK(VMGather(list), RECT), Menu(list), Bar(NULL) { +VMENU::VMENU(CGEEngine *vm, CHOICE *list, int x, int y) + : TALK(vm, VMGather(list), RECT), Menu(list), Bar(NULL), _vm(vm) { CHOICE *cp; Addr = this; delete[] vmgt; Items = 0; - for (cp = list; cp->Text; cp ++) + for (cp = list; cp->Text; cp++) ++Items; Flags.BDel = true; Flags.Kill = true; @@ -114,7 +114,7 @@ VMENU::VMENU(CHOICE *list, int x, int y) else Goto(x - W / 2, y - (TEXT_VM + FONT_HIG / 2)); Vga->ShowQ->Insert(this, Vga->ShowQ->Last()); - Bar = new MENU_BAR(W - 2 * TEXT_HM); + Bar = new MENU_BAR(_vm, W - 2 * TEXT_HM); Bar->Goto(X + TEXT_HM - MB_HM, Y + TEXT_VM - MB_VM); Vga->ShowQ->Insert(Bar, Vga->ShowQ->Last()); } @@ -126,7 +126,7 @@ VMENU::~VMENU(void) { void VMENU::Touch(uint16 mask, int x, int y) { -#define h (FONT_HIG + TEXT_LS) + uint16 h = FONT_HIG + TEXT_LS; bool ok = false; if (Items) { @@ -147,10 +147,10 @@ void VMENU::Touch(uint16 mask, int x, int y) { if (ok && (mask & L_UP)) { Items = 0; SNPOST_(SNKILL, -1, 0, this); - Menu[Recent = n].Proc(); + //Menu[Recent = n].Proc(); + warning("Missing call to proc()"); } } -#undef h } } // End of namespace CGE diff --git a/engines/cge/vmenu.h b/engines/cge/vmenu.h index ecec9d51b5..61645d2c55 100644 --- a/engines/cge/vmenu.h +++ b/engines/cge/vmenu.h @@ -38,13 +38,15 @@ namespace CGE { typedef struct { char *Text; - void (* Proc)(void); + void (CGEEngine::*Proc)(); } CHOICE; class MENU_BAR : public TALK { public: - MENU_BAR(uint16 w); + MENU_BAR(CGEEngine *vm, uint16 w); +private: + CGEEngine *_vm; }; @@ -55,9 +57,11 @@ public: static VMENU *Addr; static int Recent; MENU_BAR *Bar; - VMENU(CHOICE *list, int x, int y); - ~VMENU(void); + VMENU(CGEEngine *vm, CHOICE *list, int x, int y); + ~VMENU(); void Touch(uint16 mask, int x, int y); +private: + CGEEngine *_vm; }; } // End of namespace CGE |