diff options
author | Eugene Sandulenko | 2019-10-22 21:13:31 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2019-10-22 21:13:54 +0200 |
commit | 614858eb4b8e60d35e9b89d2be1e420a159c39cd (patch) | |
tree | 8310ac4b79ec0e6d8b5050604868fa71dab61a56 | |
parent | 41f81bf02e313aa92e91f528a3dad2d06cb43d31 (diff) | |
download | scummvm-rg350-614858eb4b8e60d35e9b89d2be1e420a159c39cd.tar.gz scummvm-rg350-614858eb4b8e60d35e9b89d2be1e420a159c39cd.tar.bz2 scummvm-rg350-614858eb4b8e60d35e9b89d2be1e420a159c39cd.zip |
SCUMM HE: Work on receiving part of Moonbase Commander networking
-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; |