aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/director/director.cpp8
-rw-r--r--engines/director/lingo/lingo-funcs.cpp19
-rw-r--r--engines/director/lingo/lingo-gr.cpp16
-rw-r--r--engines/director/lingo/lingo-gr.y16
-rw-r--r--engines/director/lingo/lingo.cpp16
-rw-r--r--engines/director/lingo/lingo.h15
6 files changed, 64 insertions, 26 deletions
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index dfb4928b2b..ce6732983e 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -72,14 +72,14 @@ Common::Error DirectorEngine::run() {
_lingo = new Lingo(this);
_soundManager = new DirectorSound();
- _lingo->parse("mci \"open MM\\T005045a.wav type WaveAudio alias T005045a\"\n\
- mci \"play T005045a from 22710 to 32872\"");
+ _lingo->addCode("mci \"open MM\\T005045a.wav type WaveAudio alias T005045a\"\n\
+ mci \"play T005045a from 22710 to 32872\"", kMovieScript, 1);
#if 0
- _lingo->parse("set x = 1\n\
+ _lingo->addCode("set x = 1\n\
set y to 2 -- this set y to 4\n\
put 5 into z\n\
--- some more\n");
+-- some more\n", kMovieScript, 2);
#endif
//FIXME
diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index 4ff11a313b..1fb4c19bee 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -61,7 +61,7 @@ struct MCIToken {
{ kMCITokenNone, kMCITokenNone, 0, 0 }
};
-int Lingo::func_mci(Common::String *s) {
+int Lingo::exec_mci(Common::String *s) {
Common::String params[5];
MCITokenType command = kMCITokenNone;
@@ -161,13 +161,22 @@ int Lingo::func_mci(Common::String *s) {
return 0;
}
-void Lingo::func_mciwait(Common::String *s) {
+void Lingo::exec_mciwait(Common::String *s) {
warning("MCI wait file: %s", s->c_str());
}
void Lingo::func_constpush() {
}
+void Lingo::func_varpush() {
+}
+
+void Lingo::func_assign() {
+}
+
+void Lingo::func_eval() {
+}
+
void Lingo::func_add() {
}
@@ -183,4 +192,10 @@ void Lingo::func_div() {
void Lingo::func_negate() {
}
+void Lingo::func_mci() {
+}
+
+void Lingo::func_mciwait() {
+}
+
}
diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index ff3513f12b..f8209be86a 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -1385,7 +1385,7 @@ yyreduce:
case 7:
#line 76 "engines/director/lingo/lingo-gr.y"
- { (yyval.i) = vars[*(yyvsp[(1) - (1)].s)]; delete (yyvsp[(1) - (1)].s); ;}
+ { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(1) - (1)].s)->c_str()); (yyval.i) = g_lingo->code1(g_lingo->func_eval); delete (yyvsp[(1) - (1)].s); ;}
break;
case 8:
@@ -1410,7 +1410,7 @@ yyreduce:
case 12:
#line 81 "engines/director/lingo/lingo-gr.y"
- { (yyval.i) = (yyvsp[(2) - (2)].i); ;}
+ { (yyval.i) = (yyvsp[(2) - (2)].i); ;}
break;
case 13:
@@ -1420,32 +1420,32 @@ yyreduce:
case 14:
#line 83 "engines/director/lingo/lingo-gr.y"
- { (yyval.i) = (yyvsp[(2) - (3)].i); ;}
+ { (yyval.i) = (yyvsp[(2) - (3)].i); ;}
break;
case 16:
#line 87 "engines/director/lingo/lingo-gr.y"
- { g_lingo->func_mci((yyvsp[(2) - (2)].s)); delete (yyvsp[(2) - (2)].s); ;}
+ { g_lingo->code1(g_lingo->func_mci); g_lingo->codeString((yyvsp[(2) - (2)].s)->c_str()); delete (yyvsp[(2) - (2)].s); ;}
break;
case 17:
#line 88 "engines/director/lingo/lingo-gr.y"
- { g_lingo->func_mciwait((yyvsp[(2) - (2)].s)); ;}
+ { g_lingo->code1(g_lingo->func_mciwait); g_lingo->codeString((yyvsp[(2) - (2)].s)->c_str()); delete (yyvsp[(2) - (2)].s); ;}
break;
case 18:
#line 89 "engines/director/lingo/lingo-gr.y"
- { (yyval.i) = vars[*(yyvsp[(4) - (4)].s)] = (yyvsp[(2) - (4)].i); delete (yyvsp[(4) - (4)].s); ;}
+ { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(4) - (4)].s)->c_str()); g_lingo->code1(g_lingo->func_assign); (yyval.i) = (yyvsp[(2) - (4)].i); delete (yyvsp[(4) - (4)].s); ;}
break;
case 19:
#line 90 "engines/director/lingo/lingo-gr.y"
- { (yyval.i) = vars[*(yyvsp[(2) - (4)].s)] = (yyvsp[(4) - (4)].i); delete (yyvsp[(2) - (4)].s); ;}
+ { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(2) - (4)].s)->c_str()); g_lingo->code1(g_lingo->func_assign); (yyval.i) = (yyvsp[(4) - (4)].i); delete (yyvsp[(2) - (4)].s); ;}
break;
case 20:
#line 91 "engines/director/lingo/lingo-gr.y"
- { (yyval.i) = vars[*(yyvsp[(2) - (4)].s)] = (yyvsp[(4) - (4)].i); delete (yyvsp[(2) - (4)].s); ;}
+ { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString((yyvsp[(2) - (4)].s)->c_str()); g_lingo->code1(g_lingo->func_assign); (yyval.i) = (yyvsp[(4) - (4)].i); delete (yyvsp[(2) - (4)].s); ;}
break;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index d9a33f7bcb..e300c5c8f5 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -73,22 +73,22 @@ statement: expr { warning("%d", $1); }
;
expr: INT { $$ = g_lingo->code2(g_lingo->func_constpush, (inst)$1); }
- | VAR { $$ = vars[*$1]; delete $1; }
+ | VAR { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($1->c_str()); $$ = g_lingo->code1(g_lingo->func_eval); delete $1; }
| expr '+' expr { g_lingo->code1(g_lingo->func_add); }
| expr '-' expr { g_lingo->code1(g_lingo->func_sub); }
| expr '*' expr { g_lingo->code1(g_lingo->func_mul); }
| expr '/' expr { g_lingo->code1(g_lingo->func_div); }
- | '+' expr %prec UNARY { $$ = $2; }
+ | '+' expr %prec UNARY { $$ = $2; }
| '-' expr %prec UNARY { $$ = $2; g_lingo->code1(g_lingo->func_negate); }
- | '(' expr ')' { $$ = $2; }
+ | '(' expr ')' { $$ = $2; }
|
;
-func: FUNC_MCI STRING { g_lingo->func_mci($2); delete $2; }
- | FUNC_MCIWAIT VAR { g_lingo->func_mciwait($2); }
- | FUNC_PUT expr OP_INTO VAR { $$ = vars[*$4] = $2; delete $4; }
- | FUNC_SET VAR '=' expr { $$ = vars[*$2] = $4; delete $2; }
- | FUNC_SET VAR OP_TO expr { $$ = vars[*$2] = $4; delete $2; }
+func: FUNC_MCI STRING { g_lingo->code1(g_lingo->func_mci); g_lingo->codeString($2->c_str()); delete $2; }
+ | FUNC_MCIWAIT VAR { g_lingo->code1(g_lingo->func_mciwait); g_lingo->codeString($2->c_str()); delete $2; }
+ | FUNC_PUT expr OP_INTO VAR { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($4->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $2; delete $4; }
+ | FUNC_SET VAR '=' expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; }
+ | FUNC_SET VAR OP_TO expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; }
;
%%
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 8341d5a958..c96e353a52 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -80,6 +80,22 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
Lingo::~Lingo() {
}
+int Lingo::codeString(const char *str) {
+ int instLen = sizeof(inst);
+ int numInsts = (strlen(str) + 1 + instLen - 1) % instLen;
+
+ // Allocate needed space in script
+ _currentScript->push_back(0);
+ char *start = (char *)(&_currentScript->back());
+
+ for (int i = 0; i < numInsts - 1; i++)
+ _currentScript->push_back(0);
+
+ Common::strlcpy(start, str, numInsts * instLen);
+
+ return _currentScript->size();
+}
+
void Lingo::addCode(Common::String code, ScriptType type, uint16 id) {
debug(2, "Add code \"%s\" for type %d with id %d", code.c_str(), type, id);
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 65a9fec417..b209afb6d6 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -85,11 +85,11 @@ public:
void processEvent(LEvent event, int entityId);
- int parse(const char *code);
-
int code1(inst code) { _currentScript->push_back(code); return _currentScript->size(); }
int code2(inst code_1, inst code_2) { code1(code_1); return code1(code_2); }
int code3(inst code_1, inst code_2, inst code_3) { code1(code_1); code1(code_2); return code1(code_3); }
+ int codeString(const char *s);
+
public:
static void func_add();
@@ -98,10 +98,17 @@ public:
static void func_div();
static void func_negate();
static void func_constpush();
- int func_mci(Common::String *s);
- void func_mciwait(Common::String *s);
+ static void func_varpush();
+ static void func_assign();
+ static void func_eval();
+ static void func_mci();
+ static void func_mciwait();
+ int exec_mci(Common::String *s);
+ void exec_mciwait(Common::String *s);
private:
+ int parse(const char *code);
+
Common::HashMap<uint32, const char *> _eventHandlerTypes;
Common::HashMap<Common::String, Audio::AudioStream *> _audioAliases;