aboutsummaryrefslogtreecommitdiff
path: root/kyra/script_v1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kyra/script_v1.cpp')
-rw-r--r--kyra/script_v1.cpp64
1 files changed, 61 insertions, 3 deletions
diff --git a/kyra/script_v1.cpp b/kyra/script_v1.cpp
index ce5dcd28c4..04bf9b9dbc 100644
--- a/kyra/script_v1.cpp
+++ b/kyra/script_v1.cpp
@@ -649,7 +649,52 @@ int KyraEngine::cmd_runWSAFrames(ScriptState *script) {
}
int KyraEngine::cmd_popBrandonIntoScene(ScriptState *script) {
- warning("STUB: cmd_popBrandonIntoScene");
+ debug(9, "cmd_popBrandonIntoScene(0x%X)", script);
+ int changeScaleMode = stackPos(3);
+ int xpos = stackPos(0) & 0xFFFC;
+ int ypos = stackPos(1) & 0xFFFE;
+ int facing = stackPos(2);
+ _currentCharacter->x1 = _currentCharacter->x2 = xpos;
+ _currentCharacter->y1 = _currentCharacter->y2 = ypos;
+ _currentCharacter->facing = facing;
+ _currentCharacter->currentAnimFrame = 7;
+ int xOffset = _defaultShapeTable[0].xOffset;
+ int yOffset = _defaultShapeTable[0].yOffset;
+ int width = _defaultShapeTable[0].w << 3;
+ int height = _defaultShapeTable[0].h;
+ AnimObject *curAnim = _charactersAnimState;
+
+ if (changeScaleMode) {
+ curAnim->x1 = _currentCharacter->x1;
+ curAnim->y1 = _currentCharacter->y1;
+ _brandonScaleY = _scaleTable[_currentCharacter->y1];
+ _brandonScaleX = _brandonScaleY;
+
+ int animWidth = fetchAnimWidth(curAnim->sceneAnimPtr, _brandonScaleX) >> 1;
+ int animHeight = fetchAnimHeight(curAnim->sceneAnimPtr, _brandonScaleY);
+
+ animWidth = (xOffset * animWidth) / width;
+ animHeight = (yOffset * animHeight) / height;
+
+ curAnim->x2 = curAnim->x1 += animWidth;
+ curAnim->y2 = curAnim->y1 += animHeight;
+ } else {
+ curAnim->x2 = curAnim->x1 = _currentCharacter->x1 + xOffset;
+ curAnim->y2 = curAnim->y1 = _currentCharacter->y1 + yOffset;
+ }
+
+ int scaleModeBackup = _scaleMode;
+ if (changeScaleMode) {
+ _scaleMode = 1;
+ }
+
+ animRefreshNPC(0);
+ preserveAllBackgrounds();
+ prepDrawAllObjects();
+ copyChangedObjectsForward(0);
+
+ _scaleMode = scaleModeBackup;
+
return 0;
}
@@ -702,7 +747,21 @@ int KyraEngine::cmd_getCharacterY(ScriptState *script) {
}
int KyraEngine::cmd_changeCharactersFacing(ScriptState *script) {
- warning("STUB: cmd_changeCharactersFacing");
+ debug(9, "cmd_changeCharactersFacing(0x%X)", script);
+ int character = stackPos(0);
+ int facing = stackPos(1);
+ int newAnimFrame = stackPos(2);
+
+ restoreAllObjectBackgrounds();
+ if (newAnimFrame != -1) {
+ _characterList[character].currentAnimFrame = newAnimFrame;
+ }
+ _characterList[character].facing = facing;
+ animRefreshNPC(character);
+ preserveAllBackgrounds();
+ prepDrawAllObjects();
+ copyChangedObjectsForward(0);
+
return 0;
}
@@ -739,7 +798,6 @@ int KyraEngine::cmd_displayWSASequentialFrames(ScriptState *script) {
int KyraEngine::cmd_drawCharacterStanding(ScriptState *script) {
debug(9, "cmd_drawCharacterStanding(0x%X)", script);
- // XXX
int character = stackPos(0);
int animFrame = stackPos(1);
int newFacing = stackPos(2);