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 /engines/scumm/he/moonbase | |
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
Diffstat (limited to 'engines/scumm/he/moonbase')
-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 |
3 files changed, 105 insertions, 3 deletions
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 |