diff options
author | Max Horn | 2002-12-23 18:30:12 +0000 |
---|---|---|
committer | Max Horn | 2002-12-23 18:30:12 +0000 |
commit | 654ed3ff6cca3d40705110acc2f5ef1c5e4695c7 (patch) | |
tree | 15d718a1001357f572cecc94885af3656261254c | |
parent | b8240b253c8ede87d4148b26fafe5474c638c871 (diff) | |
download | scummvm-rg350-654ed3ff6cca3d40705110acc2f5ef1c5e4695c7.tar.gz scummvm-rg350-654ed3ff6cca3d40705110acc2f5ef1c5e4695c7.tar.bz2 scummvm-rg350-654ed3ff6cca3d40705110acc2f5ef1c5e4695c7.zip |
more V8 work
svn-id: r6074
-rw-r--r-- | scumm/actor.cpp | 3 | ||||
-rw-r--r-- | scumm/intern.h | 5 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 178 | ||||
-rw-r--r-- | scumm/scumm.h | 4 | ||||
-rw-r--r-- | scumm/string.cpp | 40 | ||||
-rw-r--r-- | scumm/vars.cpp | 3 |
6 files changed, 221 insertions, 12 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp index 563d64dc54..e8dd5f8644 100644 --- a/scumm/actor.cpp +++ b/scumm/actor.cpp @@ -1214,8 +1214,7 @@ void Actor::startWalkAnim(int cmd, int angle) * Note: walk scripts aren't required to make the game * work as usual */ -#if 1 - printf("ignoreTurns = %d\n", ignoreTurns); +#if 0 if (walk_script != 0) { int16 args[16]; args[0] = number; diff --git a/scumm/intern.h b/scumm/intern.h index a5a6847c5c..8340c6b98d 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -400,6 +400,11 @@ protected: virtual uint fetchScriptWord(); virtual int fetchScriptWordSigned(); + + virtual int readVar(uint var); + virtual void writeVar(uint var, int value); + + void decodeParseString(int m, int n); /* Version 8 script opcodes */ void o8_unknown(); diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 0ad81344a9..d6ce37ea23 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -22,6 +22,7 @@ #include "stdafx.h" #include "scumm.h" #include "intern.h" +#include "sound.h" /* * NO, we do NOT support CMI yet :-) This file is mostly a placeholder and a place @@ -390,6 +391,135 @@ int Scumm_v8::fetchScriptWordSigned() return (int32)fetchScriptWord(); } +int Scumm_v8::readVar(uint var) +{ + debug(9, "readvar(%d)", var); + + if (!(var & 0xF0000000)) { + checkRange(_numVariables - 1, 0, var, "Variable %d out of range(r)"); + return _vars[var]; + } + + if (var & 0x80000000) { + var &= 0x7FFFFFFF; + checkRange(_numBitVariables - 1, 0, var, "Bit variable %d out of range(r)"); + return (_bitVars[var >> 3] & (1 << (var & 7))) ? 1 : 0; + } + + if (var & 0x40000000) { + var &= 0xFFFFFFF; + checkRange(0x10, 0, var, "Local variable %d out of range(r)"); + return vm.localvar[_currentScript][var]; + } + + error("Illegal varbits (r)"); + return -1; +} + +void Scumm_v8::writeVar(uint var, int value) +{ + debug(9, "writeVar(%d, %d)", var, value); + + if (!(var & 0xF0000000)) { + checkRange(_numVariables - 1, 0, var, "Variable %d out of range(w)"); + + _vars[var] = value; + + if ((_varwatch == (int)var) || (_varwatch == 0)) { + if (vm.slot[_currentScript].number < 100) + debug(1, "vars[%d] = %d (via script-%d)", var, value, vm.slot[_currentScript].number); + else + debug(1, "vars[%d] = %d (via room-%d-%d)", var, value, _currentRoom, vm.slot[_currentScript].number); + } + return; + } + + if (var & 0x80000000) { + var &= 0x7FFFFFFF; + checkRange(_numBitVariables - 1, 0, var, "Bit variable %d out of range(w)"); + + if (value) + _bitVars[var >> 3] |= (1 << (var & 7)); + else + _bitVars[var >> 3] &= ~(1 << (var & 7)); + return; + } + + if (var & 0x40000000) { + var &= 0xFFFFFFF; + checkRange(0x10, 0, var, "Local variable %d out of range(w)"); + vm.localvar[_currentScript][var] = value; + return; + } + + error("Illegal varbits (w)"); +} + +void Scumm_v8::decodeParseString(int m, int n) +{ + byte b; + + b = fetchScriptByte(); + + switch (b) { + case 0xC8: + setStringVars(m); + if (n) + _actorToPrintStrFor = pop(); + return; + case 0xC9: + _string[m].t_xpos = _string[m].xpos; + _string[m].t_ypos = _string[m].ypos; + _string[m].t_center = _string[m].center; + _string[m].t_overhead = _string[m].overhead; + _string[m].t_no_talk_anim = _string[m].no_talk_anim; + _string[m].t_right = _string[m].right; + _string[m].t_color = _string[m].color; + _string[m].t_charset = _string[m].charset; + return; + case 0xCA: + _string[m].ypos = pop(); + _string[m].xpos = pop(); + _string[m].overhead = false; + break; + case 0xCB: + _string[m].color = pop(); + break; + case 0xCC: + _string[m].center = true; + _string[m].overhead = false; + break; + case 0xCD: // SO_PRINT_CHARSET Set print character set + // FIXME - TODO + break; + case 0xCE: + _string[m].center = false; + _string[m].overhead = false; + break; + case 0xCF: + _string[m].overhead = true; + _string[m].no_talk_anim = false; + break; + case 0xD0: // SO_PRINT_MUMBLE + error("decodeParseString: SO_PRINT_MUMBLE"); + break; + case 0xD1: + // TODO - FIXME + _messagePtr = _scriptPointer; + + byte buffer[1024]; + _msgPtrToAdd = buffer; + _scriptPointer = _messagePtr = addMessageToStack(_messagePtr); + printf("Message(%d): '%s'\n", m, buffer); + break; + case 0xD2: // SO_PRINT_WRAP Set print wordwrap + error("decodeParseString: SO_PRINT_MUMBLE"); + break; + default: + error("decodeParseString: default case"); + } +} + void Scumm_v8::o8_unknown() { warning("Unknown opcode '%x' at %x", _opcode, _scriptPointer - _scriptOrgPointer); @@ -482,42 +612,90 @@ void Scumm_v8::o8_arrayOps() void Scumm_v8::o8_printLine() { + decodeParseString(0, 0); } void Scumm_v8::o8_printCursor() { + decodeParseString(1, 0); } void Scumm_v8::o8_printDebug() { + decodeParseString(2, 0); } void Scumm_v8::o8_printSystem() { + decodeParseString(3, 0); } void Scumm_v8::o8_cursorCommand() { // TODO byte subOp = fetchScriptByte(); + int a, i; + int16 args[16]; + switch (subOp) { case 0xDC: // SO_CURSOR_ON Turn cursor on + _cursor.state = 1; + verbMouseOver(0); + break; case 0xDD: // SO_CURSOR_OFF Turn cursor off + _cursor.state = 0; + verbMouseOver(0); + break; case 0xDE: // SO_CURSOR_SOFT_ON Turn soft cursor on + _cursor.state++; + if (_cursor.state > 1) + error("Cursor state greater than 1 in script"); + verbMouseOver(0); + break; case 0xDF: // SO_CURSOR_SOFT_OFF Turn soft cursor off + _cursor.state--; + verbMouseOver(0); + break; case 0xE0: // SO_USERPUT_ON + _userPut = 1; + break; case 0xE1: // SO_USERPUT_OFF + _userPut = 0; + break; case 0xE2: // SO_USERPUT_SOFT_ON + _userPut++; + break; case 0xE3: // SO_USERPUT_SOFT_OFF + _userPut--; + break; case 0xE4: // SO_CURSOR_IMAGE Set cursor image + { + int room, obj = popRoomAndObj(&room); + setCursorImg(obj, room, 1); + } + break; case 0xE5: // SO_CURSOR_HOTSPOT Set cursor hotspot + a = pop(); + setCursorHotspot2(pop(), a); + break; case 0xE6: // SO_CURSOR_TRANSPARENT Set cursor transparent color + makeCursorColorTransparent(pop()); + break; case 0xE7: // SO_CHARSET_SET + initCharset(pop()); + break; case 0xE8: // SO_CHARSET_COLOR + getStackList(args, sizeof(args) / sizeof(args[0])); + for (i = 0; i < 16; i++) + charset._colorMap[i] = _charsetData[_string[1].t_charset][i] = (unsigned char)args[i]; + break; case 0xE9: // SO_CURSOR_PUT default: error("o8_cursorCommand: default case %d", subOp); } + + _vars[VAR_CURSORSTATE] = _cursor.state; + _vars[VAR_USERPUT] = _userPut; } void Scumm_v8::o8_resourceRoutines() diff --git a/scumm/scumm.h b/scumm/scumm.h index 8015a7b030..b6976390d0 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -484,8 +484,8 @@ public: void setResult(int result); void push(int a); int pop(); - int readVar(uint var); - void writeVar(uint var, int value); + virtual int readVar(uint var); + virtual void writeVar(uint var, int value); void runHook(int i); bool isScriptInUse(int script); int getStringLen(byte *ptr); diff --git a/scumm/string.cpp b/scumm/string.cpp index 8fcf6ea879..baa48f53f4 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -945,6 +945,10 @@ byte *Scumm::addMessageToStack(byte *msg) if (chr != 1 && chr != 2 && chr != 3 && chr != 8) { ptr[num++] = *msg++; // and some commands are followed by parameters to the functions below ptr[num++] = *msg++; // these are numbers of names, strings, verbs, variables, etc + if (_features & GF_AFTER_V8) { + ptr[num++] = *msg++; + ptr[num++] = *msg++; + } } } } @@ -961,20 +965,40 @@ byte *Scumm::addMessageToStack(byte *msg) chr = ptr[num++]; switch (chr) { case 4: - addIntToStack(READ_LE_UINT16(ptr + num)); - num += 2; + if (_features & GF_AFTER_V8) { + addIntToStack(READ_LE_UINT32(ptr + num)); + num += 4; + } else { + addIntToStack(READ_LE_UINT16(ptr + num)); + num += 2; + } break; case 5: - addVerbToStack(READ_LE_UINT16(ptr + num)); - num += 2; + if (_features & GF_AFTER_V8) { + addVerbToStack(READ_LE_UINT32(ptr + num)); + num += 4; + } else { + addVerbToStack(READ_LE_UINT16(ptr + num)); + num += 2; + } break; case 6: - addNameToStack(READ_LE_UINT16(ptr + num)); - num += 2; + if (_features & GF_AFTER_V8) { + addNameToStack(READ_LE_UINT32(ptr + num)); + num += 4; + } else { + addNameToStack(READ_LE_UINT16(ptr + num)); + num += 2; + } break; case 7: - addStringToStack(READ_LE_UINT16(ptr + num)); - num += 2; + if (_features & GF_AFTER_V8) { + addStringToStack(READ_LE_UINT32(ptr + num)); + num += 4; + } else { + addStringToStack(READ_LE_UINT16(ptr + num)); + num += 2; + } break; case 3: case 9: diff --git a/scumm/vars.cpp b/scumm/vars.cpp index 506dbcbd15..411ac0fb3f 100644 --- a/scumm/vars.cpp +++ b/scumm/vars.cpp @@ -211,6 +211,9 @@ void Scumm_v8::setupScummVars() VAR_VIRT_MOUSE_X = 5; VAR_VIRT_MOUSE_Y = 6; + VAR_CURSORSTATE = 7; + VAR_USERPUT = 8; + VAR_CAMERA_POS_X = 9; VAR_CAMERA_POS_Y = 10; VAR_CAMERA_DEST_X = 11; |