diff options
| -rw-r--r-- | engines/scumm/he/intern_he.h | 6 | ||||
| -rw-r--r-- | engines/scumm/he/logic/moonbase_logic.cpp | 7 | ||||
| -rw-r--r-- | engines/scumm/he/moonbase/moonbase.cpp | 9 | ||||
| -rw-r--r-- | engines/scumm/he/moonbase/net_main.cpp | 95 | ||||
| -rw-r--r-- | engines/scumm/he/moonbase/net_main.h | 4 | ||||
| -rw-r--r-- | engines/scumm/module.mk | 2 | ||||
| -rw-r--r-- | engines/scumm/vars.cpp | 3 | 
7 files changed, 122 insertions, 4 deletions
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h index 25dd31f007..bd0ab76f09 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 8e4b5c9cc7..d16f8f9cf1 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 2f99e32c2b..1c03fc7300 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 fe2fae1081..61ee2a967e 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 00ec6cafe0..1d6af49ea3 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 799176f869..c9319e85a1 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 e5ba4a68ee..4f00e71f0d 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;  | 
