From 78e3f2a57bc0442066e00c9b625bbdde3c80ddf9 Mon Sep 17 00:00:00 2001 From: eriktorbjorn Date: Sun, 19 Jun 2011 11:17:54 +0200 Subject: CGE: Get rid of some static initializing ScummVM itself (not the engine; I haven't tried that) now starts without crashing. It exits immediately, but as far as I can tell it does not crash. It still produces lots of Valgrind warnings, though... --- engines/cge/cge.cpp | 5 +++++ engines/cge/cge_main.cpp | 56 ++++++++++++++++++++++++------------------------ engines/cge/cge_main.h | 3 +++ engines/cge/config.cpp | 10 ++++----- engines/cge/gettext.cpp | 4 ++-- engines/cge/mixer.cpp | 2 +- engines/cge/snail.cpp | 4 ++-- engines/cge/startup.cpp | 2 +- engines/cge/talk.cpp | 18 +++++++--------- engines/cge/talk.h | 2 +- engines/cge/text.cpp | 10 ++++----- engines/cge/text.h | 4 ++-- engines/cge/vga13h.cpp | 2 +- 13 files changed, 64 insertions(+), 58 deletions(-) (limited to 'engines/cge') diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index 0d0df4ea9c..8b3bea3eb5 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -31,6 +31,7 @@ #include "engines/util.h" #include "cge/cge.h" #include "cge/cge_main.h" +#include "cge/text.h" namespace CGE { @@ -39,6 +40,10 @@ CGEEngine::CGEEngine(OSystem *syst, const ADGameDescription *gameDescription) DebugMan.addDebugChannel(kCGEDebug, "general", "CGE general debug channel"); _console = new CGEConsole(this); + Text = new TEXT(ProgName()); + Vga = new VGA(M13H); + + OffUseCount = atoi(Text->getText(OFF_USE_COUNT)); debug("CGEEngine::CGEEngine"); } diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index 8cfa3a1cf6..6472cdef0b 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -117,14 +117,14 @@ static SPRITE *Sprite = NULL; static SPRITE *MiniCave = NULL; static SPRITE *Shadow = NULL; -static VGA Vga = M13H; +VGA *Vga; static EMS *Mini = MiniEmm.Alloc((uint16)MINI_EMM_SIZE); static BMP_PTR *MiniShpList = NULL; static BMP_PTR MiniShp[] = { NULL, NULL }; static KEYBOARD Keyboard; static bool Finis = false; static int Startup = 1; -static int OffUseCount = atoi(Text[OFF_USE_COUNT]); +int OffUseCount; uint16 *intStackPtr = false; @@ -248,7 +248,7 @@ static void LoadGame(XFILE &file, bool tiny = false) { file.Read((uint8 *) &i, sizeof(i)); if (i != SVGCHKSUM) - error(Text[BADSVG_TEXT]); + error(Text->getText(BADSVG_TEXT)); if (STARTUP::Core < CORE_HIG) Music = false; @@ -608,9 +608,9 @@ static void Quit(void) { SNPOST_(SNKILL, -1, 0, VMENU::Addr); ResetQSwitch(); } else { - QuitMenu[0].Text = Text[QUIT_TEXT]; - QuitMenu[1].Text = Text[NOQUIT_TEXT]; - (new VMENU(QuitMenu, -1, -1))->SetName(Text[QUIT_TITLE]); + QuitMenu[0].Text = Text->getText(QUIT_TEXT); + QuitMenu[1].Text = Text->getText(NOQUIT_TEXT); + (new VMENU(QuitMenu, -1, -1))->SetName(Text->getText(QUIT_TITLE)); SNPOST_(SNSEQ, 123, 1, NULL); KeyClick(); } @@ -687,7 +687,7 @@ static void CaveUp(void) { ShowBak(BakRef); LoadMapping(); - Text.Preload(BakRef, BakRef + 1000); + Text->Preload(BakRef, BakRef + 1000); SPRITE *spr = VGA::SpareQ.First(); while (spr) { SPRITE *n = spr->Next; @@ -716,7 +716,7 @@ static void CaveUp(void) { } if (! Dark) - Vga.Sunset(); + Vga->Sunset(); VGA::CopyPage(0, 1); SelectPocket(-1); @@ -730,10 +730,10 @@ static void CaveUp(void) { Shadow->Z = Hero->Z; } FeedSnail(VGA::ShowQ.Locate(BakRef + 999), TAKE); - Vga.Show(); - Vga.CopyPage(1, 0); - Vga.Show(); - Vga.Sunrise(SysPal); + Vga->Show(); + Vga->CopyPage(1, 0); + Vga->Show(); + Vga->Sunrise(SysPal); Dark = false; if (! Startup) Mouse.On(); @@ -756,7 +756,7 @@ static void CaveDown(void) { } spr = n; } - Text.Clear(1000); + Text->Clear(1000); } @@ -772,7 +772,7 @@ static void QGame(void) { SaveSound(); CFILE file = CFILE(UsrPath(UsrFnam), WRI, RCrypt); SaveGame(file); - Vga.Sunset(); + Vga->Sunset(); Finis = true; } @@ -1060,9 +1060,9 @@ static void TakeName(void) { if (GET_TEXT::Ptr) SNPOST_(SNKILL, -1, 0, GET_TEXT::Ptr); else { - GET_TEXT *tn = new GET_TEXT(Text[GETNAME_PROMPT], UsrFnam, 8, KeyClick); + GET_TEXT *tn = new GET_TEXT(Text->getText(GETNAME_PROMPT), UsrFnam, 8, KeyClick); if (tn) { - tn->SetName(Text[GETNAME_TITLE]); + tn->SetName(Text->getText(GETNAME_TITLE)); tn->Center(); tn->Goto(tn->X, tn->Y - 10); tn->Z = 126; @@ -1183,7 +1183,7 @@ static void SayDebug(void) { if (t1 - t >= 18) { static uint32 old = 0L; - uint32 now = Vga.FrmCnt; + uint32 now = Vga->FrmCnt; dwtom(now - old, FRPS, 10, 4); old = now; t = t1; @@ -1534,18 +1534,18 @@ static void MainLoop(void) { #ifdef DEMO static uint32 tc = 0; if (/* FIXME: TimerCount - tc >= ((182L*6L) * 5L) && */ Talk == NULL && Snail.Idle()) { - if (Text[DemoText]) { + if (Text->getText(DemoText)) { SNPOST(SNSOUND, -1, 4, NULL); // drumla SNPOST(SNINF, -1, DemoText, NULL); SNPOST(SNLABEL, -1, -1, NULL); - if (Text[++ DemoText] == NULL) + if (Text->getText(++ DemoText) == NULL) DemoText = DEMO_TEXT + 1; } //FIXME: tc = TimerCount; } #endif - Vga.Show(); + Vga->Show(); Snail_.RunCom(); Snail.RunCom(); } @@ -1573,8 +1573,8 @@ void LoadUser(void) { static void RunGame(void) { - Text.Clear(); - Text.Preload(100, 1000); + Text->Clear(); + Text->Preload(100, 1000); LoadHeroXY(); CavLight.Flags.Tran = true; @@ -1722,11 +1722,11 @@ bool ShowTitle(const char *name) { Talk->Show(2); } - Vga.Sunset(); + Vga->Sunset(); VGA::CopyPage(1, 2); VGA::CopyPage(0, 1); SelectPocket(-1); - Vga.Sunrise(SysPal); + Vga->Sunrise(SysPal); if (STARTUP::Mode < 2 && ! STARTUP::SoundOk) { VGA::CopyPage(1, 2); @@ -1788,7 +1788,7 @@ bool ShowTitle(const char *name) { CFILE file = CFILE(n, REA, RCrypt); LoadGame(file, true); // only system vars VGA::SetColors(SysPal, 64); - Vga.Update(); + Vga->Update(); if (FINIS) { ++ STARTUP::Mode; FINIS = false; @@ -1828,7 +1828,7 @@ void cge_main(void) { memset(Barriers, 0xFF, sizeof(Barriers)); if (! Mouse.Exist) - error("%s", Text[NO_MOUSE_TEXT]); + error("%s", Text->getText(NO_MOUSE_TEXT)); if (! SVG0FILE::Exist(SVG0NAME)) STARTUP::Mode = 2; @@ -1851,8 +1851,8 @@ void cge_main(void) { if (FINIS) Movie("X03"); } else - Vga.Sunset(); - error("%s", Text[EXIT_OK_TEXT + FINIS]); + Vga->Sunset(); + error("%s", Text->getText(EXIT_OK_TEXT + FINIS)); } } // End of namespace CGE diff --git a/engines/cge/cge_main.h b/engines/cge/cge_main.h index 3c9fede6fb..fe50e7bab3 100644 --- a/engines/cge/cge_main.h +++ b/engines/cge/cge_main.h @@ -169,6 +169,9 @@ void ExpandSprite(SPRITE *spr); void ContractSprite(SPRITE *spr); void cge_main(void); +extern VGA *Vga; +extern int OffUseCount; + } // End of namespace CGE #endif diff --git a/engines/cge/config.cpp b/engines/cge/config.cpp index 1900093520..9ffda8d635 100644 --- a/engines/cge/config.cpp +++ b/engines/cge/config.cpp @@ -159,11 +159,11 @@ void SelectSound(void) { Sound.Close(); if (VMENU::Addr) SNPOST_(SNKILL, -1, 0, VMENU::Addr); - Inf(Text[STYPE_TEXT]); + Inf(Text->getText(STYPE_TEXT)); Talk->Goto(Talk->X, FONT_HIG / 2); for (i = 0; i < ArrayCount(DevName); i ++) - DevMenu[i].Text = Text[DevName[i]]; - (new VMENU(DevMenu, SCR_WID / 2, Talk->Y + Talk->H + TEXT_VM + FONT_HIG))->SetName(Text[MENU_TEXT]); + 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)); } @@ -196,9 +196,9 @@ static CHOICE *Cho; static int Hlp; static void SNSelect(void) { - Inf(Text[Hlp]); + 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[MENU_TEXT]); + (new VMENU(Cho, SCR_WID / 2, Talk->Y + Talk->H + TEXT_VM + FONT_HIG))->SetName(Text->getText(MENU_TEXT)); } diff --git a/engines/cge/gettext.cpp b/engines/cge/gettext.cpp index 4399a30916..e11f4ff308 100644 --- a/engines/cge/gettext.cpp +++ b/engines/cge/gettext.cpp @@ -38,7 +38,7 @@ GET_TEXT *GET_TEXT::Ptr = NULL; GET_TEXT::GET_TEXT(const char *info, char *text, int size, void (*click)(void)) : Text(text), Size(min(size, GTMAX)), Len(min(Size, strlen(text))), Cntr(GTBLINK), Click(click), OldKeybClient(KEYBOARD::SetClient(this)) { - int i = 2 * TEXT_HM + Font.Width(info); + int i = 2 * TEXT_HM + Font->Width(info); Ptr = this; Mode = RECT; TS[0] = Box((i + 3) & ~3, 2 * TEXT_VM + 2 * FONT_HIG + TEXT_LS); @@ -106,7 +106,7 @@ void GET_TEXT::Touch(uint16 mask, int x, int y) { if (p) x = ogon[p - bezo]; } - if (Len < Size && 2 * TEXT_HM + Font.Width(Buff) + Font.Wid[x] <= W) { + 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; diff --git a/engines/cge/mixer.cpp b/engines/cge/mixer.cpp index 83d9cd1be5..5b65eee9ca 100644 --- a/engines/cge/mixer.cpp +++ b/engines/cge/mixer.cpp @@ -44,7 +44,7 @@ MIXER::MIXER(int x, int y) : SPRITE(NULL), Fall(MIX_FALL) { mb[0] = new BITMAP("VOLUME"); mb[1] = NULL; SetShapeList(mb); - SetName(Text[MIX_NAME]); + SetName(Text->getText(MIX_NAME)); Flags.Syst = true; Flags.Kill = true; Flags.BDel = true; diff --git a/engines/cge/snail.cpp b/engines/cge/snail.cpp index ec1fae515c..29ab11a36e 100644 --- a/engines/cge/snail.cpp +++ b/engines/cge/snail.cpp @@ -959,13 +959,13 @@ void SNAIL::RunCom(void) { if (sprel && TalkEnable) { if (sprel == Hero && sprel->SeqTest(-1)) sprel->Step(HTALK); - Say(Text[snc->Val], sprel); + Say(Text->getText(snc->Val), sprel); SYSTEM::FunDel = HEROFUN0; } break; case SNINF : if (TalkEnable) { - Inf(Text[snc->Val]); + Inf(Text->getText(snc->Val)); SYSTEM::FunDel = HEROFUN0; } break; diff --git a/engines/cge/startup.cpp b/engines/cge/startup.cpp index e534e04257..631a64d732 100644 --- a/engines/cge/startup.cpp +++ b/engines/cge/startup.cpp @@ -54,7 +54,7 @@ uint16 STARTUP::Summa; void quit_now(int ref) { - error("%d\n", Text[ref]); + error("%s", Text->getText(ref)); } diff --git a/engines/cge/talk.cpp b/engines/cge/talk.cpp index f4c0c1ac27..1739511a49 100644 --- a/engines/cge/talk.cpp +++ b/engines/cge/talk.cpp @@ -97,14 +97,12 @@ void FONT::Save(void) { */ -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); + Font = new FONT(ProgName()); } @@ -144,7 +142,7 @@ void TALK::Update(const char *tx) { mw = k; k = 2 * hmarg; } else - k += Font.Wid[*p]; + k += Font->Wid[*p]; } if (k > mw) mw = k; @@ -157,8 +155,8 @@ void TALK::Update(const char *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]; + int cw = Font->Wid[*tx], i; + uint8 *f = Font->Map + Font->Pos[*tx]; for (i = 0; i < cw; i++) { uint8 *p = m; uint16 n; @@ -255,8 +253,8 @@ void TALK::PutLine(int line, const char *text) { q = v + size; while (* text) { - uint16 cw = Font.Wid[*text], i; - uint8 *fp = Font.Map + Font.Pos[*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]; @@ -303,8 +301,8 @@ void INFO_LINE::Update(const char *tx) { uint8 *p = v + 2, * q = p + size; while (*tx) { - uint16 cw = Font.Wid[*tx]; - uint8 *fp = Font.Map + Font.Pos[*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]; diff --git a/engines/cge/talk.h b/engines/cge/talk.h index 568fd82964..67b4fc91d6 100644 --- a/engines/cge/talk.h +++ b/engines/cge/talk.h @@ -74,7 +74,7 @@ protected: BITMAP *TS[2]; BITMAP *Box(uint16 w, uint16 h); public: - static FONT Font; + FONT *Font; TALK(const char *tx, TBOX_STYLE mode = PURE); TALK(void); //~TALK (void); diff --git a/engines/cge/text.cpp b/engines/cge/text.cpp index 3695c955f5..bbb69839dd 100644 --- a/engines/cge/text.cpp +++ b/engines/cge/text.cpp @@ -38,7 +38,7 @@ namespace CGE { -TEXT Text = ProgName(); +TEXT *Text; TALK *Talk = NULL; TEXT::TEXT(const char *fname, int size) { @@ -163,7 +163,7 @@ char *TEXT::Load(int idx, int ref) { } -char *TEXT::operator [](int ref) { +char *TEXT::getText(int ref) { int i; if ((i = Find(ref)) < Size) return Cache[i].Txt; @@ -202,7 +202,7 @@ void Say(const char *txt, SPRITE *spr) { Talk->Flags.Kill = true; Talk->Flags.BDel = true; - Talk->SetName(Text[SAY_NAME]); + Talk->SetName(Text->getText(SAY_NAME)); Talk->Goto(x - (Talk->W - sw) / 2 - 3 + 6 * east, y - spike->H - Talk->H + 1); Talk->Z = 125; Talk->Ref = SAY_REF; @@ -211,7 +211,7 @@ void Say(const char *txt, SPRITE *spr) { spike->Z = 126; spike->Flags.Slav = true; spike->Flags.Kill = true; - spike->SetName(Text[SAY_NAME]); + spike->SetName(Text->getText(SAY_NAME)); spike->Step(east); spike->Ref = SAY_REF; @@ -226,7 +226,7 @@ void Inf(const char *txt) { if (Talk) { Talk->Flags.Kill = true; Talk->Flags.BDel = true; - Talk->SetName(Text[INF_NAME]); + Talk->SetName(Text->getText(INF_NAME)); Talk->Center(); Talk->Goto(Talk->X, Talk->Y - 20); Talk->Z = 126; diff --git a/engines/cge/text.h b/engines/cge/text.h index 7cf3922c5a..c778210304 100644 --- a/engines/cge/text.h +++ b/engines/cge/text.h @@ -65,12 +65,12 @@ public: ~TEXT(void); void Clear(int from = 1, int upto = 0x7FFF); void Preload(int from = 1, int upto = 0x7FFF); - char *operator[](int ref); + char *getText(int ref); }; extern TALK *Talk; -extern TEXT Text; +extern TEXT *Text; void Say(const char *txt, SPRITE *spr); diff --git a/engines/cge/vga13h.cpp b/engines/cge/vga13h.cpp index a7dd76273d..52015c27f1 100644 --- a/engines/cge/vga13h.cpp +++ b/engines/cge/vga13h.cpp @@ -916,7 +916,7 @@ VGA::VGA(int mode) bool std = true; int i; for (i = 10; i < 20; i ++) { - char *txt = Text[i]; + char *txt = Text->getText(i); if (txt) { // puts(txt); warning(txt); -- cgit v1.2.3