[Scummvm-git-logs] scummvm master -> fc4617148981404a9548c98432363f359760bd2c

joostp noreply at scummvm.org
Thu Aug 4 14:58:51 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
fc46171489 ICB: ELDORADO: handle fn_set_as_player differences


Commit: fc4617148981404a9548c98432363f359760bd2c
    https://github.com/scummvm/scummvm/commit/fc4617148981404a9548c98432363f359760bd2c
Author: Joost Peters (joostp at 7fc1.org)
Date: 2022-08-04T16:57:39+02:00

Commit Message:
ICB: ELDORADO: handle fn_set_as_player differences

Changed paths:
    engines/icb/bone.cpp
    engines/icb/bone.h
    engines/icb/function.cpp
    engines/icb/player.cpp


diff --git a/engines/icb/bone.cpp b/engines/icb/bone.cpp
index 883d1604f48..8baec086556 100644
--- a/engines/icb/bone.cpp
+++ b/engines/icb/bone.cpp
@@ -216,6 +216,13 @@ void SetPlayerShotBone(int32 obj_id) {
 
 #define STANDARD_MARKER_HEIGHT 170
 
+void ResetPlayerLook() {
+	_logic *log = MS->player.log;
+	BoneDeformation *b = &(log->voxel_info->lookBone);
+
+	b->boneTarget.vx = b->boneTarget.vy = b->boneTarget.vz = 0;
+}
+
 // update the neck bone
 // should only be called with player as logic
 void UpdatePlayerLook() {
diff --git a/engines/icb/bone.h b/engines/icb/bone.h
index 027716d7ac1..16c23b81ce5 100644
--- a/engines/icb/bone.h
+++ b/engines/icb/bone.h
@@ -37,6 +37,8 @@ void UpdateTalking(_logic *log, RapAPI *rap);
 
 void SetPlayerShotBone(int32 obj_id);
 
+void ResetPlayerLook();
+
 void UpdatePlayerLook();
 
 } // End of namespace ICB
diff --git a/engines/icb/function.cpp b/engines/icb/function.cpp
index 471a6ed3dee..6deef8fd0ce 100644
--- a/engines/icb/function.cpp
+++ b/engines/icb/function.cpp
@@ -338,8 +338,6 @@ mcodeFunctionReturnCodes fn_shadow(int32 &result, int32 *params) { return (MS->f
 
 mcodeFunctionReturnCodes fn_is_actor_relative(int32 &result, int32 *params) { return (MS->fn_is_actor_relative(result, params)); }
 
-mcodeFunctionReturnCodes _game_session::fn_set_as_player(int32 &, int32 *) { return (IR_CONT); }
-
 mcodeFunctionReturnCodes _game_session::fn_rig_test(int32 &, int32 *) {
 	//	no params
 
@@ -3580,5 +3578,36 @@ mcodeFunctionReturnCodes _game_session::fn_can_save(int32 &result, int32 *) {
 	return IR_CONT;
 }
 
+mcodeFunctionReturnCodes _game_session::fn_set_as_player(int32 &, int32 *params) {
+	if (g_icb->getGameType() != GType_ELDORADO)
+		return IR_CONT;
+
+	const char *object_name = (const char *)MemoryUtil::resolvePtr(params[0]);
+
+	uint32 id = LinkedDataObject::Fetch_item_number_by_name(objects, object_name);
+
+	if (id == PX_LINKED_DATA_FILE_ERROR)
+		Fatal_error("fn_set_as_player object [%s] does not exist", object_name);
+
+	// first, if there is a current player then he needs to be told to re-run context as he ain't anymore
+	if (player.Player_exists()) {
+		logic_structs[player.Fetch_player_id()]->context_request = TRUE8;
+		logic_structs[player.Fetch_player_id()]->mega->async_list_pos = 0; // reset list position
+		logic_structs[player.Fetch_player_id()]->mega->asyncing = 0;
+		ResetPlayerLook(); // old player straightens out - i.e. reset look at interact object
+	}
+
+	player.Set_player_id(id);
+
+	player.Reset_player();
+
+	player.interact_lock = TRUE8;
+
+	logic_structs[id]->context_request = TRUE8;
+	logic_structs[id]->mega->async_list_pos = 0; // reset list position
+	logic_structs[id]->mega->asyncing = 0;
+
+	return IR_CONT;
+}
 
 } // End of namespace ICB
diff --git a/engines/icb/player.cpp b/engines/icb/player.cpp
index 6fba98c2eca..416a21f86ce 100644
--- a/engines/icb/player.cpp
+++ b/engines/icb/player.cpp
@@ -2900,8 +2900,10 @@ void _player::Set_player_id(uint32 id) {
 	// get player structures - we can be sure they wont get moved
 	log = g_mission->session->Fetch_object_struct(player_id);
 
-	// get initial barriers for player
-	MS->Prepare_megas_route_barriers(TRUE8);
+	if (g_icb->getGameType() == GType_ICB) {
+		// get initial barriers for player
+		MS->Prepare_megas_route_barriers(TRUE8);
+	}
 
 	// reset pointer to player parent barrier box
 	MS->logic_structs[id]->mega->cur_parent = nullptr;




More information about the Scummvm-git-logs mailing list