[Scummvm-git-logs] scummvm master -> 614858eb4b8e60d35e9b89d2be1e420a159c39cd

sev- sev at scummvm.org
Tue Oct 22 21:14:13 CEST 2019


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

Summary:
58ae990e3b SCUMM: Made getResourceSize() public
4f54a3361a SCUMM HE: Initial (hard)code for Moonbase networking
4ba4884c37 SCUMM HE: More work on the Moonbase networking. Getting in-game
f0037adb55 SCUMM: Made displayMessage() public
378ab7c642 SCUMM HE: More code for Moonbase Commander networking
41f81bf02e SCUMM HE: Hid several noisy debug messages
614858eb4b SCUMM HE: Work on receiving part of Moonbase Commander networking


Commit: 58ae990e3b07a9889a9dfeebdb24836887a194fb
    https://github.com/scummvm/scummvm/commit/58ae990e3b07a9889a9dfeebdb24836887a194fb
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM: Made getResourceSize() public

Changed paths:
    engines/scumm/scumm.h


diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index ad3a3c1..11c054d 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -757,9 +757,9 @@ protected:
 //	void nukeResource(ResType type, ResId idx);
 	int getResourceRoomNr(ResType type, ResId idx);
 	virtual uint32 getResourceRoomOffset(ResType type, ResId idx);
-	int getResourceSize(ResType type, ResId idx);
 
 public:
+	int getResourceSize(ResType type, ResId idx);
 	byte *getResourceAddress(ResType type, ResId idx);
 	virtual byte *getStringAddress(ResId idx);
 	byte *getStringAddressVar(int i);


Commit: 4f54a3361a7ed69f7928a13b883c2aaa21d2d791
    https://github.com/scummvm/scummvm/commit/4f54a3361a7ed69f7928a13b883c2aaa21d2d791
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM HE: Initial (hard)code for Moonbase networking

Changed paths:
    engines/scumm/he/moonbase/net_main.cpp
    engines/scumm/he/moonbase/net_main.h


diff --git a/engines/scumm/he/moonbase/net_main.cpp b/engines/scumm/he/moonbase/net_main.cpp
index cdc2eef..0c200cf 100644
--- a/engines/scumm/he/moonbase/net_main.cpp
+++ b/engines/scumm/he/moonbase/net_main.cpp
@@ -23,6 +23,7 @@
 #include "scumm/he/intern_he.h"
 #include "scumm/he/moonbase/moonbase.h"
 #include "scumm/he/moonbase/net_main.h"
+#include "scumm/he/moonbase/net_defines.h"
 
 namespace Scumm {
 
@@ -42,7 +43,9 @@ int Net::joinGame(char *IP, char *userName) {
 
 int Net::addUser(char *shortName, char *longName) {
 	warning("STUB: Net::addUser(\"%s\", \"%s\")", shortName, longName); // PN_AddUser
-	return 0;
+
+	// FAKE successful add. FIXME
+	return 1;
 }
 
 int Net::removeUser() {
@@ -67,7 +70,9 @@ int Net::createSession(char *name) {
 
 int Net::joinSession(int sessionIndex) {
 	warning("STUB: Net::joinSession(%d)", sessionIndex); // PN_JoinSession
-	return 0;
+
+	// FAKE successful join. FIXME
+	return 1;
 }
 
 int Net::endSession() {
@@ -88,8 +93,20 @@ void Net::setBotsCount(int botsCount) {
 }
 
 int32 Net::setProviderByName(int32 parameter1, int32 parameter2) {
-	warning("STUB: Net::setProviderByName(%d, %d)", parameter1, parameter2); // PN_SetProviderByName
-	return 0;
+	char name[MAX_PROVIDER_NAME];
+	char ipaddress[MAX_IP_SIZE];
+
+	ipaddress[0] = '\0';
+
+	_vm->getStringFromArray(parameter1, name, sizeof(name));
+	if (parameter2)
+		_vm->getStringFromArray(parameter2, ipaddress, sizeof(ipaddress));
+
+	debug(1, "Net::setProviderByName(\"%s\", \"%s\")", name, ipaddress); // PN_SetProviderByName
+
+	// Emulate that we found a TCP/IP provider
+
+	return 1;
 }
 
 void Net::setFakeLatency(int time) {
@@ -106,12 +123,14 @@ bool Net::destroyPlayer(int32 playerDPID) {
 
 int32 Net::startQuerySessions() {
 	warning("STUB: Net::startQuerySessions()"); // StartQuerySessions
-	return 0;
+
+	// FAKE 1 session. FIXME
+	return 1;
 }
 
 int32 Net::updateQuerySessions() {
 	warning("STUB: Net::updateQuerySessions()"); // UpdateQuerySessions
-	return 0;
+	return startQuerySessions();
 }
 
 void Net::stopQuerySessions() {
@@ -124,8 +143,10 @@ int Net::querySessions() {
 }
 
 int Net::queryProviders() {
-	warning("STUB: Net::queryProviders()"); // PN_QueryProviders
-	return 0;
+	debug(1, "Net::queryProviders()"); // PN_QueryProviders
+
+	// Emulate that we have 1 provider, TCP/IP
+	return 1;
 }
 
 int Net::setProvider(int providerIndex) {
@@ -162,8 +183,25 @@ void Net::remoteStartScript(int typeOfSend, int sendTypeParam, int priority, int
 	warning("STUB: Net::remoteStartScript(%d, %d, %d, %d, ...)", typeOfSend, sendTypeParam, priority, argsCount); // PN_RemoteStartScriptCommand
 }
 
+byte packbuffer[MAX_PACKET_SIZE + 8];
+
+void Net::remoteSendData(int type, byte *data, int len) {
+	WRITE_UINT32(packbuffer, type);
+	WRITE_UINT32(packbuffer + 4, len);
+	memcpy(packbuffer + 8, data, len);
+
+	debug("Package to send, %d bytes", len + 8);
+
+	Common::hexdump(packbuffer, len + 8);
+}
+
 void Net::remoteSendArray(int typeOfSend, int sendTypeParam, int priority, int arrayIndex) {
-	warning("STUB: Net::remoteSendArray(%d, %d, %d, %d)", typeOfSend, sendTypeParam, priority, arrayIndex); // PN_RemoteSendArrayCommand
+	byte *arr = _vm->getResourceAddress(rtString, arrayIndex & ~0x33539000);
+	int len = _vm->getResourceSize(rtString, arrayIndex & ~0x33539000);
+
+	warning("STUB: Net::remoteSendArray(%d, %d, %d, %d)", typeOfSend, sendTypeParam, priority, arrayIndex & ~0x33539000); // PN_RemoteSendArrayCommand
+
+	remoteSendData(PACKETTYPE_REMOTESENDSCUMMARRAY, arr, len);
 }
 
 int Net::remoteStartScriptFunction(int typeOfSend, int sendTypeParam, int priority, int defaultReturnValue, int argsCount, int32 *args) {
@@ -182,6 +220,9 @@ bool Net::getIPfromName(char *ip, int ipLength, char *nameBuffer) {
 }
 
 void Net::getSessionName(int sessionNumber, char *buffer, int length) {
+	// FIXME
+	strcpy(buffer, "test");
+
 	warning("STUB: Net::getSessionName(%d, \"%s\", %d)", sessionNumber, buffer, length); // PN_GetSessionName
 }
 
@@ -189,7 +230,9 @@ int Net::getSessionPlayerCount(int sessionNumber) {
 	warning("STUB: Net::getSessionPlayerCount(%d)", sessionNumber); // case GET_SESSION_PLAYER_COUNT_KLUDGE:
 	//assert(sessionNumber >= 0 && sessionNumber < NUMELEMENTS(gdefMultiPlay.gamedescptr));
 	//return gdefMultiPlay.gamedescptr[sessionNumber].currentplayers;
-	return 0;
+
+	// FAKE 2 players. FIXME
+	return 2;
 }
 
 void Net::getProviderName(int providerIndex, char *buffer, int length) {
diff --git a/engines/scumm/he/moonbase/net_main.h b/engines/scumm/he/moonbase/net_main.h
index dd8cce5..ad1da06 100644
--- a/engines/scumm/he/moonbase/net_main.h
+++ b/engines/scumm/he/moonbase/net_main.h
@@ -27,8 +27,6 @@ namespace Scumm {
 
 class ScummEngine_v100he;
 
-//this is a dummy based on ai_main.h Scumm::AI
-
 class Net {
 public:
 	Net(ScummEngine_v100he *vm);
@@ -60,6 +58,7 @@ public:
 	bool initSession();
 	bool initUser();
 	void remoteStartScript(int typeOfSend, int sendTypeParam, int priority, int argsCount, int32 *args);
+	void remoteSendData(int type, byte *data, int len);
 	void remoteSendArray(int typeOfSend, int sendTypeParam, int priority, int arrayIndex);
 	int remoteStartScriptFunction(int typeOfSend, int sendTypeParam, int priority, int defaultReturnValue, int argsCount, int32 *args);
 


Commit: 4ba4884c37fc2f5644c7ecb0b353f61e88a0330f
    https://github.com/scummvm/scummvm/commit/4ba4884c37fc2f5644c7ecb0b353f61e88a0330f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM HE: More work on the Moonbase networking. Getting in-game

Changed paths:
    engines/scumm/he/moonbase/net_main.cpp
    engines/scumm/he/moonbase/net_main.h


diff --git a/engines/scumm/he/moonbase/net_main.cpp b/engines/scumm/he/moonbase/net_main.cpp
index 0c200cf..80e2f6f 100644
--- a/engines/scumm/he/moonbase/net_main.cpp
+++ b/engines/scumm/he/moonbase/net_main.cpp
@@ -29,11 +29,21 @@ namespace Scumm {
 
 Net::Net(ScummEngine_v100he *vm) : _latencyTime(1), _fakeLatency(false), _vm(vm) {
 	//some defaults for fields
+
+	_packbuffer = (byte *)malloc(MAX_PACKET_SIZE + 12);
+	_tmpbuffer = (byte *)malloc(MAX_PACKET_SIZE);
+}
+
+Net::~Net() {
+	free(_tmpbuffer);
+	free(_packbuffer);
 }
 
 int Net::hostGame(char *sessionName, char *userName) {
 	warning("STUB: op_net_host_tcpip_game(\"%s\", \"%s\")", sessionName, userName); // PN_HostTCPIPGame
-	return 0;
+
+	// FAKE successful game creation. FIXME
+	return 1;
 }
 
 int Net::joinGame(char *IP, char *userName) {
@@ -180,19 +190,26 @@ bool Net::initUser() {
 }
 
 void Net::remoteStartScript(int typeOfSend, int sendTypeParam, int priority, int argsCount, int32 *args) {
+	byte *ptr = _tmpbuffer;
+	for (int i = 0; i < argsCount; i++, ptr += 4)
+		WRITE_UINT32(ptr, args[i]);
+
 	warning("STUB: Net::remoteStartScript(%d, %d, %d, %d, ...)", typeOfSend, sendTypeParam, priority, argsCount); // PN_RemoteStartScriptCommand
+
+	remoteSendData(typeOfSend, sendTypeParam, PACKETTYPE_REMOTESTARTSCRIPTRETURN, _tmpbuffer, argsCount * 4, 0);
 }
 
-byte packbuffer[MAX_PACKET_SIZE + 8];
+int Net::remoteSendData(int typeOfSend, int sendTypeParam, int type, byte *data, int len, int defaultRes) {
+	WRITE_UINT32(_packbuffer, type);
+	WRITE_UINT32(_packbuffer + 4, len);
+	WRITE_UINT32(_packbuffer + 8, g_system->getMillis());
+	memcpy(_packbuffer + 12, data, len);
 
-void Net::remoteSendData(int type, byte *data, int len) {
-	WRITE_UINT32(packbuffer, type);
-	WRITE_UINT32(packbuffer + 4, len);
-	memcpy(packbuffer + 8, data, len);
+	debug("Package to send, to: %d (%d), %d bytes", typeOfSend, sendTypeParam, len + 12);
 
-	debug("Package to send, %d bytes", len + 8);
+	Common::hexdump(_packbuffer, len + 12);
 
-	Common::hexdump(packbuffer, len + 8);
+	return defaultRes;
 }
 
 void Net::remoteSendArray(int typeOfSend, int sendTypeParam, int priority, int arrayIndex) {
@@ -201,12 +218,17 @@ void Net::remoteSendArray(int typeOfSend, int sendTypeParam, int priority, int a
 
 	warning("STUB: Net::remoteSendArray(%d, %d, %d, %d)", typeOfSend, sendTypeParam, priority, arrayIndex & ~0x33539000); // PN_RemoteSendArrayCommand
 
-	remoteSendData(PACKETTYPE_REMOTESENDSCUMMARRAY, arr, len);
+	remoteSendData(typeOfSend, sendTypeParam, PACKETTYPE_REMOTESENDSCUMMARRAY, arr, len, 0);
 }
 
 int Net::remoteStartScriptFunction(int typeOfSend, int sendTypeParam, int priority, int defaultReturnValue, int argsCount, int32 *args) {
+	byte *ptr = _tmpbuffer;
+	for (int i = 0; i < argsCount; i++, ptr += 4)
+		WRITE_UINT32(ptr, args[i]);
+
 	warning("STUB: Net::remoteStartScriptFunction(%d, %d, %d, %d, %d, ...)", typeOfSend, sendTypeParam, priority, defaultReturnValue, argsCount); // PN_RemoteStartScriptFunction
-	return 0;
+
+	return remoteSendData(typeOfSend, sendTypeParam, PACKETTYPE_REMOTESTARTSCRIPTRETURN, _tmpbuffer, argsCount * 4, defaultReturnValue);
 }
 
 bool Net::getHostName(char *hostname, int length) {
diff --git a/engines/scumm/he/moonbase/net_main.h b/engines/scumm/he/moonbase/net_main.h
index ad1da06..7fbae34 100644
--- a/engines/scumm/he/moonbase/net_main.h
+++ b/engines/scumm/he/moonbase/net_main.h
@@ -30,6 +30,7 @@ class ScummEngine_v100he;
 class Net {
 public:
 	Net(ScummEngine_v100he *vm);
+	~Net();
 
 	int hostGame(char *sessionName, char *userName);
 	int joinGame(char *IP, char *userName);
@@ -58,7 +59,7 @@ public:
 	bool initSession();
 	bool initUser();
 	void remoteStartScript(int typeOfSend, int sendTypeParam, int priority, int argsCount, int32 *args);
-	void remoteSendData(int type, byte *data, int len);
+	int remoteSendData(int typeOfSend, int sendTypeParam, int type, byte *data, int len, int defaultRes);
 	void remoteSendArray(int typeOfSend, int sendTypeParam, int priority, int arrayIndex);
 	int remoteStartScriptFunction(int typeOfSend, int sendTypeParam, int priority, int defaultReturnValue, int argsCount, int32 *args);
 
@@ -81,6 +82,10 @@ public:
 	bool _fakeLatency;
 
 	ScummEngine_v100he *_vm;
+
+	byte *_packbuffer;
+	byte *_tmpbuffer;
+
 };
 
 } // End of namespace Scumm


Commit: f0037adb55f84392511534185c03375895abb319
    https://github.com/scummvm/scummvm/commit/f0037adb55f84392511534185c03375895abb319
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM: Made displayMessage() public

Changed paths:
    engines/scumm/scumm.h


diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index 11c054d..873e8fb 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -501,8 +501,10 @@ protected:
 	void messageDialog(const char *message);
 	void versionDialog();
 
+public:
 	char displayMessage(const char *altButton, const char *message, ...) GCC_PRINTF(3, 4);
 
+protected:
 	byte _fastMode;
 
 	byte _numActors;


Commit: 378ab7c642002d16002a030f45699fe2d00e391a
    https://github.com/scummvm/scummvm/commit/378ab7c642002d16002a030f45699fe2d00e391a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM HE: More code for Moonbase Commander networking

Changed paths:
    engines/scumm/he/moonbase/net_main.cpp
    engines/scumm/he/moonbase/net_main.h


diff --git a/engines/scumm/he/moonbase/net_main.cpp b/engines/scumm/he/moonbase/net_main.cpp
index 80e2f6f..fe2fae1 100644
--- a/engines/scumm/he/moonbase/net_main.cpp
+++ b/engines/scumm/he/moonbase/net_main.cpp
@@ -32,6 +32,8 @@ Net::Net(ScummEngine_v100he *vm) : _latencyTime(1), _fakeLatency(false), _vm(vm)
 
 	_packbuffer = (byte *)malloc(MAX_PACKET_SIZE + 12);
 	_tmpbuffer = (byte *)malloc(MAX_PACKET_SIZE);
+
+	_myUserId = -1;
 }
 
 Net::~Net() {
@@ -40,10 +42,21 @@ Net::~Net() {
 }
 
 int Net::hostGame(char *sessionName, char *userName) {
-	warning("STUB: op_net_host_tcpip_game(\"%s\", \"%s\")", sessionName, userName); // PN_HostTCPIPGame
+	if (createSession(sessionName)) {
+		if (addUser(userName, userName)) {
+			return 1;
+		} else {
+			_vm->displayMessage(0, "Error Adding User \"%s\" to Session \"%s\"", userName, sessionName);
+			endSession();
+			closeProvider();
+		}
+	} else {
+		_vm->displayMessage(0, "Error creating session \"%s\"", userName );
+
+		closeProvider();
+	}
 
-	// FAKE successful game creation. FIXME
-	return 1;
+	return 0;
 }
 
 int Net::joinGame(char *IP, char *userName) {
@@ -54,6 +67,8 @@ int Net::joinGame(char *IP, char *userName) {
 int Net::addUser(char *shortName, char *longName) {
 	warning("STUB: Net::addUser(\"%s\", \"%s\")", shortName, longName); // PN_AddUser
 
+	_myUserId = _vm->_rnd.getRandomNumber(1000000);
+
 	// FAKE successful add. FIXME
 	return 1;
 }
@@ -70,12 +85,14 @@ int Net::whoSentThis() {
 
 int Net::whoAmI() {
 	warning("STUB: Net::whoAmI()"); // PN_WhoAmI
-	return 0;
+	return _myUserId;
 }
 
 int Net::createSession(char *name) {
 	warning("STUB: Net::createSession(\"%s\")", name); // PN_CreateSession
-	return 0;
+
+	// FAKE session creation. FIXME
+	return 1;
 }
 
 int Net::joinSession(int sessionIndex) {
diff --git a/engines/scumm/he/moonbase/net_main.h b/engines/scumm/he/moonbase/net_main.h
index 7fbae34..00ec6ca 100644
--- a/engines/scumm/he/moonbase/net_main.h
+++ b/engines/scumm/he/moonbase/net_main.h
@@ -86,6 +86,7 @@ public:
 	byte *_packbuffer;
 	byte *_tmpbuffer;
 
+	int _myUserId;
 };
 
 } // End of namespace Scumm


Commit: 41f81bf02e313aa92e91f528a3dad2d06cb43d31
    https://github.com/scummvm/scummvm/commit/41f81bf02e313aa92e91f528a3dad2d06cb43d31
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM HE: Hid several noisy debug messages

Changed paths:
    engines/scumm/he/moonbase/ai_main.cpp
    engines/scumm/he/moonbase/moonbase.cpp


diff --git a/engines/scumm/he/moonbase/ai_main.cpp b/engines/scumm/he/moonbase/ai_main.cpp
index d6ab54c..cc19cf5 100644
--- a/engines/scumm/he/moonbase/ai_main.cpp
+++ b/engines/scumm/he/moonbase/ai_main.cpp
@@ -2713,7 +2713,7 @@ int AI::getUnitsWithinRadius(int x, int y, int radius) {
 	assert(y >= 0);
 	assert(radius >= 0);
 
-	debug(0, "getUnitsWithinRadius(%d, %d, %d)", x, y, radius);
+	debug(3, "getUnitsWithinRadius(%d, %d, %d)", x, y, radius);
 
 	int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_UNITS_WITHIN_RADIUS], 3, x, y, radius);
 	return retVal;
@@ -2759,7 +2759,7 @@ int AI::energyPoolSize(int pool) {
 
 	case 63:
 		return 60;
-	
+
 	default:
 		return 0;
 	}
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index 1e8c8fa..2f99e32 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -65,7 +65,7 @@ int Moonbase::callScummFunction(int scriptNumber, int paramCount,...) {
 	memset(args, 0, sizeof(args));
 
 	Common::String str;
-	str = Common::String::format("callScummFunction(%d, [", scriptNumber);
+	str = Common::String::format("Moonbase::callScummFunction(%d, [", scriptNumber);
 
 	for (int i = 0; i < paramCount; i++) {
 		args[i] = va_arg(va_params, int);
@@ -74,7 +74,7 @@ int Moonbase::callScummFunction(int scriptNumber, int paramCount,...) {
 	}
 	str += "])";
 
-	debug(0, "%s", str.c_str());
+	debug(3, "%s", str.c_str());
 
 
 	va_end(va_params);


Commit: 614858eb4b8e60d35e9b89d2be1e420a159c39cd
    https://github.com/scummvm/scummvm/commit/614858eb4b8e60d35e9b89d2be1e420a159c39cd
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2019-10-22T21:13:54+02:00

Commit Message:
SCUMM HE: Work on receiving part of Moonbase Commander networking

Changed paths:
    engines/scumm/he/intern_he.h
    engines/scumm/he/logic/moonbase_logic.cpp
    engines/scumm/he/moonbase/moonbase.cpp
    engines/scumm/he/moonbase/net_main.cpp
    engines/scumm/he/moonbase/net_main.h
    engines/scumm/module.mk
    engines/scumm/vars.cpp


diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index 25dd31f..bd0ab76 100644
--- a/engines/scumm/he/intern_he.h
+++ b/engines/scumm/he/intern_he.h
@@ -592,6 +592,8 @@ protected:
 
 class ScummEngine_v100he : public ScummEngine_v99he {
 friend class AI;
+friend class Moonbase;
+friend class Net;
 
 protected:
 	ResType _heResType;
@@ -663,6 +665,10 @@ protected:
 	byte VAR_U32_USER_VAR_D;
 	byte VAR_U32_USER_VAR_E;
 	byte VAR_U32_USER_VAR_F;
+
+	byte VAR_REMOTE_START_SCRIPT;
+	byte VAR_NETWORK_AVAILABLE;
+	byte VAR_NETWORK_RECEIVE_ARRAY_SCRIPT;
 };
 
 class ScummEngine_vCUPhe : public Engine {
diff --git a/engines/scumm/he/logic/moonbase_logic.cpp b/engines/scumm/he/logic/moonbase_logic.cpp
index 8e4b5c9c..d16f8f9 100644
--- a/engines/scumm/he/logic/moonbase_logic.cpp
+++ b/engines/scumm/he/logic/moonbase_logic.cpp
@@ -41,6 +41,8 @@ public:
 
 	int versionID();
 
+	int startOfFrame();
+
 	int32 dispatch(int op, int numArgs, int32 *args);
 
 private:
@@ -162,6 +164,11 @@ int LogicHEmoonbase::versionID() {
 #define OP_NET_ENABLE_SESSION_PLAYER_JOIN	1564
 #define OP_NET_SET_AI_PLAYER_COUNT			1565
 
+int LogicHEmoonbase::startOfFrame() {
+	_vm1->_moonbase->_net->doNetworkOnceAFrame(15); // Value should be passed in...
+
+	return 0;
+}
 
 int32 LogicHEmoonbase::dispatch(int op, int numArgs, int32 *args) {
 	switch (op) {
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index 2f99e32..1c03fc7 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -23,7 +23,7 @@
 #include "scumm/he/intern_he.h"
 #include "scumm/he/moonbase/moonbase.h"
 #include "scumm/he/moonbase/ai_main.h"
-#ifdef USE_SDL_NET
+#ifdef USE_CURL
 #include "scumm/he/moonbase/net_main.h"
 #endif
 
@@ -33,14 +33,17 @@ Moonbase::Moonbase(ScummEngine_v100he *vm) : _vm(vm) {
 	initFOW();
 
 	_ai = new AI(_vm);
-#ifdef USE_SDL_NET
+#ifdef USE_CURL
 	_net = new Net(_vm);
+	_vm->VAR(_vm->VAR_NETWORK_AVAILABLE) = 1;
+#else
+	_vm->VAR(_vm->VAR_NETWORK_AVAILABLE) = 0;
 #endif
 }
 
 Moonbase::~Moonbase() {
 	delete _ai;
-#ifdef USE_SDL_NET
+#ifdef USE_CURL
 	delete _net;
 #endif
 }
diff --git a/engines/scumm/he/moonbase/net_main.cpp b/engines/scumm/he/moonbase/net_main.cpp
index fe2fae1..61ee2a9 100644
--- a/engines/scumm/he/moonbase/net_main.cpp
+++ b/engines/scumm/he/moonbase/net_main.cpp
@@ -278,4 +278,99 @@ void Net::getProviderName(int providerIndex, char *buffer, int length) {
 	warning("STUB: Net::getProviderName(%d, \"%s\", %d)", providerIndex, buffer, length); // PN_GetProviderName
 }
 
+int Net::getMessageCount() {
+	return 0; // FIXME
+}
+
+void Net::remoteReceiveData() {
+	// FIXME. Get data into _packbuffer
+	uint type = READ_UINT32(_packbuffer);
+	uint len = READ_UINT32(_packbuffer + 4);
+	uint timestamp = READ_UINT32(_packbuffer + 8);
+	byte *p;
+	uint32 *params;
+
+	switch (type) {
+	case PACKETTYPE_REMOTESTARTSCRIPT:
+		{
+			p = _packbuffer + 12;
+			params = (uint32 *)_tmpbuffer;
+
+			for (int i = 0; i < 24; i++) {
+				*params = READ_UINT32(p);
+				params++;
+				p += 4;
+			}
+
+			_vm->runScript(_vm->VAR(_vm->VAR_REMOTE_START_SCRIPT), 1, 0, (int *)_tmpbuffer);
+		}
+		break;
+
+	case PACKETTYPE_REMOTESTARTSCRIPTRETURN:
+		{
+			p = _packbuffer + 12;
+			params = (uint32 *)_tmpbuffer;
+
+			for (int i = 0; i < 24; i++) {
+				*params = READ_UINT32(p);
+				params++;
+				p += 4;
+			}
+
+			_vm->runScript(_vm->VAR(_vm->VAR_REMOTE_START_SCRIPT), 1, 0, (int *)_tmpbuffer);
+			int res = _vm->pop();
+
+			WRITE_UINT32(_tmpbuffer, res);
+
+			// FIXME
+			remoteSendData(PN_SENDTYPE_INDIVIDUAL, 0 /* gdefMultiPlay.from */, PACKETTYPE_REMOTESTARTSCRIPTRESULT, _tmpbuffer, 4, 0);
+		}
+		break;
+
+	case PACKETTYPE_REMOTESTARTSCRIPTRESULT:
+		//
+		// Ignore it.
+		//
+
+		break;
+
+	case PACKETTYPE_REMOTESENDSCUMMARRAY:
+		{
+			int newArray;
+
+			// Assume that the packet data contains a "SCUMM PACKAGE"
+			// and unpack it into an scumm array :-)
+
+			newArray = _vm->findFreeArrayId();
+			unpackageArray(newArray, _packbuffer + 12, len);
+			memset(_tmpbuffer, 0, 25 * 4);
+			WRITE_UINT32(_tmpbuffer, newArray);
+
+			// Quick start the script (1st param is the new array)
+			_vm->runScript(_vm->VAR(_vm->VAR_NETWORK_RECEIVE_ARRAY_SCRIPT), 1, 0, (int *)_tmpbuffer);
+		}
+		break;
+
+	default:
+		warning("Moonbase: Received unknown network command %d", type);
+	}
+}
+
+void Net::unpackageArray(int arrayId, byte *data, int len) {
+	warning("STUB: unpackageArray");
+}
+
+
+void Net::doNetworkOnceAFrame(int msecs) {
+	int	tickCount = g_system->getMillis() + msecs;
+
+	while (getMessageCount()) {
+		remoteReceiveData();
+
+		if (tickCount >= g_system->getMillis()) {
+			break;
+		}
+	}
+}
+
 } // End of namespace Scumm
diff --git a/engines/scumm/he/moonbase/net_main.h b/engines/scumm/he/moonbase/net_main.h
index 00ec6ca..1d6af49 100644
--- a/engines/scumm/he/moonbase/net_main.h
+++ b/engines/scumm/he/moonbase/net_main.h
@@ -62,8 +62,12 @@ public:
 	int remoteSendData(int typeOfSend, int sendTypeParam, int type, byte *data, int len, int defaultRes);
 	void remoteSendArray(int typeOfSend, int sendTypeParam, int priority, int arrayIndex);
 	int remoteStartScriptFunction(int typeOfSend, int sendTypeParam, int priority, int defaultReturnValue, int argsCount, int32 *args);
+	void doNetworkOnceAFrame(int msecs);
+	void unpackageArray(int arrayId, byte *data, int len);
 
 private:
+	int getMessageCount();
+	void remoteReceiveData();
 
 public:
 	//getters
diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk
index 799176f..c9319e8 100644
--- a/engines/scumm/module.mk
+++ b/engines/scumm/module.mk
@@ -154,7 +154,7 @@ MODULE_OBJS += \
 	he/moonbase/moonbase.o \
 	he/moonbase/moonbase_fow.o
 
-ifdef USE_SDL_NET
+ifdef USE_LIBCURL
 MODULE_OBJS += \
 	he/moonbase/net_main.o
 endif
diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp
index e5ba4a6..4f00e71 100644
--- a/engines/scumm/vars.cpp
+++ b/engines/scumm/vars.cpp
@@ -346,6 +346,9 @@ void ScummEngine_v100he::setupScummVars() {
 	ScummEngine_v90he::setupScummVars();
 
 	if (_game.id == GID_MOONBASE) {
+		VAR_REMOTE_START_SCRIPT = 98;
+		VAR_NETWORK_AVAILABLE = 100;
+		VAR_NETWORK_RECEIVE_ARRAY_SCRIPT = 101;
 		VAR_U32_USER_VAR_A = 108;
 		VAR_U32_USER_VAR_B = 109;
 		VAR_U32_USER_VAR_C = 110;





More information about the Scummvm-git-logs mailing list