diff options
Diffstat (limited to 'engines/scumm/he/logic/moonbase_logic.cpp')
-rw-r--r-- | engines/scumm/he/logic/moonbase_logic.cpp | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/engines/scumm/he/logic/moonbase_logic.cpp b/engines/scumm/he/logic/moonbase_logic.cpp index 1b596fc54c..c504ad4fe8 100644 --- a/engines/scumm/he/logic/moonbase_logic.cpp +++ b/engines/scumm/he/logic/moonbase_logic.cpp @@ -24,6 +24,10 @@ #include "scumm/he/logic_he.h" #include "scumm/he/moonbase/moonbase.h" #include "scumm/he/moonbase/ai_main.h" +#ifdef USE_SDL_NET +#include "scumm/he/moonbase/net_main.h" +#include "scumm/he/moonbase/net_defines.h" +#endif namespace Scumm { @@ -54,6 +58,45 @@ private: void op_ai_set_type(int op, int numArgs, int32 *args); void op_ai_clean_up(int op, int numArgs, int32 *args); +#ifdef USE_SDL_NET + void op_net_remote_start_script(int op, int numArgs, int32 *args); + void op_net_remote_send_array(int op, int numArgs, int32 *args); + int op_net_remote_start_function(int op, int numArgs, int32 *args); + int op_net_do_init_all(int op, int numArgs, int32 *args); + int op_net_do_init_provider(int op, int numArgs, int32 *args); + int op_net_do_init_session(int op, int numArgs, int32 *args); + int op_net_do_init_user(int op, int numArgs, int32 *args); + int op_net_query_providers(int op, int numArgs, int32 *args); + int op_net_get_provider_name(int op, int numArgs, int32 *args); + int op_net_set_provider(int op, int numArgs, int32 *args); + int op_net_close_provider(int op, int numArgs, int32 *args); + int op_net_start_query_sessions(int op, int numArgs, int32 *args); + int op_net_update_query_sessions(int op, int numArgs, int32 *args); + int op_net_stop_query_sessions(int op, int numArgs, int32 *args); + int op_net_query_sessions(int op, int numArgs, int32 *args); + int op_net_get_session_name(int op, int numArgs, int32 *args); + int op_net_get_session_player_count(int op, int numArgs, int32 *args); + int op_net_destroy_player(int op, int numArgs, int32 *args); + int op_net_get_player_long_name(int op, int numArgs, int32 *args); + int op_net_get_player_short_name(int op, int numArgs, int32 *args); + int op_net_create_session(int op, int numArgs, int32 *args); + int op_net_join_session(int op, int numArgs, int32 *args); + int op_net_end_session(int op, int numArgs, int32 *args); + int op_net_disable_session_player_join(int op, int numArgs, int32 *args); + int op_net_enable_session_player_join(int op, int numArgs, int32 *args); + int op_net_set_ai_player_count(int op, int numArgs, int32 *args); + int op_net_add_user(int op, int numArgs, int32 *args); + int op_net_remove_user(int op, int numArgs, int32 *args); + int op_net_who_sent_this(int op, int numArgs, int32 *args); + int op_net_who_am_i(int op, int numArgs, int32 *args); + int op_net_set_provider_by_name(int op, int numArgs, int32 *args); + void op_net_set_fake_latency(int op, int numArgs, int32 *args); + int op_net_get_host_name(int op, int numArgs, int32 *args); + int op_net_get_ip_from_name(int op, int numArgs, int32 *args); + int op_net_host_tcpip_game(int op, int numArgs, int32 *args); + int op_net_join_tcpip_game(int op, int numArgs, int32 *args); +#endif + private: ScummEngine_v100he *_vm1; }; @@ -107,6 +150,7 @@ int LogicHEmoonbase::versionID() { #define OP_NET_HOST_TCPIP_GAME 1517 #define OP_NET_JOIN_TCPIP_GAME 1518 #define OP_NET_SET_FAKE_LAG 1555 +#define OP_NET_SET_FAKE_LATENCY 1555 /* SET_FAKE_LAG is a valid alias for backwards compatibility */ #define OP_NET_GET_HOST_NAME 1556 #define OP_NET_GET_IP_FROM_NAME 1557 #define OP_NET_GET_SESSION_PLAYER_COUNT 1558 @@ -157,6 +201,86 @@ int32 LogicHEmoonbase::dispatch(int op, int numArgs, int32 *args) { op_ai_clean_up(op, numArgs, args); break; +#ifdef USE_SDL_NET + case OP_NET_REMOTE_START_SCRIPT: + op_net_remote_start_script(op, numArgs, args); + break; + case OP_NET_REMOTE_SEND_ARRAY: + op_net_remote_send_array(op, numArgs, args); + break; + case OP_NET_REMOTE_START_FUNCTION: + return op_net_remote_start_function(op, numArgs, args); + case OP_NET_DO_INIT_ALL: + return op_net_do_init_all(op, numArgs, args); + case OP_NET_DO_INIT_PROVIDER: + return op_net_do_init_provider(op, numArgs, args); + case OP_NET_DO_INIT_SESSION: + return op_net_do_init_session(op, numArgs, args); + case OP_NET_DO_INIT_USER: + return op_net_do_init_user(op, numArgs, args); + case OP_NET_QUERY_PROVIDERS: + return op_net_query_providers(op, numArgs, args); + case OP_NET_GET_PROVIDER_NAME: + return op_net_get_provider_name(op, numArgs, args); + case OP_NET_SET_PROVIDER: + return op_net_set_provider(op, numArgs, args); + case OP_NET_CLOSE_PROVIDER: + return op_net_close_provider(op, numArgs, args); + case OP_NET_START_QUERY_SESSIONS: + return op_net_start_query_sessions(op, numArgs, args); + case OP_NET_UPDATE_QUERY_SESSIONS: + return op_net_update_query_sessions(op, numArgs, args); + case OP_NET_STOP_QUERY_SESSIONS: + return op_net_stop_query_sessions(op, numArgs, args); + case OP_NET_QUERY_SESSIONS: + return op_net_query_sessions(op, numArgs, args); + case OP_NET_GET_SESSION_NAME: + return op_net_get_session_name(op, numArgs, args); + case OP_NET_GET_SESSION_PLAYER_COUNT: + return op_net_get_session_player_count(op, numArgs, args); + case OP_NET_DESTROY_PLAYER: + return op_net_destroy_player(op, numArgs, args); +#if 1 // 12/2/99 BPT + case OP_NET_GET_PLAYER_LONG_NAME: + return op_net_get_player_long_name(op, numArgs, args); + case OP_NET_GET_PLAYER_SHORT_NAME: + return op_net_get_player_short_name(op, numArgs, args); +#endif + case OP_NET_CREATE_SESSION: + return op_net_create_session(op, numArgs, args); + case OP_NET_JOIN_SESSION: + return op_net_join_session(op, numArgs, args); + case OP_NET_END_SESSION: + return op_net_end_session(op, numArgs, args); + case OP_NET_DISABLE_SESSION_PLAYER_JOIN: + return op_net_disable_session_player_join(op, numArgs, args); + case OP_NET_ENABLE_SESSION_PLAYER_JOIN: + return op_net_enable_session_player_join(op, numArgs, args); + case OP_NET_SET_AI_PLAYER_COUNT: + return op_net_set_ai_player_count(op, numArgs, args); + case OP_NET_ADD_USER: + return op_net_add_user(op, numArgs, args); + case OP_NET_REMOVE_USER: + return op_net_remove_user(op, numArgs, args); + case OP_NET_WHO_SENT_THIS: + return op_net_who_sent_this(op, numArgs, args); + case OP_NET_WHO_AM_I: + return op_net_who_am_i(op, numArgs, args); + case OP_NET_SET_PROVIDER_BY_NAME: + return op_net_set_provider_by_name(op, numArgs, args); + case OP_NET_SET_FAKE_LATENCY: // SET_FAKE_LAG is a valid alias for backwards compatibility + op_net_set_fake_latency(op, numArgs, args); + break; + case OP_NET_GET_HOST_NAME: + return op_net_get_host_name(op, numArgs, args); + case OP_NET_GET_IP_FROM_NAME: + return op_net_get_ip_from_name(op, numArgs, args); + case OP_NET_HOST_TCPIP_GAME: + return op_net_host_tcpip_game(op, numArgs, args); + case OP_NET_JOIN_TCPIP_GAME: + return op_net_join_tcpip_game(op, numArgs, args); +#endif + default: LogicHE::dispatch(op, numArgs, args); } @@ -248,6 +372,193 @@ void LogicHEmoonbase::op_ai_clean_up(int op, int numArgs, int32 *args) { _vm1->_moonbase->_ai->cleanUpAI(); } +#ifdef USE_SDL_NET +void LogicHEmoonbase::op_net_remote_start_script(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->remoteStartScript(args[0], args[1], args[2], numArgs - 3, &args[3]); +} + +void LogicHEmoonbase::op_net_remote_send_array(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->remoteSendArray(args[0], args[1], args[2], args[3]); +} + +int LogicHEmoonbase::op_net_remote_start_function(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->remoteStartScriptFunction(args[0], args[1], args[2], args[3], numArgs - 4, &args[4]); +} + +int LogicHEmoonbase::op_net_do_init_all(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->initAll(); +} + +int LogicHEmoonbase::op_net_do_init_provider(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->initProvider(); +} + +int LogicHEmoonbase::op_net_do_init_session(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->initSession(); +} + +int LogicHEmoonbase::op_net_do_init_user(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->initUser(); +} + +int LogicHEmoonbase::op_net_query_providers(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->queryProviders(); +} + +int LogicHEmoonbase::op_net_get_provider_name(int op, int numArgs, int32 *args) { + char name[MAX_PROVIDER_NAME]; + _vm1->_moonbase->_net->getProviderName(args[0] - 1, name, sizeof(name)); + return _vm1->setupStringArrayFromString(name); +} + +int LogicHEmoonbase::op_net_set_provider(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->setProvider(args[0] - 1); +} + +int LogicHEmoonbase::op_net_close_provider(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->closeProvider(); +} + +int LogicHEmoonbase::op_net_start_query_sessions(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->startQuerySessions(); +} + +int LogicHEmoonbase::op_net_update_query_sessions(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->updateQuerySessions(); +} + +int LogicHEmoonbase::op_net_stop_query_sessions(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->stopQuerySessions(); + return 1; +} + +int LogicHEmoonbase::op_net_query_sessions(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->querySessions(); +} + +int LogicHEmoonbase::op_net_get_session_name(int op, int numArgs, int32 *args) { + char name[MAX_PROVIDER_NAME]; + _vm1->_moonbase->_net->getSessionName(args[0] - 1, name, sizeof(name)); + return _vm1->setupStringArrayFromString(name); +} + +int LogicHEmoonbase::op_net_get_session_player_count(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->getSessionPlayerCount(args[0] - 1); +} + +int LogicHEmoonbase::op_net_destroy_player(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->destroyPlayer(args[0]); +} + +int LogicHEmoonbase::op_net_get_player_long_name(int op, int numArgs, int32 *args) { + return _vm1->setupStringArrayFromString("long name"); // TODO: gdefMultiPlay.playername1 +} + +int LogicHEmoonbase::op_net_get_player_short_name(int op, int numArgs, int32 *args) { + return _vm1->setupStringArrayFromString("short"); // TODO: gdefMultiPlay.playername2 +} + +int LogicHEmoonbase::op_net_create_session(int op, int numArgs, int32 *args) { + char name[MAX_SESSION_NAME]; + _vm1->getStringFromArray(args[0], name, sizeof(name)); + return _vm1->_moonbase->_net->createSession(name); +} + +int LogicHEmoonbase::op_net_join_session(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->joinSession(args[0] - 1); +} + +int LogicHEmoonbase::op_net_end_session(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->endSession(); +} + +int LogicHEmoonbase::op_net_disable_session_player_join(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->disableSessionJoining(); + return 1; +} + +int LogicHEmoonbase::op_net_enable_session_player_join(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->enableSessionJoining(); + return 1; +} + +int LogicHEmoonbase::op_net_set_ai_player_count(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->setBotsCount(args[0]); + return 1; +} + +int LogicHEmoonbase::op_net_add_user(int op, int numArgs, int32 *args) { + char userName[MAX_PLAYER_NAME]; + _vm1->getStringFromArray(args[0], userName, sizeof(userName)); + return _vm1->_moonbase->_net->addUser(userName, userName); +} + +int LogicHEmoonbase::op_net_remove_user(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->removeUser(); +} + +int LogicHEmoonbase::op_net_who_sent_this(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->whoSentThis(); +} + +int LogicHEmoonbase::op_net_who_am_i(int op, int numArgs, int32 *args) { + return _vm1->_moonbase->_net->whoAmI(); +} + +int LogicHEmoonbase::op_net_set_provider_by_name(int op, int numArgs, int32 *args) { + // Parameter 1 is the provider name and + // Parameter 2 is the (optional) tcp/ip address + return _vm1->_moonbase->_net->setProviderByName(args[0], args[1]); +} + +void LogicHEmoonbase::op_net_set_fake_latency(int op, int numArgs, int32 *args) { + _vm1->_moonbase->_net->setFakeLatency(args[0]); +} + +int LogicHEmoonbase::op_net_get_host_name(int op, int numArgs, int32 *args) { + char name[MAX_HOSTNAME_SIZE]; + + if (_vm1->_moonbase->_net->getHostName(name, MAX_HOSTNAME_SIZE)) { + return _vm1->setupStringArrayFromString(name); + } + + return 0; +} + +int LogicHEmoonbase::op_net_get_ip_from_name(int op, int numArgs, int32 *args) { + char name[MAX_HOSTNAME_SIZE]; + _vm1->getStringFromArray(args[0], name, sizeof(name)); + + char ip[MAX_IP_SIZE]; + + if (_vm1->_moonbase->_net->getIPfromName(ip, MAX_IP_SIZE, name)) { + return _vm1->setupStringArrayFromString(ip); + } + + return 0; +} + +int LogicHEmoonbase::op_net_host_tcpip_game(int op, int numArgs, int32 *args) { + char sessionName[MAX_SESSION_NAME]; + char userName[MAX_PLAYER_NAME]; + + _vm1->getStringFromArray(args[0], sessionName, sizeof(sessionName)); + _vm1->getStringFromArray(args[1], userName, sizeof(userName)); + + return _vm1->_moonbase->_net->hostGame(sessionName, userName); +} + +int LogicHEmoonbase::op_net_join_tcpip_game(int op, int numArgs, int32 *args) { + char ip[MAX_IP_SIZE]; + char userName[MAX_PLAYER_NAME]; + + _vm1->getStringFromArray(args[0], ip, sizeof(ip)); + _vm1->getStringFromArray(args[1], userName, sizeof(userName)); + + return _vm1->_moonbase->_net->joinGame(ip, userName); +} +#endif + LogicHE *makeLogicHEmoonbase(ScummEngine_v100he *vm) { return new LogicHEmoonbase(vm); } |