diff options
-rw-r--r-- | saga/actor.cpp | 2 | ||||
-rw-r--r-- | saga/script.h | 8 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 63 |
3 files changed, 50 insertions, 23 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp index f49176601d..bd0d2ea30a 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -602,7 +602,7 @@ void Actor::updateActorsScene(int actorsEntrance) { assert(_protagonist); - if (actorsEntrance >= 0) { + if ((actorsEntrance >= 0) && (_vm->_scene->_entryList.entryListCount > 0)) { sceneEntry = _vm->_scene->_entryList.getEntry(actorsEntrance); if (_vm->_scene->getFlags() & kSceneFlagISO) { _protagonist->location = sceneEntry->location; diff --git a/saga/script.h b/saga/script.h index 44c438e143..d947bf45c9 100644 --- a/saga/script.h +++ b/saga/script.h @@ -520,11 +520,11 @@ private: void sfChangeActorScene(SCRIPTFUNC_PARAMS); void sfScriptClimb(SCRIPTFUNC_PARAMS); void sfSetDoorState(SCRIPTFUNC_PARAMS); - void SF_setActorZ(SCRIPTFUNC_PARAMS); + void sfSetActorZ(SCRIPTFUNC_PARAMS); void SF_text(SCRIPTFUNC_PARAMS); - void SF_getActorX(SCRIPTFUNC_PARAMS); - void SF_getActorY(SCRIPTFUNC_PARAMS); - void SF_eraseDelta(SCRIPTFUNC_PARAMS); + void sfGetActorX(SCRIPTFUNC_PARAMS); + void sfGetActorY(SCRIPTFUNC_PARAMS); + void sfEraseDelta(SCRIPTFUNC_PARAMS); void sfPlayMusic(SCRIPTFUNC_PARAMS); void SF_pickClimbOutPos(SCRIPTFUNC_PARAMS); void SF_tossRif(SCRIPTFUNC_PARAMS); diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index 4e1f671bfb..3ae3fbe373 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -109,11 +109,11 @@ void Script::setupScriptFuncList(void) { OPCODE(sfChangeActorScene), OPCODE(sfScriptClimb), OPCODE(sfSetDoorState), - OPCODE(SF_setActorZ), + OPCODE(sfSetActorZ), OPCODE(SF_text), - OPCODE(SF_getActorX), - OPCODE(SF_getActorY), - OPCODE(SF_eraseDelta), + OPCODE(sfGetActorX), + OPCODE(sfGetActorY), + OPCODE(sfEraseDelta), OPCODE(sfPlayMusic), OPCODE(SF_pickClimbOutPos), OPCODE(SF_tossRif), @@ -1476,11 +1476,18 @@ void Script::sfSetDoorState(SCRIPTFUNC_PARAMS) { } // Script function #58 (0x3A) -void Script::SF_setActorZ(SCRIPTFUNC_PARAMS) { - int param1 = thread->pop(); - int param2 = thread->pop(); +// Param1: actor id +// Param2: z +void Script::sfSetActorZ(SCRIPTFUNC_PARAMS) { + int16 actorId; + int16 z; + ActorData *actor; + + actorId = thread->pop(); + z = thread->pop(); - error("STUB: SF_setActorZ(%d, %d)", param1, param2); + actor = _vm->_actor->getActor(actorId); + actor->location.z = z; } // Script function #59 (0x3B) @@ -1492,25 +1499,45 @@ void Script::SF_text(SCRIPTFUNC_PARAMS) { } // Script function #60 (0x3C) -void Script::SF_getActorX(SCRIPTFUNC_PARAMS) { - int16 param = thread->pop(); +// Param1: actor id +void Script::sfGetActorX(SCRIPTFUNC_PARAMS) { + int16 actorId; + ActorData *actor; + + actorId = thread->pop(); + actor = _vm->_actor->getActor(actorId); - error("STUB: SF_getActorX(%d)", param); + thread->_returnValue = actor->location.x >> 2; } // Script function #61 (0x3D) -void Script::SF_getActorY(SCRIPTFUNC_PARAMS) { - int16 param = thread->pop(); +// Param1: actor id +void Script::sfGetActorY(SCRIPTFUNC_PARAMS) { + int16 actorId; + ActorData *actor; + + actorId = thread->pop(); + actor = _vm->_actor->getActor(actorId); - error("STUB: SF_getActorY(%d)", param); + thread->_returnValue = actor->location.y >> 2; } // Script function #62 (0x3E) -void Script::SF_eraseDelta(SCRIPTFUNC_PARAMS) { - for (int i = 0; i < nArgs; i++) - thread->pop(); +void Script::sfEraseDelta(SCRIPTFUNC_PARAMS) { + BUFFER_INFO bufferInfo; + SCENE_BGINFO backGroundInfo; + Point backGroundPoint; + + _vm->_render->getBufferInfo(&bufferInfo); + _vm->_scene->getBGInfo(&backGroundInfo); + backGroundPoint.x = backGroundInfo.bg_x; + backGroundPoint.y = backGroundInfo.bg_y; + + bufToBuffer(bufferInfo.bg_buf, bufferInfo.bg_buf_w, bufferInfo.bg_buf_h, + backGroundInfo.bg_buf, backGroundInfo.bg_w, backGroundInfo.bg_h, + NULL, &backGroundPoint); + - error("STUB: SF_eraseDelta(), %d args", nArgs); } // Script function #63 (0x3F) |