diff options
Diffstat (limited to 'script.cpp')
-rw-r--r-- | script.cpp | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/script.cpp b/script.cpp index e7bedff06f..b6c036be79 100644 --- a/script.cpp +++ b/script.cpp @@ -17,6 +17,9 @@ * * Change Log: * $Log$ + * Revision 1.5 2001/10/26 17:34:50 strigeus + * bug fixes, code cleanup + * * Revision 1.4 2001/10/23 19:51:50 strigeus * recompile not needed when switching games * debugger skeleton implemented @@ -101,7 +104,7 @@ void Scumm::stopScriptNr(int script) { ss = &vm.slot[1]; - for (i=1; i<20; i++,ss++) { + for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) { if (script!=ss->number || ss->type!=2 && ss->type!=3 || ss->status==0) continue; @@ -138,7 +141,7 @@ void Scumm::stopObjectScript(int script) { ss = &vm.slot[1]; - for (i=1; i<20; i++,ss++) { + for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) { if (script==ss->number && (ss->type==1 || ss->type==0 || ss->type==4) && ss->status!=0) { if (ss->cutsceneOverride) error("Object %d stopped with active cutscene/override", script); @@ -169,11 +172,11 @@ int Scumm::getScriptSlot() { int i; ss = &vm.slot[1]; - for (i=1; i<20; i++,ss++) { + for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) { if(ss->status==0) return i; } - error("Too many scripts running, %d max", 20); + error("Too many scripts running, %d max", NUM_SCRIPT_SLOT); } void Scumm::runScriptNested(int script) { @@ -414,12 +417,14 @@ void Scumm::setResult(int value) { void Scumm::drawBox(int x, int y, int x2, int y2, int color) { int top,bottom,count; + VirtScreen *vs; + byte *backbuff; - if (findVirtScreen(y)==-1) + if ((vs=findVirtScreen(y)) == NULL) return; - top = virtscr[gdi.virtScreen].topline; - bottom = top + virtscr[gdi.virtScreen].height; + top = vs->topline; + bottom = top + vs->height; if (x > x2) SWAP(x,x2); @@ -436,16 +441,14 @@ void Scumm::drawBox(int x, int y, int x2, int y2, int color) { if (x2>320) x2=320; if (y2 > bottom) y2=bottom; - updateDirtyRect(gdi.virtScreen, x, x2, y-top, y2-top, 0); + updateDirtyRect(vs->number, x, x2, y-top, y2-top, 0); - gdi.bg_ptr = getResourceAddress(0xA, gdi.virtScreen+1) - + virtscr[gdi.virtScreen].xstart - + (y-top)*320 + x; + backbuff = getResourceAddress(0xA, vs->number+1) + vs->xstart + (y-top)*320 + x; count = y2 - y; while (count) { - memset(gdi.bg_ptr, color, x2 - x); - gdi.bg_ptr += 320; + memset(backbuff, color, x2 - x); + backbuff += 320; count--; } } @@ -477,7 +480,7 @@ bool Scumm::isScriptLoaded(int script) { int i; ss = vm.slot; - for (i=0; i<20; i++,ss++) { + for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++) { if (ss->number == script) return true; } @@ -495,7 +498,7 @@ void Scumm::runHook(int i) { void Scumm::freezeScripts(int flag) { int i; - for(i=1; i<20; i++) { + for(i=1; i<NUM_SCRIPT_SLOT; i++) { if (_currentScript!=i && vm.slot[i].status!=0 && (vm.slot[i].unk1==0 || flag>=0x80)) { vm.slot[i].status |= 0x80; vm.slot[i].freezeCount++; @@ -513,7 +516,7 @@ void Scumm::freezeScripts(int flag) { void Scumm::unfreezeScripts() { int i; - for (i=1; i<20; i++) { + for (i=1; i<NUM_SCRIPT_SLOT; i++) { if (vm.slot[i].status&0x80) { if (!--vm.slot[i].freezeCount) { vm.slot[i].status&=0x7F; @@ -530,11 +533,11 @@ void Scumm::unfreezeScripts() { void Scumm::runAllScripts() { int i; - for (i=0; i<20; i++) + for (i=0; i<NUM_SCRIPT_SLOT; i++) vm.slot[i].didexec = 0; _currentScript = 0xFF; - for(_curExecScript = 0; _curExecScript<20; _curExecScript++) { + for(_curExecScript = 0; _curExecScript<NUM_SCRIPT_SLOT; _curExecScript++) { if (vm.slot[_curExecScript].status == 2 && vm.slot[_curExecScript].didexec == 0) { _currentScript = _curExecScript; @@ -587,7 +590,7 @@ void Scumm::killScriptsAndResources() { ss = &vm.slot[1]; - for (i=1; i<20; i++,ss++) { + for (i=1; i<NUM_SCRIPT_SLOT; i++,ss++) { if (ss->type==1 || ss->type==4) { if(ss->cutsceneOverride) error("Object %d stopped with active cutscene/override in exit", ss->number); @@ -613,7 +616,7 @@ void Scumm::checkAndRunVar33() { memset(_localParamList, 0, sizeof(_localParamList)); if (isScriptLoaded(_vars[VAR_SENTENCE_SCRIPT])) { ss = vm.slot; - for (i=0; i<20; i++,ss++) + for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++) if (ss->number==_vars[VAR_SENTENCE_SCRIPT] && ss->status!=0 && ss->freezeCount==0) return; } @@ -648,7 +651,7 @@ void Scumm::runInputScript(int a, int cmd, int mode) { void Scumm::decreaseScriptDelay(int amount) { ScriptSlot *ss = &vm.slot[0]; int i; - for (i=0; i<20; i++,ss++) { + for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++) { if(ss->status==1) { ss->delay -= amount; if (ss->delay < 0){ @@ -712,7 +715,7 @@ int Scumm::getVerbEntrypoint(int obj, int entry) { objptr = getObjectAddress(obj); - verbptr = findResource(MKID('VERB'), objptr); + verbptr = findResource(MKID('VERB'), objptr, 0); if (verbptr==NULL) error("No verb block in object %d", obj); @@ -842,7 +845,7 @@ void Scumm::animateActor(int act, int anim) { int Scumm::getScriptRunning(int script) { int i; ScriptSlot *ss = vm.slot; - for (i=0; i<20; i++,ss++) + for (i=0; i<NUM_SCRIPT_SLOT; i++,ss++) if (ss->number==script && (ss->type==2 || ss->type==3) && ss->status) return 1; return 0; @@ -939,6 +942,16 @@ int Scumm::getArrayId() { error("Out of array pointers, %d max", _numArray); } +void Scumm::arrayop_1(int a, byte *ptr) { + ArrayHeader *ah; + int r; + int len = getStringLen(ptr); + + r = defineArray(a, 4, 0, len); + ah = (ArrayHeader*)getResourceAddress(7,r); + copyString(ah->data,ptr,len); +} + void Scumm::copyString(byte *dst, byte *src, int len) { if (!src) { while (--len>=0) |