/* * $Logfile: /DescentIII/Main/lib/con_dll.h $ * $Revision: 1.1.1.1 $ * $Date: 2003/08/26 03:58:12 $ * $Author: kevinb $ * * Common header for connection DLLs. * * $Log: con_dll.h,v $ * Revision 1.1.1.1 2003/08/26 03:58:12 kevinb * initial 1.5 import * * * 78 5/09/00 5:11p Jeff * fixed struct packing bug * * 77 3/26/00 10:30p Kevin * MOD Downloader for 1.4 patch. * * 75 10/21/99 9:27p Jeff * B.A. Macintosh code merge * * 74 8/02/99 11:47a Kevin * don't display the d3 single mission twice! * * 73 7/12/99 4:15p Kevin * Changed the way we determine if we should report stats or not in PXO * * 72 7/06/99 5:52p Kevin * PXO & multiplayer fixes for the patch * * 71 6/23/99 3:35p Samir * added pstypes.h * * 70 6/03/99 8:48a Kevin * fixes for new OEM version.... * * 69 5/24/99 4:21p Jason * fixed difficultly level problem * * 68 4/28/99 6:39p Kevin * Build 182 fixes * * 67 4/26/99 2:54p Kevin * fixed team count & keyword system to work with dedicated server * * 66 4/25/99 5:02p Kevin * Bunches of multiplayer UI improvements * * 65 4/25/99 12:11a Kevin * game info dialog stuff * * 64 4/23/99 5:32p Kevin * Fixed a few mission bugs. * * 63 4/23/99 3:33p Kevin * mission file/multiplayer mod keyword system * * 62 4/19/99 7:56p Kevin * ifdef'd out some win32 specific stuff * * 61 4/19/99 6:10p Kevin * Demo now only has one multiplayer level * * 60 4/18/99 3:12p Jeff * got working with linux * * 59 4/16/99 3:17p Kevin * More mouselook support * * 58 4/14/99 3:06p Kevin * Force main mission to list even on small installations * * 57 4/08/99 4:54p Kevin * Display level warp dialog for multiplayer * * 56 4/08/99 3:42p Kevin * Added some stuff for the scoring API. Not functional yet. * * 55 4/03/99 9:26p Jeff * changed dialogs that weren't using UID_OK and UID_CANCEL to use and * handle them properly * * 54 3/25/99 3:29p Jason * added option to randomize powerup respawn points * * 53 3/25/99 3:26p Kevin * Made PXO games be based on your chat channel * * 52 3/24/99 1:41p Jeff * some dedicated server fixups...ability to set number of teams * * 51 3/17/99 4:08p Kevin * Changed the way games appear and timeout in the game list. * * 50 3/04/99 6:11p Kevin * Fixed mission name for OEM * * 49 3/02/99 5:50p Kevin * Ouch. Duplicate structures existed and were conflicting. * * 48 3/02/99 1:18a Kevin * * 47 3/02/99 1:11a Kevin * * 46 3/01/99 9:37p Jeff * fixed missing semicolon * * 45 3/01/99 9:03p Kevin * OEM Beta 4 * * 44 2/28/99 11:04p Jeff * handle Capture The Flag->CTF in Demo/OEM * * 43 2/19/99 5:21p Kevin * Fixed some connection DLLs and a Direct Sound bug with threads. * * 42 2/15/99 7:47p Jeff * new pilot file class and read/write system checked in...should be more * robust than old * * 41 2/04/99 11:40a Kevin * Made listboxes sort * * 40 2/03/99 6:14p Kevin * OEM changes * * 39 2/03/99 4:20p Kevin * Got multiplayer working with .mn3 files, and setup autodownloading * * 38 1/11/99 12:29p Jeff * changes made not to call the module library directly * * 37 1/07/99 11:51a Kevin * Added support for joining servers on alternate ports and hosting behind * a proxy/firewall * * 36 12/30/98 3:49p Kevin * Moved multiplayer options out of DLL and into main app * * 35 12/30/98 12:16p Kevin * Auto Mission Download system * * 34 12/23/98 6:38p Kevin * All UDP data (except gamespy) now uses one (registered) port number * * 33 12/18/98 11:00a Jason * * 32 12/15/98 10:53a Jason * yet more changes for 1.1 * * 31 12/14/98 10:53a Jason * added bright player ships option * * 30 12/01/98 12:47p Jason * got rid of NF_DROPMISORDERED and added NF_USE_SMOOTHING * * 29 11/18/98 3:26p Kevin * Put multiplayer options into con_dll.h * * 28 10/19/98 11:07p Kevin * fixed bug * * 27 10/19/98 7:51p Kevin * performance testing * * 26 10/19/98 1:08p Kevin * Removed single player level from demo build * * 25 10/15/98 1:36p Jeff * updated dllinfo struct * * 24 10/13/98 12:03p Kevin * Changed use of preprocessors for debug, etc. * * 23 10/12/98 8:39p Kevin * removed mprintf's and fixed some smallish bugs * * 22 10/08/98 12:05p Kevin * Moved some start menu stuff around for Luke * * 21 10/07/98 11:45a Kevin * changed demo mission name * * 20 10/06/98 11:00a Kevin * Updated mission names for demo * * 19 10/01/98 11:37a Kevin * UI fixes and stuff * * 18 9/29/98 2:23p Kevin * More UI tweaks * * 17 9/28/98 9:53a Kevin * Fixing misc UI problems, and fixed some bugs that VC 6 found * * 16 9/24/98 12:50p Kevin * Added UI for rotational velocity and drop out of order packets in net * games * * 15 9/23/98 6:33p Kevin * Fixed load settings * * 14 9/23/98 2:55p Kevin * Saved multi config and changed UI to conform * * 13 9/22/98 3:55p Kevin * Removed obsolete function * * 12 9/22/98 2:29p Kevin * moved ships allowed code out of dll and into main app. Also added * powerup exclusions * * 11 9/21/98 11:19a Kevin * check protocol before entering multiplayer screens * * 10 9/16/98 8:06p Jason * got mastertracker working with the dedicated server * * 9 9/04/98 1:51p Kevin * implemented asyncronous gethostbyname * * 8 9/02/98 6:54p Kevin * Fixed general directplay support up, and got modem-modem working * * 7 8/31/98 10:14a Kevin * Misc. multi-UI fixes * * 6 8/27/98 5:03p Kevin * Prettied up multiplayer screens and fixed some bugs. * * 5 8/25/98 6:33p Kevin * pxo * * 4 8/24/98 5:04p Kevin * Made msn files have the option to not be playable in multiplayer * * 3 8/24/98 10:42a Kevin * Updated DLL for directplay and PXO background * * 2 8/19/98 11:50a Kevin * Got DirectPlay IPX working, and localized connection DLLs * * $NoKeywords: $ */ /////////////////////////////////////////////// #include "ship.h" #include "pstypes.h" #ifdef __LINUX__ #include #include "linux/linux_fix.h" #endif //Uncomment out this line of code to build the demo version of the multiplayer connection dlls //#define DEMO 1 //localization info char **StringTable; int StringTableSize = 0; char *_ErrorString = "Missing String"; char *GetString(int d){if( (d<0) || (d>=StringTableSize) ) return _ErrorString; else return StringTable[d];} #define TXT(d) GetString(d) /////////////////////////////////////////////// #define CHAR_LEFT_ARROW 24 #define CHAR_UP_ARROW 25 #define CHAR_RIGHT_ARROW 26 #define CHAR_DOWN_ARROW 27 #define CHAR_CHECKBOX_OFF 28 #define CHAR_CHECKBOX_ON 29 #define CHAR_RADIO_OFF 30 #define CHAR_RADIO_ON 31 #define DLL_UI_CANCEL 99 #define DLL_BRIEFING_FONT 1 #define DLL_BIG_BRIEFING_FONT 2 typedef struct { int me_handle; int it_handle; ubyte *special_data; char *input_string; int input_key; union{ int iRet; float fRet; }; float fParam; int iParam; } dllinfo; typedef struct { int *objs; int *rooms; int *terrain; int *players; int *netgame; int *netplayers; int *ships; int *fp[200]; // function pointers int *vp[200]; // variable pointers } multi_api; typedef void( *GetMultiAPI_fp) (multi_api *api); GetMultiAPI_fp DLLGetMultiAPI; typedef void( *SetUITextItemText_fp ) (void *uit,char *newtext,unsigned int color); SetUITextItemText_fp DLLSetUITextItemText; typedef void *( *NewUIWindowCreate_fp ) (int x, int y, int w, int h, int flags); NewUIWindowCreate_fp DLLNewUIWindowCreate; typedef void( *NewUIWindowDestroy_fp ) (void *deswin); NewUIWindowDestroy_fp DLLNewUIWindowDestroy; typedef void( *NewUIWindowOpen_fp ) (void *deswin); NewUIWindowOpen_fp DLLNewUIWindowOpen; typedef void( *NewUIWindowClose_fp ) (void *deswin); NewUIWindowClose_fp DLLNewUIWindowClose; typedef void *( *TextCreate_fp ) (void *parentwin,void * textitem, int x, int y, int flags); TextCreate_fp DLLTextCreate; typedef void *( *EditCreate_fp ) (void *parentwin, int id, int x, int y, int w, int h, int flags); EditCreate_fp DLLEditCreate; typedef void *( *ButtonCreate_fp ) (void *parentwin, int id,void * titleitem, int x, int y, int w, int h, int flags); ButtonCreate_fp DLLButtonCreate; typedef void *( *ListCreate_fp ) (void *parentwin, int id, int x, int y, int w, int h, int flags); ListCreate_fp DLLListCreate; typedef void( *ListRemoveAll_fp ) (void *item); ListRemoveAll_fp DLLListRemoveAll; typedef void( *ListAddItem_fp ) (void *item,void * uitext); ListAddItem_fp DLLListAddItem; typedef void( *ListRemoveItem_fp ) (void * item,void * txtitem); ListRemoveItem_fp DLLListRemoveItem; typedef void( *ListSelectItem_fp ) (void * item,void * txtitem); ListSelectItem_fp DLLListSelectItem; typedef char *( *ListGetItem_fp ) (void * item,int index); ListGetItem_fp DLLListGetItem; typedef int( *ListGetSelectedIndex_fp ) (void * item); ListGetSelectedIndex_fp DLLListGetSelectedIndex; typedef void( *EditSetText_fp ) (void * item,char *buff); EditSetText_fp DLLEditSetText; typedef void( *EditGetText_fp ) (void * item,char *buff,int len); EditGetText_fp DLLEditGetText; typedef void( *DatabaseWrite_fp) (const char *label, const char *entry, int entrylen); DatabaseWrite_fp DLLDatabaseWrite; typedef void( *DatabaseRead_fp) (const char *label, char *entry, int *entrylen); DatabaseRead_fp DLLDatabaseRead; typedef void( *DescentDefer_fp) (void); DescentDefer_fp DLLDescentDefer; typedef void( *DoMessageBox_fp) (const char *title, const char *msg, int type, ddgr_color title_color, ddgr_color text_color); DoMessageBox_fp DLLDoMessageBoxFP; inline void DLLDoMessageBox (const char *title, const char *msg, int type, ddgr_color title_color = GR_WHITE, ddgr_color text_color = GR_WHITE) { DLLDoMessageBoxFP(title,msg,type,title_color,text_color); } typedef int( *DoUI_fp) (void); DoUI_fp DLLDoUI; typedef void( *Debug_ConsolePrintf_fp ) (int n, char *format, ... ); Debug_ConsolePrintf_fp DLLDebug_ConsolePrintf; typedef void( *DedicatedServerPrintf_fp ) (char *format, ... ); DedicatedServerPrintf_fp DLLPrintDedicatedMessage; /* typedef int( *ValidateUser_fp) (validate_id_request *valid_id, char *trackerid); ValidateUser_fp DLLValidateUser; typedef void( *PollPTrackNet_fp) (); PollPTrackNet_fp DLLPollPTrackNet; */ typedef void *( *NewUIGameWindowCreate_fp) (int x, int y, int w, int h, int flags); NewUIGameWindowCreate_fp DLLNewUIGameWindowCreate; typedef void( *NewUIGameWindowDestroy_fp) (void * item); NewUIGameWindowDestroy_fp DLLNewUIGameWindowDestroy; typedef void( *NewUIGameWindowOpen_fp) (void * item); NewUIGameWindowOpen_fp DLLNewUIGameWindowOpen; typedef void( *NewUIGameWindowClose_fp) (void * item); NewUIGameWindowClose_fp DLLNewUIGameWindowClose; typedef void( *SetScreenMode_fp) (int); SetScreenMode_fp DLLSetScreenMode; typedef float( *timer_GetTime_fp) (void); timer_GetTime_fp DLLtimer_GetTime; typedef int( *TryToJoinServer_fp) (network_address *addr); TryToJoinServer_fp DLLTryToJoinServer; typedef void( *MultiStartClient_fp) (char *scriptname); MultiStartClient_fp DLLMultiStartClient; typedef void( *rend_GetRenderState_fp) (rendering_state *rstate); rend_GetRenderState_fp DLLrend_GetRenderState; typedef bool( *LoadMission_fp) (char *msn); LoadMission_fp DLLLoadMission; typedef void( *ddio_MakePath_fp) (char* newPath, const char* absolutePathHeader, const char* subDir, ...); ddio_MakePath_fp DLLddio_MakePath; typedef bool( *ddio_FindFileStart_fp) (const char *wildcard, char *namebuf); ddio_FindFileStart_fp DLLddio_FindFileStart; typedef void( *ddio_FindFileClose_fp) (); ddio_FindFileClose_fp DLLddio_FindFileClose; typedef bool( *ddio_FindNextFile_fp) (char *namebuf); ddio_FindNextFile_fp DLLddio_FindNextFile; //typedef void( *MultiStartServer_fp) (int playing,char *scriptname,int dedicated_num_teams=-1); typedef void( *MultiStartServer_fp) (int playing,char *scriptname,int dedicated_num_teams); MultiStartServer_fp DLLMultiStartServerFP; inline void DLLMultiStartServer (int playing,char *scriptname,int dedicated_num_teams=-1) { DLLMultiStartServerFP(playing,scriptname,dedicated_num_teams); } typedef void( *ShowProgressScreen_fp) (char *,char *); ShowProgressScreen_fp DLLShowProgressScreen; typedef int( *SearchForLocalGamesTCP_fp)(unsigned int,ushort); SearchForLocalGamesTCP_fp DLLSearchForLocalGamesTCP; typedef int( *nw_GetHostAddressFromNumbers_fp) (char *str); nw_GetHostAddressFromNumbers_fp DLLnw_GetHostAddressFromNumbers; typedef int( *nw_GetProtocolType_fp) (void); nw_GetProtocolType_fp DLLnw_GetProtocolType; typedef void *(*HotSpotCreate_fp) (void *parentwin, int id, int key, void * txtitemoff, void * txtitemon, int x, int y, int w, int h, int flags); HotSpotCreate_fp DLLHotSpotCreate; typedef int (*PollUI_fp) (void); PollUI_fp DLLPollUI; typedef char * (*GetMissionName_fp) (char *mission); GetMissionName_fp DLLGetMissionName; typedef void (*RemoveUITextItem_fp) (void *item); RemoveUITextItem_fp DLLRemoveUITextItem; typedef void * (*CreateNewUITextItem_fp) (char *newtext,unsigned int color,int font); CreateNewUITextItem_fp DLLCreateNewUITextItemFP; inline void * DLLCreateNewUITextItem(char *newtext,unsigned int color,int font=-1) { return DLLCreateNewUITextItemFP(newtext,color,font); } typedef void *(*mem_malloc_fp) (int size); mem_malloc_fp DLLmem_malloc; typedef void (*mem_free_fp) (void *memblock); mem_free_fp DLLmem_free; typedef void (*CreateSplashScreen_fp) (char *msg,int usecancel); CreateSplashScreen_fp DLLCreateSplashScreen; typedef void (*CloseSplashScreen_fp) (void); CloseSplashScreen_fp DLLCloseSplashScreen; typedef void *(*UIConsoleGadgetCreate_fp) (void * parentid, int id, int x, int y, int font, int cols, int rows, int flags); UIConsoleGadgetCreate_fp DLLUIConsoleGadgetCreate; typedef void (*UIConsoleGadgetputs_fp) (void * item, const char *str); UIConsoleGadgetputs_fp DLLUIConsoleGadgetputs; typedef void (*NewUIWindowSetFocusOnEditGadget_fp) (void * item,void * parent); NewUIWindowSetFocusOnEditGadget_fp DLLNewUIWindowSetFocusOnEditGadget; typedef void *( *OldEditCreate_fp ) (void * parentitem, int id, int x, int y, int w, int h, int flags); OldEditCreate_fp DLLOldEditCreate; typedef void *( *OldListCreate_fp ) (void * parentitem, int id, int x, int y, int w, int h, int flags); OldListCreate_fp DLLOldListCreate; typedef void( *OldListRemoveAll_fp ) (void * item); OldListRemoveAll_fp DLLOldListRemoveAll; typedef void( *OldListAddItem_fp ) (void * item,void * uitext); OldListAddItem_fp DLLOldListAddItem; typedef void( *OldListRemoveItem_fp ) (void * item,void * txtitem); OldListRemoveItem_fp DLLOldListRemoveItem; typedef void( *OldListSelectItem_fp ) (void * item,void * txtitem); OldListSelectItem_fp DLLOldListSelectItem; typedef char *( *OldListGetItem_fp ) (void * item,int index); OldListGetItem_fp DLLOldListGetItem; typedef int( *OldListGetSelectedIndex_fp ) (void * item); OldListGetSelectedIndex_fp DLLOldListGetSelectedIndex; typedef void( *OldEditSetText_fp ) (void * item,char *newtext); OldEditSetText_fp DLLOldEditSetText; typedef void( *OldEditGetText_fp ) (void * item,char *buff,int len); OldEditGetText_fp DLLOldEditGetText; typedef void (*ToggleUICallback_fp) (int state); ToggleUICallback_fp DLLToggleUICallback; typedef int (*SearchForGamesPXO_fp) (unsigned int ask,ushort port); SearchForGamesPXO_fp DLLSearchForGamesPXO; typedef void (*SetOldEditBufferLen_fp) (void * item,int len); SetOldEditBufferLen_fp DLLSetOldEditBufferLen; typedef void (*NewUIWindowLoadBackgroundImage_fp) (void * item,const char *image_name); NewUIWindowLoadBackgroundImage_fp DLLNewUIWindowLoadBackgroundImage; typedef void (*DeleteUIItem_fp) (void *delitem); DeleteUIItem_fp DLLDeleteUIItem; typedef int (*SearchForLocalGamesIPX_fp) (network_address *check_addr); SearchForLocalGamesIPX_fp DLLSearchForLocalGamesIPX; typedef void (*HotSpotSetStates_fp)(void *hotspot,void *texton,void *textoff); HotSpotSetStates_fp DLLHotSpotSetStates; typedef bool (*PlayerSetShipPermission_fp)(int pnum,char *ship_name,bool allowed); PlayerSetShipPermission_fp DLLPlayerSetShipPermission; typedef bool (*PlayerIsShipAllowed_fp)(int pnum,int ship_index); PlayerIsShipAllowed_fp DLLPlayerIsShipAllowed; #ifdef WIN32 typedef int (*dp_ListDirectPlayGames_fp)(); dp_ListDirectPlayGames_fp DLLdp_ListDirectPlayGames; typedef int (*dp_InitDirectPlay_fp)(char *conn_name, void *parms,int num_elements); dp_InitDirectPlay_fp DLLdp_InitDirectPlay; typedef int (*dp_GetModemChoices_fp)(char *buffer,unsigned long *size); dp_GetModemChoices_fp DLLdp_GetModemChoices; #endif //Given a filename, pointer to a char * array and a pointer to an int, //it will load the string table and fill in the information //returns true on success typedef bool (*CreateStringTable_fp)(char *filename,char ***table,int *size); CreateStringTable_fp DLLCreateStringTable; //Given a string table and it's count of strings, it will free up it's memory typedef void (*DestroyStringTable_fp)(char **table,int size); DestroyStringTable_fp DLLDestroyStringTable; typedef void (*DatabaseReadInt_fp)(const char *label, int *val); DatabaseReadInt_fp DLLDatabaseReadInt; typedef void (*DatabaseWriteInt_fp)(const char *label, int val); DatabaseWriteInt_fp DLLDatabaseWriteInt; typedef void (*DoScreenshot_fp) (); DoScreenshot_fp DLLDoScreenshot; typedef bool (*IsMissionMultiPlayable_fp) (char *mission); IsMissionMultiPlayable_fp DLLIsMissionMultiPlayable; // returns width of text in current font. typedef int (*grtext_GetTextLineWidth_fp) (const char *str); grtext_GetTextLineWidth_fp DLLgrtext_GetTextLineWidth; typedef void (*GadgetDestroy_fp) (void *item); GadgetDestroy_fp DLLGadgetDestroy; #ifdef WIN32 typedef int (*dp_StartGame_fp) (char *gamename); dp_StartGame_fp DLLdp_StartGame; typedef void (*dp_EndGame_fp)(); dp_EndGame_fp DLLdp_EndGame; #endif typedef int (*nw_Asyncgethostbyname_fp) (unsigned int *ip,int command, char *hostname); nw_Asyncgethostbyname_fp DLLnw_Asyncgethostbyname; typedef int (*nw_ReccomendPPS_fp) (); nw_ReccomendPPS_fp DLLnw_ReccomendPPS; typedef void (*DoMultiAllowed_fp) (void); DoMultiAllowed_fp DLLDoMultiAllowed; typedef void (*MultiDoConfigSave_fp) (void); MultiDoConfigSave_fp DLLMultiDoConfigSave; typedef void (*MultiDoConfigLoad_fp) (void); MultiDoConfigLoad_fp DLLMultiDoConfigLoad; typedef int (*MultiLoadSettings_fp) (char *filename); MultiLoadSettings_fp DLLMultiLoadSettings; typedef void * ( * NetworkReceiveCallback ) (ubyte *data,int len, network_address *from); typedef int (*nw_RegisterCallback_fp) (void * nfp, ubyte id); nw_RegisterCallback_fp DLLnw_RegisterCallback; typedef NetworkReceiveCallback (*nw_UnRegisterCallback_fp) (ubyte id); nw_UnRegisterCallback_fp DLLnw_UnRegisterCallback; typedef int (*nw_SendWithID_fp) (ubyte id,ubyte *data,int len,network_address *who_to); nw_SendWithID_fp DLLnw_SendWithID; typedef int (*nw_DoReceiveCallbacks_fp)(void); nw_DoReceiveCallbacks_fp DLLnw_DoReceiveCallbacks; typedef int (*msn_CheckGetMission_fp)(network_address *net_addr,char *filename); msn_CheckGetMission_fp DLLmsn_CheckGetMission; typedef void (*MultiGameOptionsMenu_fp) (int alloptions); MultiGameOptionsMenu_fp DLLMultiGameOptionsMenu; //Loads a dynamic module into memory for use. //Returns true on success, false otherwise //typedef bool (*mod_LoadModule_fp)(module *handle,char *modfilename,int flags=MODF_NOW); typedef bool (*mod_LoadModule_fp)(module *handle,char *modfilename,int flags); mod_LoadModule_fp DLLmod_LoadModule; //Frees a previously loaded module from memory, it can no longer be used //Returns true on success, false otherwise typedef bool (*mod_FreeModule_fp)(module *handle); mod_FreeModule_fp DLLmod_FreeModule; //Returns a pointer to a function within a loaded module. If it returns NULL there was an error. Check mod_GetLastError //to see if there was an error //symstr is the name of the function you want to get the symbol for (Do NOT give any pre/suffix to this name) //parmbytes is the size (in bytes) of the parameter list the function should have typedef MODPROCADDRESS (*mod_GetSymbol_fp)(module *handle,char *symstr,unsigned char parmbytes); mod_GetSymbol_fp DLLmod_GetSymbol; //Returns an error code to what the last error was. When this function is called the last error is cleared, so by calling //this function it not only returns the last error, but it removes it, so if you were to call this function again, it would //return no error typedef int (*mod_GetLastError_fp)(void); mod_GetLastError_fp DLLmod_GetLastError; // "Current Pilot" name access function typedef void (*CurrentPilotName_fp)(char *buffer); CurrentPilotName_fp CurrentPilotName; typedef void (*UpdateAndPackGameList_fp) (void); UpdateAndPackGameList_fp DLLUpdateAndPackGameList; typedef int (*MultiLevelSelection_fp) (void); MultiLevelSelection_fp DLLMultiLevelSelection; typedef bool (*DoPlayerMouselookCheck_fp) (unsigned int flags); DoPlayerMouselookCheck_fp DLLDoPlayerMouselookCheck; typedef int (*CheckMissionForScript_fp) (char *mission,char *script,int dedicated_server_num_teams); CheckMissionForScript_fp DLLCheckMissionForScript; typedef void (*ShowNetgameInfo_fp) (network_game *game); ShowNetgameInfo_fp DLLShowNetgameInfo; typedef int (*CheckGetD3M_fp)(char *d3m); CheckGetD3M_fp DLLCheckGetD3M; int DLLUIClass_CurrID = 0xD0; #define MAX_NET_GAMES 100 #define JEFF_RED GR_RGB(255,40,40) #define JEFF_BLUE GR_RGB(40,40,255) #define JEFF_GREEN GR_RGB(40,255,40) #define NETPOLLINTERVAL 10.0 extern int MTAVersionCheck(unsigned int oldver, char *URL); #define LOGIN_LEN 33 #define REAL_NAME_LEN 66 #define PASSWORD_LEN 17 #define EMAIL_LEN 100 #define TRACKER_ID_LEN 10 #define PILOT_NAME_LEN 20 #ifdef WIN32 #pragma pack(push,pxo) #endif #pragma pack(1) typedef struct vmt_descent3_struct { char tracker_id[TRACKER_ID_LEN]; char pilot_name[PILOT_NAME_LEN]; int rank; int kills; int deaths; int suicides; int online_time; int games_played; unsigned int security; unsigned char virgin_pilot; //This pilot was just created if TRUE unsigned int lateral_thrust; unsigned int rotational_thrust; unsigned int sliding_pct; //Percentage of the time you were sliding unsigned long checksum; //This value needs to be equal to whatever the checksum is once the packet is decoded unsigned long pad; //just to provide room for out 4 byte encryption boundry only needed on the client side for now } vmt_descent3_struct; #define DESCENT3_BLOCK_SIZE (sizeof(vmt_descent3_struct)-4) #ifdef WIN32 #pragma pack(pop,pxo) #else #pragma pack() #endif ///////////////////////////// // Defines #ifndef RELEASE #define DLLmprintf(args) DLLDebug_ConsolePrintf args #else #define DLLmprintf(args) #endif unsigned int MTClientVer = 100; char MTUpdateURL[300] = ""; multi_api API; player *DLLMPlayers; ship *DLLShips; vmt_descent3_struct *DLLMTPilotinfo; int DLLPlayer_num; int *DLLGame_is_master_tracker_game; int DLLGame_mode; char *DLLTracker_id; int *DLLNum_directplay_games; netgame_info *DLLNetgame; char *DLLLocalD3Dir; int *DLLMultiGameStarting; netplayer *DLLMNetPlayers; int MTWritingPilot,MTReadingPilot; int UnvalidatedDLL = 0; int *DLLNum_network_games_known; bool *DLLDedicated_server; network_game *DLLNetwork_games; int MT_Initialized = 0; ubyte *DLLNewUIWindow_alpha; float LastTrackerDataUpdate; void * pconsole = NULL; bool * DLLDP_active; bool * DLLUse_DirectPlay; bool * DLLMulti_Gamelist_changed; bool * DLLSupports_score_api; //bool * DLLMulti_no_stats_saved; unsigned short DLLnw_ListenPort; char szloginid[LOGIN_LEN] = ""; char sztrackerid[TRACKER_ID_LEN] = ""; char szpassword[PASSWORD_LEN] = ""; char *DLLHelpText1; char *DLLHelpText2; char *DLLHelpText3; char *DLLHelpText4; char *DLLPXO_hosted_lobby_name = NULL; #define DLLMAX_SHIPS 30 #define PARENT0 0 #define PARENT1 1 #define PARENT2 2 #define PARENT3 3 #define PARENT4 4 char *DLLAuto_login_name; char *DLLAuto_login_pass; char *DLLAuto_login_addr; char *DLLAuto_login_port; bool Use_netgame_flags; module MTAVDLLHandle={NULL}; #if defined(WIN32) typedef void( DLLFUNCCALL DLLAVInit_fp) (int *ptr); typedef void( DLLFUNCCALL DLLAVCall_fp) (int eventnum); typedef void( DLLFUNCCALL DLLAVClose_fp) (); typedef void( DLLFUNCCALL DLLAVGetVersion_fp) (int *version); typedef void( DLLFUNCCALL DLLRunCheck_fp) (char *d3_path); #elif defined(__LINUX__) typedef void DLLFUNCCALL (DLLAVInit_fp) (int *ptr); typedef void DLLFUNCCALL (DLLAVCall_fp) (int eventnum); typedef void DLLFUNCCALL (DLLAVClose_fp) (); typedef void DLLFUNCCALL (DLLAVGetVersion_fp) (int *version); typedef void DLLFUNCCALL (DLLRunCheck_fp) (char *d3_path); #endif #ifndef MACINTOSH DLLAVInit_fp *DLLAVInit = NULL; DLLAVCall_fp *DLLAVCall = NULL; DLLAVClose_fp *DLLAVClose = NULL; DLLAVGetVersion_fp *DLLAVGetVersion = NULL; DLLRunCheck_fp *DLLRunCheck = NULL; #endif typedef struct _msn_list { char msn_name[_MAX_PATH]; char msn_file[_MAX_PATH]; void *ti; struct _msn_list *next; }msn_list; _msn_list *FirstMsn,*CurrMsn,*TmpMsn; #ifdef WIN32 #include "directplay.h" modem_list *DLLModems_found; int *DLLNum_modems_found; LPDPSESSIONDESC2 DLLDirectplay_sessions; #endif BOOL DLLTCP_active; BOOL DLLIPX_active; void AddMsnItem(_msn_list *new_msn) { CurrMsn = FirstMsn; if(CurrMsn) { while(CurrMsn->next) { CurrMsn = CurrMsn->next; } CurrMsn->next = new_msn; CurrMsn = CurrMsn->next; } else { FirstMsn = new_msn; CurrMsn = FirstMsn; } CurrMsn->next = NULL; } void RemoveAllMsnItems(void) { CurrMsn = FirstMsn; if(CurrMsn) { while(CurrMsn->next) { TmpMsn = CurrMsn; DLLRemoveUITextItem(CurrMsn->ti); CurrMsn = CurrMsn->next; DLLmem_free(TmpMsn); } DLLRemoveUITextItem(CurrMsn->ti); DLLmem_free(CurrMsn); } FirstMsn = NULL; } _msn_list * FindMsnItem(char *name) { CurrMsn = FirstMsn; if(CurrMsn) { while(CurrMsn->next) { if(strcmp(CurrMsn->msn_name,name)==0) return CurrMsn; CurrMsn = CurrMsn->next; } if(strcmp(CurrMsn->msn_name,name)==0) return CurrMsn; } return NULL; } void MultiplayerOptionsMenu (); // Draws a menu that inputs multiplayer game options // Returns true if we are starting a game #define MAX_DLLS 40 char dll_text[MAX_DLLS][_MAX_PATH]; int StartMultiplayerGameMenu () { void * game_name_text = DLLCreateNewUITextItem(TXT(10), UICOL_TEXT_NORMAL,-1);//TXT_LC_GAMENAME void * mission_name_text = DLLCreateNewUITextItem(TXT(11), UICOL_TEXT_NORMAL,-1);//TXT_LC_MSNNAME void * script_name_text = DLLCreateNewUITextItem(TXT(12), UICOL_TEXT_NORMAL,-1);//TXT_LC_SCRIPTNAME void * start_game_on_text = DLLCreateNewUITextItem(TXT(13), UICOL_HOTSPOT_HI,-1);//TXT_LC_STARTGAME void * multiplayer_opts_on_text = DLLCreateNewUITextItem(TXT(14), UICOL_HOTSPOT_HI,-1);//TXT_LC_MPLYROPTIONS void * exit_on_text = DLLCreateNewUITextItem(TXT(5), UICOL_HOTSPOT_HI,-1);//TXT_LC_PREVMENU void * start_game_off_text = DLLCreateNewUITextItem(TXT(13), UICOL_HOTSPOT_LO,-1);//TXT_LC_STARTGAME void * multiplayer_opts_off_text = DLLCreateNewUITextItem(TXT(14), UICOL_HOTSPOT_LO,-1);//TXT_LC_MPLYROPTIONS void * exit_off_text = DLLCreateNewUITextItem(TXT(5), UICOL_HOTSPOT_LO,-1);//TXT_LC_PREVMENU void * save_settings_txt_on = DLLCreateNewUITextItem(TXT_DLL_SAVESETTINGS, UICOL_HOTSPOT_HI,-1); void * save_settings_txt_off = DLLCreateNewUITextItem(TXT_DLL_SAVESETTINGS, UICOL_HOTSPOT_LO,-1); void * load_settings_txt_on = DLLCreateNewUITextItem(TXT_DLL_LOADSETTINGS, UICOL_HOTSPOT_HI,-1); void * load_settings_txt_off = DLLCreateNewUITextItem(TXT_DLL_LOADSETTINGS, UICOL_HOTSPOT_LO,-1); void * start_text = DLLCreateNewUITextItem(TXT(13), UICOL_WINDOW_TITLE,DLL_BIG_BRIEFING_FONT); void * blank_text = DLLCreateNewUITextItem("",GR_BLACK,-1); void * dll_txt_items[MAX_DLLS]; int a; for(a=0;amsn_name,DLLGetMissionName(buffer)); strcpy(mi->msn_file,buffer); mi->ti = DLLCreateNewUITextItem(mi->msn_name,UICOL_LISTBOX_LO,-1); AddMsnItem(mi); DLLListAddItem(list_1,mi->ti); } while(DLLddio_FindNextFile(buffer)) { if(DLLIsMissionMultiPlayable(buffer)) { DLLmprintf((0,"Found a mission: %s\n",buffer)); mi = (_msn_list *)DLLmem_malloc(sizeof(msn_list)); strcpy(mi->msn_name,DLLGetMissionName(buffer)); strcpy(mi->msn_file,buffer); mi->ti = DLLCreateNewUITextItem(mi->msn_name,UICOL_LISTBOX_LO,-1); AddMsnItem(mi); DLLListAddItem(list_1,mi->ti); } } } DLLddio_FindFileClose(); //char mn3_path[_MAX_PATH*2]; DLLddio_MakePath(search,DLLLocalD3Dir,"missions","*.mn3",NULL); //DLLmprintf((0,search)); if(DLLddio_FindFileStart(search,buffer)) { //DLLddio_MakePath(mn3_path,DLLLocalD3Dir,"missions",buffer,NULL); if(DLLIsMissionMultiPlayable(buffer) && (strcmpi("d3_2.mn3",buffer)!=0)) { DLLmprintf((0,"Found a mission: %s\n",buffer)); mi = (_msn_list *)DLLmem_malloc(sizeof(msn_list)); strcpy(mi->msn_name,DLLGetMissionName(buffer)); strcpy(mi->msn_file,buffer); mi->ti = DLLCreateNewUITextItem(mi->msn_name,UICOL_LISTBOX_LO,-1); AddMsnItem(mi); DLLListAddItem(list_1,mi->ti); } while(DLLddio_FindNextFile(buffer)) { if(strcmpi("d3_2.mn3",buffer)==0) continue; //DLLddio_MakePath(mn3_path,DLLLocalD3Dir,"missions",buffer,NULL); if(DLLIsMissionMultiPlayable(buffer)) { DLLmprintf((0,"Found a mission: %s\n",buffer)); mi = (_msn_list *)DLLmem_malloc(sizeof(msn_list)); strcpy(mi->msn_name,DLLGetMissionName(buffer)); strcpy(mi->msn_file,buffer); mi->ti = DLLCreateNewUITextItem(mi->msn_name,UICOL_LISTBOX_LO,-1); AddMsnItem(mi); DLLListAddItem(list_1,mi->ti); } } } DLLddio_FindFileClose(); #ifdef RELEASE //TODO: Make sure the main mission is always listed -- even on a minimal install if(!FindMsnItem("Descent 3: Retribution")) { mi = (_msn_list *)DLLmem_malloc(sizeof(msn_list)); strcpy(mi->msn_name,"Descent 3: Retribution"); strcpy(mi->msn_file,"d3.mn3"); AddMsnItem(mi); mi->ti = DLLCreateNewUITextItem(mi->msn_name,UICOL_LISTBOX_LO); DLLListAddItem(list_1,mi->ti); } #endif char *p; #else void * msn_single_ti = DLLCreateNewUITextItem("Polaris",UICOL_LISTBOX_LO); void * msn_multi_ti = DLLCreateNewUITextItem("The Core",UICOL_LISTBOX_LO); void * msn_multi_2 = DLLCreateNewUITextItem("Taurus",UICOL_LISTBOX_LO); DLLListAddItem(list_1,msn_single_ti); DLLListAddItem(list_1,msn_multi_ti); DLLListAddItem(list_1,msn_multi_2); #endif // Bash some values to default char pilot_name[PILOT_STRING_SIZE]; CurrentPilotName(pilot_name); strcpy (DLLMPlayers[DLLPlayer_num].callsign,pilot_name); sprintf (str,"%s's Game",DLLMPlayers[DLLPlayer_num].callsign); DLLEditSetText(mission_name_edit,str); DLLNetgame->max_players = 8; DLLNetgame->packets_per_second=DLLnw_ReccomendPPS(); DLLNetgame->respawn_time=60; DLLNetgame->difficulty=2; DLLNetgame->flags=NF_RANDOMIZE_RESPAWN; DLLNewUIWindowLoadBackgroundImage(main_wnd,"multimain.ogf"); DLLNewUIWindowOpen(main_wnd); char dftset[_MAX_PATH*2]; DLLddio_MakePath(dftset,DLLLocalD3Dir,"custom","settings","default.mps",NULL); if(DLLMultiLoadSettings(dftset)) { DLLEditSetText(mission_name_edit,DLLNetgame->name); #if (!(defined(OEM) || defined(DEMO))) p = DLLGetMissionName(DLLNetgame->mission); mi = FindMsnItem(p); if(mi) DLLListSelectItem(list_1,mi->ti); #endif for(index=0;indexscriptname)==0) { DLLListSelectItem(script_list,dll_txt_items[index]); break; } } } while (!exit_menu) { int res; res = DLLDoUI(); // handle all UI results. if (res==option_button) { DLLNewUIWindowClose(main_wnd); MultiplayerOptionsMenu(); DLLNewUIWindowOpen(main_wnd); } else if (res==start_button) { // Get Game name DLLEditGetText(mission_name_edit,DLLNetgame->name,NETGAME_NAME_LEN); // Get mission name #if (!(defined(OEM) || defined(DEMO))) mi = FindMsnItem(DLLListGetItem(list_1,DLLListGetSelectedIndex(list_1))); if(!mi) break; strncpy(DLLNetgame->mission,mi->msn_file,MSN_NAMELEN); DLLNetgame->mission[MSN_NAMELEN] = '\0'; strncpy(DLLNetgame->mission_name,mi->msn_name,MISSION_NAME_LEN); DLLNetgame->mission_name[MISSION_NAME_LEN] = '\0'; #else //strcpy(DLLNetgame->mission,DLLListGetSelectedIndex(list_1)?"thecore.d3l":"polaris.d3l"); switch(DLLListGetSelectedIndex(list_1)) { case 0: strcpy(DLLNetgame->mission,"polaris.d3l"); strncpy(DLLNetgame->mission_name,"Polaris",MISSION_NAME_LEN); break; case 1: strcpy(DLLNetgame->mission,"thecore.d3l"); strncpy(DLLNetgame->mission_name,"The Core",MISSION_NAME_LEN); break; case 2: strcpy(DLLNetgame->mission,"taurus.d3l"); strncpy(DLLNetgame->mission_name,"Taurus",MISSION_NAME_LEN); break; default:; } //strcpy(DLLNetgame->name,DLLListGetSelectedIndex(list_1)?"The Core":"Polaris"); #endif // Get script strcpy(buffer,DLLListGetItem(script_list,DLLListGetSelectedIndex(script_list))); if(strcmp(buffer,"None")) { //remove file extension for(int d=strlen(buffer)-1;d>=0;d--) { if(buffer[d]=='.') { buffer[d]='\0'; break; } } #if (defined(OEM) || defined(DEMO)) if(!stricmp(buffer,"Capture The Flag")) strcpy(buffer,"CTF"); #endif strcpy(DLLNetgame->scriptname,buffer); } // Actually start the game //DAJ commen out next line if problems int teams = DLLCheckMissionForScript(DLLNetgame->mission,DLLNetgame->scriptname,0); // int teams = 1; if(teams>=0) #if (!(defined(OEM) || defined(DEMO))) { if (DLLLoadMission (DLLNetgame->mission)) #else { if (DLLLoadMission (DLLNetgame->mission)) #endif { //Do warp dialog here if needed if(-1!=DLLMultiLevelSelection()) { DLLmprintf ((0,"Mission loaded successfully!\n")); DLLMultiStartServer(1,DLLNetgame->scriptname,teams); exit_menu=1; ret=1; } } } } else if (res==cancel_button) { exit_menu=1; } else if(res==save_button) { // Get Game name DLLEditGetText(mission_name_edit,DLLNetgame->name,NETGAME_NAME_LEN); #if (!(defined(OEM) || defined(DEMO))) // Get mission name mi = FindMsnItem(DLLListGetItem(list_1,DLLListGetSelectedIndex(list_1))); if(!mi) break; strcpy(DLLNetgame->mission,mi->msn_file); #endif // Get script strcpy(buffer,DLLListGetItem(script_list,DLLListGetSelectedIndex(script_list))); if(strcmp(buffer,"None")) { //remove file extension for(int d=strlen(buffer)-1;d>=0;d--) { if(buffer[d]=='.') { buffer[d]='\0'; break; } } strcpy(DLLNetgame->scriptname,buffer); } DLLMultiDoConfigSave(); } else if(res==load_button) { // Get Game name DLLEditGetText(mission_name_edit,DLLNetgame->name,NETGAME_NAME_LEN); #if (!(defined(OEM) || defined(DEMO))) // Get mission name mi = FindMsnItem(DLLListGetItem(list_1,DLLListGetSelectedIndex(list_1))); if(!mi) break; strcpy(DLLNetgame->mission,mi->msn_file); #endif // Get script strcpy(buffer,DLLListGetItem(script_list,DLLListGetSelectedIndex(script_list))); if(strcmp(buffer,"None")) { //remove file extension for(int d=strlen(buffer)-1;d>=0;d--) { if(buffer[d]=='.') { buffer[d]='\0'; break; } } strcpy(DLLNetgame->scriptname,buffer); } DLLMultiDoConfigLoad(); if(!Use_netgame_flags) { DLLNetgame->flags=0; } DLLEditSetText(mission_name_edit,DLLNetgame->name); #if (!(defined(OEM) || defined(DEMO))) p = DLLGetMissionName(DLLNetgame->mission); mi = FindMsnItem(p); if(mi) DLLListSelectItem(list_1,mi->ti); #endif for(index=0;indexscriptname)==0) { DLLListSelectItem(script_list,dll_txt_items[index]); break; } } } } DLLNewUIWindowClose(main_wnd); DLLNewUIWindowDestroy(main_wnd); for(a=0;a