diff options
Diffstat (limited to 'engines/scumm/he')
-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 |
5 files changed, 118 insertions, 3 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 |