diff options
-rw-r--r-- | engines/director/director.cpp | 8 | ||||
-rw-r--r-- | engines/director/lingo/lingo-funcs.cpp | 19 | ||||
-rw-r--r-- | engines/director/lingo/lingo-gr.cpp | 16 | ||||
-rw-r--r-- | engines/director/lingo/lingo-gr.y | 16 | ||||
-rw-r--r-- | engines/director/lingo/lingo.cpp | 16 | ||||
-rw-r--r-- | engines/director/lingo/lingo.h | 15 |
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; |