aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEugene Sandulenko2019-10-22 21:13:31 +0200
committerEugene Sandulenko2019-10-22 21:13:54 +0200
commit614858eb4b8e60d35e9b89d2be1e420a159c39cd (patch)
tree8310ac4b79ec0e6d8b5050604868fa71dab61a56 /engines
parent41f81bf02e313aa92e91f528a3dad2d06cb43d31 (diff)
downloadscummvm-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')
-rw-r--r--engines/scumm/he/intern_he.h6
-rw-r--r--engines/scumm/he/logic/moonbase_logic.cpp7
-rw-r--r--engines/scumm/he/moonbase/moonbase.cpp9
-rw-r--r--engines/scumm/he/moonbase/net_main.cpp95
-rw-r--r--engines/scumm/he/moonbase/net_main.h4
-rw-r--r--engines/scumm/module.mk2
-rw-r--r--engines/scumm/vars.cpp3
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;