[Scummvm-git-logs] scummvm master -> b6f4acc61403de7eb16e6bef2f514e87e1c6928b
neuromancer
noreply at scummvm.org
Wed Jan 19 19:33:12 UTC 2022
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
2fbc32e8ef HYPNO: fixed memory leaks in spider
b6f4acc614 HYPNO: fixed more memory leaks and uninitialized variables in spider
Commit: 2fbc32e8ef8c918c6fd97137d3397d0ae52a47f3
https://github.com/scummvm/scummvm/commit/2fbc32e8ef8c918c6fd97137d3397d0ae52a47f3
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-01-19T20:33:08+01:00
Commit Message:
HYPNO: fixed memory leaks in spider
Changed paths:
engines/hypno/actions.cpp
engines/hypno/hypno.cpp
engines/hypno/spider/hard.cpp
diff --git a/engines/hypno/actions.cpp b/engines/hypno/actions.cpp
index cfd6250d3c8..6c87b73a633 100644
--- a/engines/hypno/actions.cpp
+++ b/engines/hypno/actions.cpp
@@ -196,6 +196,12 @@ void HypnoEngine::runAmbient(Ambient *a) {
else
sframe = frame;
drawImage(*sframe, a->origin.x, a->origin.y, true);
+ if (a->fullscreen){
+ frame->free();
+ delete frame;
+ }
+ sframe->free();
+ delete sframe;
} else {
bool loop = a->flag == "/LOOP";
if (loop) { // Avoid re-adding the same looping video
diff --git a/engines/hypno/hypno.cpp b/engines/hypno/hypno.cpp
index 1f6db466811..ca5e9340c5c 100644
--- a/engines/hypno/hypno.cpp
+++ b/engines/hypno/hypno.cpp
@@ -262,6 +262,9 @@ void HypnoEngine::loadImage(const Common::String &name, int x, int y, bool trans
surf = decodeFrame(name, frameNumber);
drawImage(*surf, x, y, transparent);
+
+ surf->free();
+ delete surf;
}
void HypnoEngine::drawImage(Graphics::Surface &surf, int x, int y, bool transparent) {
diff --git a/engines/hypno/spider/hard.cpp b/engines/hypno/spider/hard.cpp
index 00391513188..2f756712a58 100644
--- a/engines/hypno/spider/hard.cpp
+++ b/engines/hypno/spider/hard.cpp
@@ -87,6 +87,7 @@ void SpiderEngine::runMatrix(Code *code) {
}
playVideo(*v);
+ delete v;
Graphics::Surface *menu;
Common::Rect menuArea(0, 0, 0, 0);
if (isDemo()) // No hints in demo
@@ -112,14 +113,17 @@ void SpiderEngine::runMatrix(Code *code) {
if (_h1Area.contains(mousePos)) {
v = new MVideo("hint/p02h03s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h2Area.contains(mousePos)) {
v = new MVideo("hint/p02h04s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h3Area.contains(mousePos)) {
v = new MVideo("hint/p02h05s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (menuArea.contains(mousePos)) {
if (isDemo())
@@ -172,10 +176,6 @@ void SpiderEngine::runMatrix(Code *code) {
return;
}
- if (v->decoder->needsUpdate()) {
- updateScreen(*v);
- }
-
drawScreen();
g_system->delayMillis(10);
}
@@ -319,10 +319,12 @@ void SpiderEngine::runNote(Code *code) {
if (_sceneState["GS_PUZZLELEVEL"] == 0) { // easy
v = new MVideo("int_ball/ppv007es.smk", Common::Point(0, 0), false, true, false);
runIntro(*v);
+ delete v;
loadImage("int_ball/enote.smk", 0, 0, false, true);
} else { // hard
v = new MVideo("int_ball/ppv007hs.smk", Common::Point(0, 0), false, true, false);
runIntro(*v);
+ delete v;
loadImage("int_ball/hnote.smk", 0, 0, false, true);
}
@@ -354,6 +356,7 @@ void SpiderEngine::runNote(Code *code) {
else
v = new MVideo("hint/p11h01s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h2Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -361,6 +364,7 @@ void SpiderEngine::runNote(Code *code) {
else
v = new MVideo("hint/p11h03s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h3Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -368,6 +372,7 @@ void SpiderEngine::runNote(Code *code) {
else
v = new MVideo("hint/p11h04s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (menuArea.contains(mousePos)) {
openMainMenuDialog();
@@ -429,9 +434,11 @@ void SpiderEngine::runNote(Code *code) {
if (_sceneState["GS_PUZZLELEVEL"] == 0) {
v = new MVideo("cine/ppv008es.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
} else if (_sceneState["GS_PUZZLELEVEL"] == 1) {
v = new MVideo("cine/ppv008hs.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
}
_nextLevel = code->levelIfWin;
@@ -635,6 +642,7 @@ void SpiderEngine::runFileCabinet(Code *code) {
if (!_intros.contains(intro)) {
v = new MVideo(intro, Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
_intros[intro] = true;
}
@@ -659,6 +667,7 @@ void SpiderEngine::runFileCabinet(Code *code) {
else
v = new MVideo("hint/p09h01s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h2Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -666,6 +675,7 @@ void SpiderEngine::runFileCabinet(Code *code) {
else
v = new MVideo("hint/p09h03s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h3Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -673,6 +683,7 @@ void SpiderEngine::runFileCabinet(Code *code) {
else
v = new MVideo("hint/p09h04s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (menuArea.contains(mousePos)) {
openMainMenuDialog();
@@ -682,6 +693,7 @@ void SpiderEngine::runFileCabinet(Code *code) {
|| (_sceneState["GS_PUZZLELEVEL"] == 1 && comb[0] == 2 && comb[1] == 2 && comb[2] == 5 && comb[3] == 7 && comb[4] == 1 && comb[5] == 6)) {
v = new MVideo("cine/file0000.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
_sceneState["GS_SWITCH0"] = 1;
}
@@ -784,6 +796,7 @@ void SpiderEngine::runLock(Code *code) {
else
v = new MVideo("hint/p17h01s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h2Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -791,6 +804,7 @@ void SpiderEngine::runLock(Code *code) {
else
v = new MVideo("hint/p17h03s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h3Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -798,6 +812,7 @@ void SpiderEngine::runLock(Code *code) {
else
v = new MVideo("hint/p17h04s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (menuArea.contains(mousePos)) {
openMainMenuDialog();
@@ -888,10 +903,12 @@ void SpiderEngine::runFuseBox(Code *code) {
if (_sceneState["GS_PUZZLELEVEL"] == 0) { // easy
v = new MVideo("cine/ppv011es.smk", Common::Point(0, 0), false, true, false);
runIntro(*v);
+ delete v;
loadImage("movie2/efusebg.smk", 0, 0, false, true);
} else { // hard
v = new MVideo("cine/ppv011hs.smk", Common::Point(0, 0), false, true, false);
runIntro(*v);
+ delete v;
loadImage("movie2/hfusebg.smk", 0, 0, false, true);
}
@@ -918,6 +935,7 @@ void SpiderEngine::runFuseBox(Code *code) {
else
v = new MVideo("hint/p19h02s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h2Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -925,6 +943,7 @@ void SpiderEngine::runFuseBox(Code *code) {
else
v = new MVideo("hint/p19h03s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (_h3Area.contains(mousePos)) {
if (_sceneState["GS_PUZZLELEVEL"] == 0)
@@ -932,6 +951,7 @@ void SpiderEngine::runFuseBox(Code *code) {
else
v = new MVideo("hint/p19h04s.smk", Common::Point(0, 0), false, false, false);
runIntro(*v);
+ delete v;
break;
} else if (menuArea.contains(mousePos)) {
openMainMenuDialog();
Commit: b6f4acc61403de7eb16e6bef2f514e87e1c6928b
https://github.com/scummvm/scummvm/commit/b6f4acc61403de7eb16e6bef2f514e87e1c6928b
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-01-19T20:33:08+01:00
Commit Message:
HYPNO: fixed more memory leaks and uninitialized variables in spider
Changed paths:
engines/hypno/grammar.h
engines/hypno/grammar_mis.cpp
engines/hypno/grammar_mis.y
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index 0cd25eccca9..093beb3cac7 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -50,7 +50,6 @@ public:
bool scaled;
bool transparent;
bool loop;
- bool palette;
HypnoSmackerDecoder *decoder;
const Graphics::Surface *currentFrame;
};
@@ -299,6 +298,7 @@ public:
Talk() {
type = TalkAction;
boxPos = Common::Point(0, 0);
+ escape = false;
}
TalkCommands commands;
bool active;
@@ -401,6 +401,7 @@ public:
ArcadeShooting() {
type = ArcadeLevel;
health = 100;
+ transitionTime = 0;
}
uint32 id;
Common::String mode;
@@ -434,12 +435,14 @@ public:
nextLevel = level;
levelEasy = "";
levelHard = "";
+ frameNumber = 0;
}
Transition(Common::String easy, Common::String hard) {
type = TransitionLevel;
levelEasy = easy;
levelHard = hard;
+ frameNumber = 0;
}
Common::String nextLevel;
Common::String levelEasy;
diff --git a/engines/hypno/grammar_mis.cpp b/engines/hypno/grammar_mis.cpp
index cebfa2949ac..5ecff6a00c3 100644
--- a/engines/hypno/grammar_mis.cpp
+++ b/engines/hypno/grammar_mis.cpp
@@ -89,8 +89,8 @@ extern int HYPNO_MIS_lex();
extern int HYPNO_MIS_parse();
extern int yylineno;
-Common::Array<uint32> *smenu_idx;
-Hypno::HotspotsStack *stack;
+Common::Array<uint32> *smenu_idx = nullptr;
+Hypno::HotspotsStack *stack = nullptr;
Hypno::Talk *talk_action = nullptr;
void HYPNO_MIS_xerror(const char *str) {
@@ -584,12 +584,12 @@ static const yytype_int8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 73, 73, 76, 83, 84, 88, 104, 110, 125,
- 131, 137, 138, 145, 152, 158, 164, 170, 177, 184,
- 191, 198, 204, 210, 213, 219, 225, 228, 229, 232,
- 239, 242, 243, 247, 250, 253, 257, 261, 266, 272,
- 273, 279, 285, 291, 298, 305, 311, 316, 317, 320,
- 321, 324, 325, 328, 329
+ 0, 73, 73, 76, 87, 88, 92, 108, 114, 129,
+ 135, 141, 142, 149, 156, 162, 168, 174, 181, 188,
+ 195, 202, 208, 214, 217, 223, 229, 232, 233, 236,
+ 243, 246, 247, 251, 254, 257, 261, 265, 270, 276,
+ 277, 283, 289, 295, 302, 309, 315, 320, 321, 324,
+ 325, 328, 329, 332, 333
};
#endif
@@ -1231,25 +1231,29 @@ yyreduce:
case 3: /* init: %empty */
#line 76 "engines/hypno/grammar_mis.y"
{
+ if (smenu_idx)
+ delete smenu_idx;
smenu_idx = new Common::Array<uint32>();
smenu_idx->push_back(-1);
+ if (stack)
+ delete stack;
stack = new Hypno::HotspotsStack();
stack->push_back(new Hotspots());
}
-#line 1240 "engines/hypno/grammar_mis.cpp"
+#line 1244 "engines/hypno/grammar_mis.cpp"
break;
case 6: /* line: MENUTOK mflag mflag mflag */
-#line 88 "engines/hypno/grammar_mis.y"
+#line 92 "engines/hypno/grammar_mis.y"
{
- Hotspot *hot = new Hotspot(MakeMenu);
+ Hotspot hot(MakeMenu);
debugC(1, kHypnoDebugParser, "MENU %s %s", (yyvsp[-2].s), (yyvsp[-1].s));
- hot->flags[0] = (yyvsp[-2].s);
- hot->flags[1] = (yyvsp[-1].s);
- hot->flags[2] = (yyvsp[0].s);
+ hot.flags[0] = (yyvsp[-2].s);
+ hot.flags[1] = (yyvsp[-1].s);
+ hot.flags[2] = (yyvsp[0].s);
Hotspots *cur = stack->back();
- cur->push_back(*hot);
+ cur->push_back(hot);
// We don't care about menus, only hotspots
int idx = smenu_idx->back();
@@ -1257,22 +1261,22 @@ yyreduce:
smenu_idx->pop_back();
smenu_idx->push_back(idx);
}
-#line 1261 "engines/hypno/grammar_mis.cpp"
+#line 1265 "engines/hypno/grammar_mis.cpp"
break;
case 7: /* line: HOTSTOK BBOXTOK NUM NUM NUM NUM */
-#line 104 "engines/hypno/grammar_mis.y"
+#line 108 "engines/hypno/grammar_mis.y"
{
- Hotspot *hot = new Hotspot(MakeHotspot, Common::Rect((yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)));
- debugC(1, kHypnoDebugParser, "HOTS %d.", hot->type);
+ Hotspot hot(MakeHotspot, Common::Rect((yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)));
+ debugC(1, kHypnoDebugParser, "HOTS %d.", hot.type);
Hotspots *cur = stack->back();
- cur->push_back(*hot);
+ cur->push_back(hot);
}
-#line 1272 "engines/hypno/grammar_mis.cpp"
+#line 1276 "engines/hypno/grammar_mis.cpp"
break;
case 8: /* line: SMENTOK */
-#line 110 "engines/hypno/grammar_mis.y"
+#line 114 "engines/hypno/grammar_mis.y"
{
// This should always point to a hotspot
int idx = smenu_idx->back();
@@ -1288,39 +1292,39 @@ yyreduce:
stack->push_back(hot->smenu);
debugC(1, kHypnoDebugParser, "SUBMENU");
}
-#line 1292 "engines/hypno/grammar_mis.cpp"
+#line 1296 "engines/hypno/grammar_mis.cpp"
break;
case 9: /* line: ESCPTOK */
-#line 125 "engines/hypno/grammar_mis.y"
+#line 129 "engines/hypno/grammar_mis.y"
{
Escape *a = new Escape();
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "ESC SUBMENU"); }
-#line 1303 "engines/hypno/grammar_mis.cpp"
+#line 1307 "engines/hypno/grammar_mis.cpp"
break;
case 10: /* line: TIMETOK NUM mflag */
-#line 131 "engines/hypno/grammar_mis.y"
+#line 135 "engines/hypno/grammar_mis.y"
{
Timer *a = new Timer((yyvsp[-1].i));
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "TIME %d", (yyvsp[-1].i)); }
-#line 1314 "engines/hypno/grammar_mis.cpp"
+#line 1318 "engines/hypno/grammar_mis.cpp"
break;
case 11: /* line: SWPTTOK NUM */
-#line 137 "engines/hypno/grammar_mis.y"
+#line 141 "engines/hypno/grammar_mis.y"
{ debugC(1, kHypnoDebugParser, "SWPT %d", (yyvsp[0].i)); }
-#line 1320 "engines/hypno/grammar_mis.cpp"
+#line 1324 "engines/hypno/grammar_mis.cpp"
break;
case 12: /* line: BACKTOK FILENAME NUM NUM gsswitch flag flag */
-#line 138 "engines/hypno/grammar_mis.y"
+#line 142 "engines/hypno/grammar_mis.y"
{
Background *a = new Background((yyvsp[-5].s), Common::Point((yyvsp[-4].i), (yyvsp[-3].i)), (yyvsp[-2].s), (yyvsp[-1].s), (yyvsp[0].s));
Hotspots *cur = stack->back();
@@ -1328,11 +1332,11 @@ yyreduce:
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "BACK");
}
-#line 1332 "engines/hypno/grammar_mis.cpp"
+#line 1336 "engines/hypno/grammar_mis.cpp"
break;
case 13: /* line: GLOBTOK GSSWITCH NAME */
-#line 145 "engines/hypno/grammar_mis.y"
+#line 149 "engines/hypno/grammar_mis.y"
{
Global *a = new Global((yyvsp[-1].s), (yyvsp[0].s));
Hotspots *cur = stack->back();
@@ -1340,44 +1344,44 @@ yyreduce:
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "GLOB");
}
-#line 1344 "engines/hypno/grammar_mis.cpp"
+#line 1348 "engines/hypno/grammar_mis.cpp"
break;
case 14: /* line: AMBITOK FILENAME NUM NUM flag */
-#line 152 "engines/hypno/grammar_mis.y"
+#line 156 "engines/hypno/grammar_mis.y"
{
Ambient *a = new Ambient((yyvsp[-3].s), Common::Point((yyvsp[-2].i), (yyvsp[-1].i)), (yyvsp[0].s));
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "AMBI %d %d", (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1355 "engines/hypno/grammar_mis.cpp"
+#line 1359 "engines/hypno/grammar_mis.cpp"
break;
case 15: /* line: PLAYTOK FILENAME NUM NUM gsswitch flag */
-#line 158 "engines/hypno/grammar_mis.y"
+#line 162 "engines/hypno/grammar_mis.y"
{
Play *a = new Play((yyvsp[-4].s), Common::Point((yyvsp[-3].i), (yyvsp[-2].i)), (yyvsp[-1].s), (yyvsp[0].s));
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "PLAY %s.", (yyvsp[-4].s)); }
-#line 1366 "engines/hypno/grammar_mis.cpp"
+#line 1370 "engines/hypno/grammar_mis.cpp"
break;
case 16: /* line: OVERTOK FILENAME NUM NUM flag */
-#line 164 "engines/hypno/grammar_mis.y"
+#line 168 "engines/hypno/grammar_mis.y"
{
Overlay *a = new Overlay((yyvsp[-3].s), Common::Point((yyvsp[-2].i), (yyvsp[-1].i)), (yyvsp[0].s));
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
}
-#line 1377 "engines/hypno/grammar_mis.cpp"
+#line 1381 "engines/hypno/grammar_mis.cpp"
break;
case 17: /* line: PALETOK FILENAME */
-#line 170 "engines/hypno/grammar_mis.y"
+#line 174 "engines/hypno/grammar_mis.y"
{
Palette *a = new Palette((yyvsp[0].s));
Hotspots *cur = stack->back();
@@ -1385,11 +1389,11 @@ yyreduce:
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "PALE");
}
-#line 1389 "engines/hypno/grammar_mis.cpp"
+#line 1393 "engines/hypno/grammar_mis.cpp"
break;
case 18: /* line: INTRTOK FILENAME NUM NUM */
-#line 177 "engines/hypno/grammar_mis.y"
+#line 181 "engines/hypno/grammar_mis.y"
{
Intro *a = new Intro(Common::String("cine/") + (yyvsp[-2].s));
Hotspots *cur = stack->back();
@@ -1397,11 +1401,11 @@ yyreduce:
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "INTRO %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
}
-#line 1401 "engines/hypno/grammar_mis.cpp"
+#line 1405 "engines/hypno/grammar_mis.cpp"
break;
case 19: /* line: INTRTOK FILENAME */
-#line 184 "engines/hypno/grammar_mis.y"
+#line 188 "engines/hypno/grammar_mis.y"
{
Intro *a = new Intro(Common::String("cine/") + (yyvsp[0].s));
Hotspots *cur = stack->back();
@@ -1409,11 +1413,11 @@ yyreduce:
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "INTRO %s", (yyvsp[0].s));
}
-#line 1413 "engines/hypno/grammar_mis.cpp"
+#line 1417 "engines/hypno/grammar_mis.cpp"
break;
case 20: /* line: CUTSTOK FILENAME */
-#line 191 "engines/hypno/grammar_mis.y"
+#line 195 "engines/hypno/grammar_mis.y"
{
Cutscene *a = new Cutscene((yyvsp[0].s));
Hotspots *cur = stack->back();
@@ -1421,197 +1425,197 @@ yyreduce:
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "CUTS %s", (yyvsp[0].s));
}
-#line 1425 "engines/hypno/grammar_mis.cpp"
+#line 1429 "engines/hypno/grammar_mis.cpp"
break;
case 21: /* line: WALNTOK FILENAME NUM NUM gsswitch flag */
-#line 198 "engines/hypno/grammar_mis.y"
+#line 202 "engines/hypno/grammar_mis.y"
{
WalN *a = new WalN((yyvsp[-5].s), (yyvsp[-4].s), Common::Point((yyvsp[-3].i), (yyvsp[-2].i)), (yyvsp[-1].s), (yyvsp[0].s));
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
debugC(1, kHypnoDebugParser, "WALN %s %d %d", (yyvsp[-4].s), (yyvsp[-3].i), (yyvsp[-2].i)); }
-#line 1436 "engines/hypno/grammar_mis.cpp"
+#line 1440 "engines/hypno/grammar_mis.cpp"
break;
case 22: /* line: MICETOK FILENAME NUM */
-#line 204 "engines/hypno/grammar_mis.y"
+#line 208 "engines/hypno/grammar_mis.y"
{
Mice *a = new Mice((yyvsp[-1].s), (yyvsp[0].i)-1);
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(a);
}
-#line 1447 "engines/hypno/grammar_mis.cpp"
+#line 1451 "engines/hypno/grammar_mis.cpp"
break;
case 23: /* line: MPTRTOK FILENAME NUM NUM NUM NUM NUM */
-#line 210 "engines/hypno/grammar_mis.y"
+#line 214 "engines/hypno/grammar_mis.y"
{
debugC(1, kHypnoDebugParser, "MPTR %s %d %d %d %d %d", (yyvsp[-5].s), (yyvsp[-4].i), (yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
}
-#line 1455 "engines/hypno/grammar_mis.cpp"
+#line 1459 "engines/hypno/grammar_mis.cpp"
break;
case 24: /* line: TALKTOK alloctalk talk */
-#line 213 "engines/hypno/grammar_mis.y"
+#line 217 "engines/hypno/grammar_mis.y"
{
Hotspots *cur = stack->back();
Hotspot *hot = &cur->back();
hot->actions.push_back(talk_action);
talk_action = nullptr;
debugC(1, kHypnoDebugParser, "TALK"); }
-#line 1466 "engines/hypno/grammar_mis.cpp"
+#line 1470 "engines/hypno/grammar_mis.cpp"
break;
case 25: /* line: ENDTOK anything RETTOK */
-#line 219 "engines/hypno/grammar_mis.y"
+#line 223 "engines/hypno/grammar_mis.y"
{
debugC(1, kHypnoDebugParser, "explicit END");
g_parsedHots = stack->back();
stack->pop_back();
smenu_idx->pop_back();
}
-#line 1477 "engines/hypno/grammar_mis.cpp"
+#line 1481 "engines/hypno/grammar_mis.cpp"
break;
case 26: /* line: RETTOK */
-#line 225 "engines/hypno/grammar_mis.y"
+#line 229 "engines/hypno/grammar_mis.y"
{ debugC(1, kHypnoDebugParser, "implicit END"); }
-#line 1483 "engines/hypno/grammar_mis.cpp"
+#line 1487 "engines/hypno/grammar_mis.cpp"
break;
case 29: /* alloctalk: %empty */
-#line 232 "engines/hypno/grammar_mis.y"
+#line 236 "engines/hypno/grammar_mis.y"
{
assert(talk_action == nullptr);
talk_action = new Talk();
talk_action->escape = false;
talk_action->active = true;
}
-#line 1494 "engines/hypno/grammar_mis.cpp"
+#line 1498 "engines/hypno/grammar_mis.cpp"
break;
case 30: /* talk: INACTOK talk */
-#line 239 "engines/hypno/grammar_mis.y"
+#line 243 "engines/hypno/grammar_mis.y"
{
talk_action->active = false;
debugC(1, kHypnoDebugParser, "inactive"); }
-#line 1502 "engines/hypno/grammar_mis.cpp"
+#line 1506 "engines/hypno/grammar_mis.cpp"
break;
case 31: /* talk: FDTOK talk */
-#line 242 "engines/hypno/grammar_mis.y"
+#line 246 "engines/hypno/grammar_mis.y"
{ debugC(1, kHypnoDebugParser, "inactive"); }
-#line 1508 "engines/hypno/grammar_mis.cpp"
+#line 1512 "engines/hypno/grammar_mis.cpp"
break;
case 32: /* talk: BACKTOK FILENAME NUM NUM gsswitch flag */
-#line 243 "engines/hypno/grammar_mis.y"
+#line 247 "engines/hypno/grammar_mis.y"
{
talk_action->background = (yyvsp[-4].s);
talk_action->backgroundPos = Common::Point((yyvsp[-3].i), (yyvsp[-2].i));
debugC(1, kHypnoDebugParser, "BACK in TALK"); }
-#line 1517 "engines/hypno/grammar_mis.cpp"
+#line 1521 "engines/hypno/grammar_mis.cpp"
break;
case 33: /* talk: BOXXTOK NUM NUM */
-#line 247 "engines/hypno/grammar_mis.y"
+#line 251 "engines/hypno/grammar_mis.y"
{
talk_action->boxPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
debugC(1, kHypnoDebugParser, "BOXX %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1525 "engines/hypno/grammar_mis.cpp"
+#line 1529 "engines/hypno/grammar_mis.cpp"
break;
case 34: /* talk: ESCAPETOK */
-#line 250 "engines/hypno/grammar_mis.y"
+#line 254 "engines/hypno/grammar_mis.y"
{
talk_action->escape = true;
debugC(1, kHypnoDebugParser, "ESCAPE"); }
-#line 1533 "engines/hypno/grammar_mis.cpp"
+#line 1537 "engines/hypno/grammar_mis.cpp"
break;
case 35: /* talk: SECONDTOK FILENAME NUM NUM flag */
-#line 253 "engines/hypno/grammar_mis.y"
+#line 257 "engines/hypno/grammar_mis.y"
{
talk_action->second = (yyvsp[-3].s);
talk_action->secondPos = Common::Point((yyvsp[-2].i), (yyvsp[-1].i));
debugC(1, kHypnoDebugParser, "SECOND %s %d %d '%s'", (yyvsp[-3].s), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].s)); }
-#line 1542 "engines/hypno/grammar_mis.cpp"
+#line 1546 "engines/hypno/grammar_mis.cpp"
break;
case 36: /* talk: INTROTOK FILENAME NUM NUM */
-#line 257 "engines/hypno/grammar_mis.y"
+#line 261 "engines/hypno/grammar_mis.y"
{
talk_action->intro = (yyvsp[-2].s);
talk_action->introPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
debugC(1, kHypnoDebugParser, "INTRO %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1551 "engines/hypno/grammar_mis.cpp"
+#line 1555 "engines/hypno/grammar_mis.cpp"
break;
case 37: /* talk: DEFAULTTOK FILENAME NUM NUM */
-#line 261 "engines/hypno/grammar_mis.y"
+#line 265 "engines/hypno/grammar_mis.y"
{
// Unsure how this is different from second
talk_action->second = (yyvsp[-2].s);
talk_action->secondPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
debugC(1, kHypnoDebugParser, "DEFAULT %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1561 "engines/hypno/grammar_mis.cpp"
+#line 1565 "engines/hypno/grammar_mis.cpp"
break;
case 38: /* talk: PG talk */
-#line 266 "engines/hypno/grammar_mis.y"
+#line 270 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "G";
talk_cmd.path = (yyvsp[-1].s)+2;
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1572 "engines/hypno/grammar_mis.cpp"
+#line 1576 "engines/hypno/grammar_mis.cpp"
break;
case 39: /* talk: PH talk */
-#line 272 "engines/hypno/grammar_mis.y"
+#line 276 "engines/hypno/grammar_mis.y"
{ debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1578 "engines/hypno/grammar_mis.cpp"
+#line 1582 "engines/hypno/grammar_mis.cpp"
break;
case 40: /* talk: PF talk */
-#line 273 "engines/hypno/grammar_mis.y"
+#line 277 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "F";
talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1589 "engines/hypno/grammar_mis.cpp"
+#line 1593 "engines/hypno/grammar_mis.cpp"
break;
case 41: /* talk: PA talk */
-#line 279 "engines/hypno/grammar_mis.y"
+#line 283 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "A";
talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "|A%d", talk_cmd.num); }
-#line 1600 "engines/hypno/grammar_mis.cpp"
+#line 1604 "engines/hypno/grammar_mis.cpp"
break;
case 42: /* talk: PD talk */
-#line 285 "engines/hypno/grammar_mis.y"
+#line 289 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "D";
talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1611 "engines/hypno/grammar_mis.cpp"
+#line 1615 "engines/hypno/grammar_mis.cpp"
break;
case 43: /* talk: PP NUM NUM flag talk */
-#line 291 "engines/hypno/grammar_mis.y"
+#line 295 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "P";
@@ -1619,11 +1623,11 @@ yyreduce:
talk_cmd.position = Common::Point((yyvsp[-3].i), (yyvsp[-2].i));
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "%s %d %d '%s'", (yyvsp[-4].s), (yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].s)); }
-#line 1623 "engines/hypno/grammar_mis.cpp"
+#line 1627 "engines/hypno/grammar_mis.cpp"
break;
case 44: /* talk: PI NUM NUM talk */
-#line 298 "engines/hypno/grammar_mis.y"
+#line 302 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "I";
@@ -1631,74 +1635,74 @@ yyreduce:
talk_cmd.position = Common::Point((yyvsp[-2].i), (yyvsp[-1].i));
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "%s %d %d", (yyvsp[-3].s), (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1635 "engines/hypno/grammar_mis.cpp"
+#line 1639 "engines/hypno/grammar_mis.cpp"
break;
case 45: /* talk: PS talk */
-#line 305 "engines/hypno/grammar_mis.y"
+#line 309 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "S";
talk_cmd.variable = (yyvsp[-1].s)+2;
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1646 "engines/hypno/grammar_mis.cpp"
+#line 1650 "engines/hypno/grammar_mis.cpp"
break;
case 46: /* talk: PL talk */
-#line 311 "engines/hypno/grammar_mis.y"
+#line 315 "engines/hypno/grammar_mis.y"
{
TalkCommand talk_cmd;
talk_cmd.command = "L";
talk_action->commands.push_back(talk_cmd);
debugC(1, kHypnoDebugParser, "|L"); }
-#line 1656 "engines/hypno/grammar_mis.cpp"
+#line 1660 "engines/hypno/grammar_mis.cpp"
break;
case 47: /* talk: PE */
-#line 316 "engines/hypno/grammar_mis.y"
+#line 320 "engines/hypno/grammar_mis.y"
{ debugC(1, kHypnoDebugParser, "|E"); }
-#line 1662 "engines/hypno/grammar_mis.cpp"
+#line 1666 "engines/hypno/grammar_mis.cpp"
break;
case 49: /* mflag: NAME */
-#line 320 "engines/hypno/grammar_mis.y"
+#line 324 "engines/hypno/grammar_mis.y"
{ (yyval.s) = (yyvsp[0].s); }
-#line 1668 "engines/hypno/grammar_mis.cpp"
+#line 1672 "engines/hypno/grammar_mis.cpp"
break;
case 50: /* mflag: %empty */
-#line 321 "engines/hypno/grammar_mis.y"
+#line 325 "engines/hypno/grammar_mis.y"
{ (yyval.s) = scumm_strdup(""); }
-#line 1674 "engines/hypno/grammar_mis.cpp"
+#line 1678 "engines/hypno/grammar_mis.cpp"
break;
case 51: /* flag: FLAG */
-#line 324 "engines/hypno/grammar_mis.y"
+#line 328 "engines/hypno/grammar_mis.y"
{ (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "flag: %s", (yyvsp[0].s)); }
-#line 1680 "engines/hypno/grammar_mis.cpp"
+#line 1684 "engines/hypno/grammar_mis.cpp"
break;
case 52: /* flag: %empty */
-#line 325 "engines/hypno/grammar_mis.y"
+#line 329 "engines/hypno/grammar_mis.y"
{ (yyval.s) = scumm_strdup(""); }
-#line 1686 "engines/hypno/grammar_mis.cpp"
+#line 1690 "engines/hypno/grammar_mis.cpp"
break;
case 53: /* gsswitch: GSSWITCH */
-#line 328 "engines/hypno/grammar_mis.y"
+#line 332 "engines/hypno/grammar_mis.y"
{ (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "switch %s", (yyvsp[0].s)); }
-#line 1692 "engines/hypno/grammar_mis.cpp"
+#line 1696 "engines/hypno/grammar_mis.cpp"
break;
case 54: /* gsswitch: %empty */
-#line 329 "engines/hypno/grammar_mis.y"
+#line 333 "engines/hypno/grammar_mis.y"
{ (yyval.s) = scumm_strdup(""); }
-#line 1698 "engines/hypno/grammar_mis.cpp"
+#line 1702 "engines/hypno/grammar_mis.cpp"
break;
-#line 1702 "engines/hypno/grammar_mis.cpp"
+#line 1706 "engines/hypno/grammar_mis.cpp"
default: break;
}
diff --git a/engines/hypno/grammar_mis.y b/engines/hypno/grammar_mis.y
index c2e17d8bfbc..8fa25544cf1 100644
--- a/engines/hypno/grammar_mis.y
+++ b/engines/hypno/grammar_mis.y
@@ -37,8 +37,8 @@ extern int HYPNO_MIS_lex();
extern int HYPNO_MIS_parse();
extern int yylineno;
-Common::Array<uint32> *smenu_idx;
-Hypno::HotspotsStack *stack;
+Common::Array<uint32> *smenu_idx = nullptr;
+Hypno::HotspotsStack *stack = nullptr;
Hypno::Talk *talk_action = nullptr;
void HYPNO_MIS_xerror(const char *str) {
@@ -74,8 +74,12 @@ start: init lines
;
init: {
+ if (smenu_idx)
+ delete smenu_idx;
smenu_idx = new Common::Array<uint32>();
smenu_idx->push_back(-1);
+ if (stack)
+ delete stack;
stack = new Hypno::HotspotsStack();
stack->push_back(new Hotspots());
}
@@ -86,14 +90,14 @@ lines: line lines
line: MENUTOK mflag mflag mflag {
- Hotspot *hot = new Hotspot(MakeMenu);
+ Hotspot hot(MakeMenu);
debugC(1, kHypnoDebugParser, "MENU %s %s", $2, $3);
- hot->flags[0] = $2;
- hot->flags[1] = $3;
- hot->flags[2] = $4;
+ hot.flags[0] = $2;
+ hot.flags[1] = $3;
+ hot.flags[2] = $4;
Hotspots *cur = stack->back();
- cur->push_back(*hot);
+ cur->push_back(hot);
// We don't care about menus, only hotspots
int idx = smenu_idx->back();
@@ -102,10 +106,10 @@ line: MENUTOK mflag mflag mflag {
smenu_idx->push_back(idx);
}
| HOTSTOK BBOXTOK NUM NUM NUM NUM {
- Hotspot *hot = new Hotspot(MakeHotspot, Common::Rect($3, $4, $5, $6));
- debugC(1, kHypnoDebugParser, "HOTS %d.", hot->type);
+ Hotspot hot(MakeHotspot, Common::Rect($3, $4, $5, $6));
+ debugC(1, kHypnoDebugParser, "HOTS %d.", hot.type);
Hotspots *cur = stack->back();
- cur->push_back(*hot);
+ cur->push_back(hot);
}
| SMENTOK {
// This should always point to a hotspot
More information about the Scummvm-git-logs
mailing list