aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/kyra/animator_v3.cpp18
-rw-r--r--engines/kyra/kyra_v3.cpp30
-rw-r--r--engines/kyra/kyra_v3.h19
-rw-r--r--engines/kyra/scene_v3.cpp11
-rw-r--r--engines/kyra/screen_v3.cpp25
-rw-r--r--engines/kyra/screen_v3.h2
-rw-r--r--engines/kyra/script.cpp18
-rw-r--r--engines/kyra/script.h1
-rw-r--r--engines/kyra/script_v3.cpp97
9 files changed, 193 insertions, 28 deletions
diff --git a/engines/kyra/animator_v3.cpp b/engines/kyra/animator_v3.cpp
index 2eda54318f..fb4ae2bab6 100644
--- a/engines/kyra/animator_v3.cpp
+++ b/engines/kyra/animator_v3.cpp
@@ -338,7 +338,7 @@ void KyraEngine_v3::updateSceneAnim(int anim, int newFrame) {
if (!animObject->enabled)
return;
- animObject->needRefresh = 1;
+ animObject->needRefresh = true;
if (_sceneAnims[anim].flags & 2)
animObject->flags |= 1;
@@ -370,4 +370,20 @@ void KyraEngine_v3::updateSceneAnim(int anim, int newFrame) {
}
}
+void KyraEngine_v3::removeSceneAnimObject(int anim, int refresh) {
+ debugC(9, kDebugLevelAnimator, "KyraEngine_v3::removeSceneAnimObject(%d, %d)", anim, refresh);
+ AnimObj *obj = &_animObjects[anim+1];
+ restorePage3();
+ obj->shapeIndex3 = 0xFFFF;
+ obj->animNum = 0xFFFF;
+ obj->needRefresh = true;
+
+ if (refresh)
+ refreshAnimObjectsIfNeed();
+
+ obj->enabled = false;
+ _animList = deleteAnimListEntry(_animList, obj);
+ _sceneAnimMovie[anim]->close();
+}
+
} // end of namespace Kyra
diff --git a/engines/kyra/kyra_v3.cpp b/engines/kyra/kyra_v3.cpp
index aa2bd4df94..edf42dc3a3 100644
--- a/engines/kyra/kyra_v3.cpp
+++ b/engines/kyra/kyra_v3.cpp
@@ -916,6 +916,19 @@ void KyraEngine_v3::update() {
_screen->updateScreen();
}
+void KyraEngine_v3::delay(uint32 millis, bool doUpdate, bool isMainLoop) {
+ debugC(9, kDebugLevelMain, "KyraEngine_v3::delay(%d, %d, %d)", millis, doUpdate, isMainLoop);
+ uint32 endTime = _system->getMillis() + millis;
+ while (endTime > _system->getMillis()) {
+ if (doUpdate) {
+ //XXX
+ update();
+ }
+
+ _system->delayMillis(10);
+ }
+}
+
#pragma mark -
void KyraEngine_v3::updateInput() {
@@ -1103,6 +1116,23 @@ int KyraEngine_v3::loadLanguageFile(const char *file, uint8 *&buffer) {
return buffer ? size : 0 ;
}
+uint8 *KyraEngine_v3::getTableEntry(uint8 *buffer, int id) {
+ debugC(9, kDebugLevelMain, "KyraEngine_v3::getTableEntry(%p, %d)", (const void*)buffer, id);
+ uint16 tableEntries = READ_LE_UINT16(buffer);
+ const uint16 *indexTable = (const uint16*)(buffer + 2);
+ const uint16 *offsetTable = indexTable + tableEntries;
+
+ int num = 0;
+ while (id != READ_LE_UINT16(indexTable)) {
+ ++indexTable;
+ ++num;
+ }
+
+ return buffer + READ_LE_UINT16(offsetTable + num);
+}
+
+#pragma mark -
+
Movie *KyraEngine_v3::createWSAMovie() {
WSAMovieV2 *movie = new WSAMovieV2(this, _screen);
assert(movie);
diff --git a/engines/kyra/kyra_v3.h b/engines/kyra/kyra_v3.h
index f8c00567a7..5e95f9ce8e 100644
--- a/engines/kyra/kyra_v3.h
+++ b/engines/kyra/kyra_v3.h
@@ -76,6 +76,8 @@ private:
void update();
+ void delay(uint32 millis, bool update = false, bool isMainLoop = false);
+
// - Input
void updateInput();
int checkInput(Button *buttonList, bool mainLoop = false);
@@ -185,6 +187,9 @@ private:
bool _loadingState;
void updateCharacterAnim(int charId);
+ void updateSceneAnim(int anim, int newFrame);
+ void removeSceneAnimObject(int anim, int refresh);
+
// interface
uint8 *_interface;
uint8 *_interfaceCommandLine;
@@ -200,7 +205,7 @@ private:
bool _restoreCommandLine;
bool _inventoryState;
- // translation stuff
+ // localization
uint8 *_scoreFile;
uint8 *_cCodeFile;
uint8 *_scenesFile;
@@ -209,6 +214,8 @@ private:
uint32 _actorFileSize;
uint8 *_sceneStrings;
+ uint8 *getTableEntry(uint8 *buffer, int id);
+
// items
uint8 *_itemBuffer1;
uint8 *_itemBuffer2;
@@ -262,8 +269,6 @@ private:
void freeSceneShapes();
void freeSceneAnims();
- void updateSceneAnim(int anim, int newFrame);
-
// voice
int _currentTalkFile;
void openTalkFile(int file);
@@ -396,10 +401,17 @@ private:
void loadExtrasShapes();
// opcodes
+ int o3_setCharacterPos(ScriptState *script);
+ int o3_refreshCharacter(ScriptState *script);
+ int o3_showSceneFileMessage(ScriptState *script);
int o3_defineItem(ScriptState *script);
int o3_queryGameFlag(ScriptState *script);
int o3_resetGameFlag(ScriptState *script);
int o3_setGameFlag(ScriptState *script);
+ int o3_hideMouse(ScriptState *script);
+ int o3_setMousePos(ScriptState *script);
+ int o3_showMouse(ScriptState *script);
+ int o3_delay(ScriptState *script);
int o3_setSceneFilename(ScriptState *script);
int o3_getRand(ScriptState *script);
int o3_defineRoomEntrance(ScriptState *script);
@@ -412,6 +424,7 @@ private:
int o3_querySpecialSceneScriptState(ScriptState *script);
int o3_setHiddenItemsEntry(ScriptState *script);
int o3_getHiddenItemsEntry(ScriptState *script);
+ int o3_removeSceneAnimObject(ScriptState *script);
int o3_dummy(ScriptState *script);
// misc
diff --git a/engines/kyra/scene_v3.cpp b/engines/kyra/scene_v3.cpp
index e2227f23e7..8d580d230d 100644
--- a/engines/kyra/scene_v3.cpp
+++ b/engines/kyra/scene_v3.cpp
@@ -366,9 +366,8 @@ void KyraEngine_v3::loadSceneMsc() {
// HACK
uint8 data[320*200];
_screen->copyRegionToBuffer(5, 0, 0, 320, 200, data);
- _screen->fillRect(0, 0, 319, _maskPageMinY - 1, 0xFF, 5);
+ _screen->clearPage(5);
_screen->copyBlockToPage(5, 0, _maskPageMinY, 320, height, data);
- _screen->fillRect(0, _maskPageMaxY + 1, 319, 199, 0xFF, 5);
musicUpdate(0);
}
@@ -617,7 +616,13 @@ void KyraEngine_v3::initSceneScreen(int unk1) {
updateCharPal(0);
- //XXX when loading from main menu
+ if (1/*!_menuDirectlyToLoad*/) {
+ _scriptInterpreter->startScript(&_sceneScriptState, 3);
+ _sceneScriptState.regs[5] = unk1;
+
+ while (_scriptInterpreter->validScript(&_sceneScriptState))
+ _scriptInterpreter->runScript(&_sceneScriptState);
+ }
}
void KyraEngine_v3::updateSpecialSceneScripts() {
diff --git a/engines/kyra/screen_v3.cpp b/engines/kyra/screen_v3.cpp
index ca85733c98..7e152e055c 100644
--- a/engines/kyra/screen_v3.cpp
+++ b/engines/kyra/screen_v3.cpp
@@ -47,4 +47,29 @@ const ScreenDim *Screen_v3::getScreenDim(int dim) {
return &_screenDimTable[dim];
}
+int Screen_v3::getLayer(int x, int y) {
+ debugC(9, kDebugLevelScreen, "Screen_v3::getLayer(%d, %d)", x, y);
+ if (x < 0)
+ x = 0;
+ else if (x >= 320)
+ x = 319;
+ if (y < 0)
+ y = 0;
+ else if (y >= 188)
+ y = 187;
+
+ if (y < _maskMinY || y > _maskMaxY)
+ return 15;
+
+ uint8 pixel = *(getCPagePtr(5) + y * 320 + x);
+ pixel &= 0x7F;
+ pixel >>= 3;
+
+ if (pixel < 1)
+ pixel = 1;
+ else if (pixel > 15)
+ pixel = 15;
+ return pixel;
+}
+
} // end of namespace Kyra
diff --git a/engines/kyra/screen_v3.h b/engines/kyra/screen_v3.h
index f72ff88b68..0a91b04c0c 100644
--- a/engines/kyra/screen_v3.h
+++ b/engines/kyra/screen_v3.h
@@ -39,6 +39,8 @@ public:
virtual void setScreenDim(int dim);
virtual const ScreenDim *getScreenDim(int dim);
+
+ int getLayer(int x, int y);
private:
static const ScreenDim _screenDimTable[];
static const int _screenDimTableCount;
diff --git a/engines/kyra/script.cpp b/engines/kyra/script.cpp
index 944847e6f3..02a44f7791 100644
--- a/engines/kyra/script.cpp
+++ b/engines/kyra/script.cpp
@@ -183,7 +183,6 @@ bool ScriptHelper::validScript(ScriptState *script) {
bool ScriptHelper::runScript(ScriptState *script) {
_parameter = 0;
- _continue = true;
if (!script->ip)
return false;
@@ -212,10 +211,7 @@ bool ScriptHelper::runScript(ScriptState *script) {
(this->*(_commands[opcode].proc))(script);
}
- if (!_continue)
- script->ip = 0;
-
- return _continue;
+ return (script->ip != 0);
}
#pragma mark -
@@ -319,7 +315,7 @@ void ScriptHelper::cmd_pushRetOrPos(ScriptState* script) {
break;
default:
- _continue = false;
+ script->ip = 0;
break;
}
}
@@ -348,7 +344,7 @@ void ScriptHelper::cmd_popRetOrPos(ScriptState* script) {
case 1:
if (script->sp >= 60) {
- _continue = false;
+ script->ip = 0;
} else {
script->bp = script->stack[script->sp++];
script->ip = script->dataPtr->data + script->stack[script->sp++];
@@ -356,7 +352,7 @@ void ScriptHelper::cmd_popRetOrPos(ScriptState* script) {
break;
default:
- _continue = false;
+ script->ip = 0;
break;
}
}
@@ -422,7 +418,7 @@ void ScriptHelper::cmd_negate(ScriptState* script) {
default:
warning("Unknown negation func: %d", _parameter);
- _continue = false;
+ script->ip = 0;
break;
}
}
@@ -538,14 +534,14 @@ void ScriptHelper::cmd_eval(ScriptState* script) {
}
if (error)
- _continue = false;
+ script->ip = 0;
else
script->stack[--script->sp] = ret;
}
void ScriptHelper::cmd_setRetAndJmp(ScriptState* script) {
if (script->sp >= 60) {
- _continue = false;
+ script->ip = 0;
} else {
script->retValue = script->stack[script->sp++];
uint16 temp = script->stack[script->sp++];
diff --git a/engines/kyra/script.h b/engines/kyra/script.h
index fe6afcf80a..4ea05ea158 100644
--- a/engines/kyra/script.h
+++ b/engines/kyra/script.h
@@ -99,7 +99,6 @@ public:
protected:
KyraEngine *_vm;
int16 _parameter;
- bool _continue;
typedef void (ScriptHelper::*CommandProc)(ScriptState*);
struct CommandEntry {
diff --git a/engines/kyra/script_v3.cpp b/engines/kyra/script_v3.cpp
index a0afc69838..ab7af51f49 100644
--- a/engines/kyra/script_v3.cpp
+++ b/engines/kyra/script_v3.cpp
@@ -32,6 +32,49 @@
namespace Kyra {
+int KyraEngine_v3::o3_setCharacterPos(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setCharacterPos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+ int x = stackPos(0);
+ int y = stackPos(1);
+
+ if (x != -1 && y != -1) {
+ x &= ~3;
+ y &= ~1;
+ }
+
+ _mainCharacter.x1 = _mainCharacter.x2 = x;
+ _mainCharacter.y1 = _mainCharacter.y2 = y;
+
+ return 0;
+}
+
+int KyraEngine_v3::o3_refreshCharacter(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_refreshCharacter(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
+ const int frame = stackPos(0);
+ const int facing = stackPos(1);
+ const bool updateNeed = stackPos(2) != 0;
+
+ if (facing >= 0)
+ _mainCharacter.facing = facing;
+
+ if (frame >= 0 && frame != 87)
+ _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
+ else
+ _mainCharacter.animFrame = 87;
+
+ updateCharacterAnim(0);
+
+ if (updateNeed)
+ refreshAnimObjectsIfNeed();
+ return 0;
+}
+
+int KyraEngine_v3::o3_showSceneFileMessage(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_showSceneFileMessage(%p) (%d)", (const void *)script, stackPos(0));
+ showMessage((const char*)getTableEntry(_scenesFile, stackPos(0)), 0xFF, 0xF0);
+ return 0;
+}
+
int KyraEngine_v3::o3_defineItem(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_defineItem(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
int freeItem = findFreeItem();
@@ -61,6 +104,36 @@ int KyraEngine_v3::o3_setGameFlag(ScriptState *script) {
return 1;
}
+int KyraEngine_v3::o3_hideMouse(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_hideMouse(%p) ()", (const void *)script);
+ _screen->hideMouse();
+ return 0;
+}
+
+int KyraEngine_v3::o3_setMousePos(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setMousePos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+ setMousePos(stackPos(0), stackPos(1));
+ return 0;
+}
+
+int KyraEngine_v3::o3_showMouse(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_showMouse(%p) ()", (const void *)script);
+ _screen->showMouse();
+ return 0;
+}
+
+int KyraEngine_v3::o3_delay(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_delay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+ const uint32 delayTime = stackPos(0) * _tickLength;
+ const int delayFunc = stackPos(1);
+
+ if (delayFunc)
+ warning("STUB o3_delay func 1");
+
+ delay(delayTime, true);
+ return 0;
+}
+
int KyraEngine_v3::o3_setSceneFilename(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setSceneFilename(%p) (%d, '%s')", (const void *)script, stackPos(0), stackPosString(1));
strcpy(_sceneList[stackPos(0)].filename1, stackPosString(1));
@@ -143,7 +216,7 @@ int KyraEngine_v3::o3_defineSceneAnim(ScriptState *script) {
if (x2 == -1)
x2 = _sceneAnimMovie[animId]->xAdd();
if (y2 == -1)
- y2 = _sceneAnimMovie[animId]->xAdd();
+ y2 = _sceneAnimMovie[animId]->yAdd();
if (w == -1)
w = _sceneAnimMovie[animId]->width();
if (h == -1)
@@ -227,6 +300,12 @@ int KyraEngine_v3::o3_getHiddenItemsEntry(ScriptState *script) {
return (int16)_hiddenItems[stackPos(0)];
}
+int KyraEngine_v3::o3_removeSceneAnimObject(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_removeSceneAnimObject(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+ removeSceneAnimObject(stackPos(0), stackPos(1));
+ return 0;
+}
+
int KyraEngine_v3::o3_dummy(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_dummy(%p) ()", (const void *)script);
return 0;
@@ -239,9 +318,9 @@ void KyraEngine_v3::setupOpcodeTable() {
static const OpcodeV3 opcodeTable[] = {
// 0x00
OpcodeUnImpl(),
+ Opcode(o3_setCharacterPos),
OpcodeUnImpl(),
- OpcodeUnImpl(),
- OpcodeUnImpl(),
+ Opcode(o3_refreshCharacter),
// 0x04
OpcodeUnImpl(),
OpcodeUnImpl(),
@@ -259,7 +338,7 @@ void KyraEngine_v3::setupOpcodeTable() {
OpcodeUnImpl(),
// 0x10
OpcodeUnImpl(),
- OpcodeUnImpl(),
+ Opcode(o3_showSceneFileMessage),
Opcode(o3_dummy),
Opcode(o3_dummy),
// 0x14
@@ -294,11 +373,11 @@ void KyraEngine_v3::setupOpcodeTable() {
OpcodeUnImpl(),
// 0x2c
OpcodeUnImpl(),
+ Opcode(o3_hideMouse),
OpcodeUnImpl(),
- OpcodeUnImpl(),
- OpcodeUnImpl(),
+ Opcode(o3_setMousePos),
// 0x30
- OpcodeUnImpl(),
+ Opcode(o3_showMouse),
OpcodeUnImpl(),
OpcodeUnImpl(),
Opcode(o3_dummy),
@@ -306,7 +385,7 @@ void KyraEngine_v3::setupOpcodeTable() {
OpcodeUnImpl(),
OpcodeUnImpl(),
Opcode(o3_dummy),
- OpcodeUnImpl(),
+ Opcode(o3_delay),
// 0x38
OpcodeUnImpl(),
OpcodeUnImpl(),
@@ -431,7 +510,7 @@ void KyraEngine_v3::setupOpcodeTable() {
OpcodeUnImpl(),
OpcodeUnImpl(),
OpcodeUnImpl(),
- OpcodeUnImpl(),
+ Opcode(o3_removeSceneAnimObject),
// 0x9c
OpcodeUnImpl(),
OpcodeUnImpl(),