aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/actor.cpp2
-rw-r--r--saga/script.h8
-rw-r--r--saga/sfuncs.cpp63
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)