aboutsummaryrefslogtreecommitdiff
path: root/engines/cge
diff options
context:
space:
mode:
authoreriktorbjorn2011-06-19 11:17:54 +0200
committereriktorbjorn2011-06-19 11:17:54 +0200
commit78e3f2a57bc0442066e00c9b625bbdde3c80ddf9 (patch)
treedd3083c98c7865fcb2664a5843c77924068860ab /engines/cge
parent3871c71f0e6f5202e935ac7119fefedde1f8e449 (diff)
downloadscummvm-rg350-78e3f2a57bc0442066e00c9b625bbdde3c80ddf9.tar.gz
scummvm-rg350-78e3f2a57bc0442066e00c9b625bbdde3c80ddf9.tar.bz2
scummvm-rg350-78e3f2a57bc0442066e00c9b625bbdde3c80ddf9.zip
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...
Diffstat (limited to 'engines/cge')
-rw-r--r--engines/cge/cge.cpp5
-rw-r--r--engines/cge/cge_main.cpp56
-rw-r--r--engines/cge/cge_main.h3
-rw-r--r--engines/cge/config.cpp10
-rw-r--r--engines/cge/gettext.cpp4
-rw-r--r--engines/cge/mixer.cpp2
-rw-r--r--engines/cge/snail.cpp4
-rw-r--r--engines/cge/startup.cpp2
-rw-r--r--engines/cge/talk.cpp18
-rw-r--r--engines/cge/talk.h2
-rw-r--r--engines/cge/text.cpp10
-rw-r--r--engines/cge/text.h4
-rw-r--r--engines/cge/vga13h.cpp2
13 files changed, 64 insertions, 58 deletions
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<int>(size, GTMAX)), Len(min<int>(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);