mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
1398 lines
41 KiB
C
1398 lines
41 KiB
C
|
|
/*
|
|
* $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 <string.h>
|
|
#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;a<MAX_DLLS;a++) dll_txt_items[a] = NULL;
|
|
char str[100];
|
|
int exit_menu=0;
|
|
int cury=40;
|
|
int ret=0;
|
|
int dllcount=0;
|
|
int id=100;
|
|
|
|
rendering_state rs;
|
|
DLLrend_GetRenderState (&rs);
|
|
|
|
void * main_wnd = DLLNewUIWindowCreate(0,0,rs.screen_width,rs.screen_height,UIF_PROCESS_ALL);
|
|
|
|
void * start_title = DLLTextCreate(main_wnd,start_text,0,cury,UIF_CENTER); cury+=35;
|
|
|
|
// Mission name
|
|
void * mission_text = DLLTextCreate(main_wnd,game_name_text,0,cury,UIF_CENTER); cury+=15;
|
|
void * mission_name_edit = DLLEditCreate(main_wnd,id++,10,cury,300,15,UIF_CENTER); cury+=18;
|
|
cury+=30;
|
|
|
|
// mission name
|
|
void * game_name = DLLTextCreate(main_wnd,mission_name_text,45,cury,0); cury+=15;
|
|
|
|
void * list_1 = DLLListCreate(main_wnd,id++,40,cury,200,100,0);
|
|
|
|
//Back up the the same line!
|
|
cury -= 15;
|
|
|
|
// Script box
|
|
void * script_name = DLLTextCreate(main_wnd,script_name_text,370,cury,0); cury+=18;
|
|
void * script_list = DLLListCreate(main_wnd,id++,360,cury,200,100,0); cury+=118;
|
|
cury+=40;
|
|
|
|
// Start button
|
|
int start_button=UID_OK;
|
|
void * start_hs = DLLHotSpotCreate(main_wnd,UID_OK,KEY_ENTER,start_game_off_text,start_game_on_text, 10,cury, 180, 30,UIF_FIT|UIF_CENTER); cury+=18;
|
|
|
|
// Option button
|
|
int option_button=id;
|
|
void * option_hs = DLLHotSpotCreate(main_wnd,id++,KEY_O,multiplayer_opts_off_text,multiplayer_opts_on_text, 10,cury, 180, 30,UIF_FIT|UIF_CENTER); cury+=18;
|
|
|
|
// cancel button
|
|
|
|
int save_button = id;
|
|
void * save_hs = DLLHotSpotCreate(main_wnd,id++,0,save_settings_txt_off,save_settings_txt_on, 10,cury, 180, 30,UIF_FIT|UIF_CENTER); cury+=18;
|
|
int load_button = id;
|
|
void * load_hs = DLLHotSpotCreate(main_wnd,id++,0,load_settings_txt_off,load_settings_txt_on, 10,cury, 180, 30,UIF_FIT|UIF_CENTER);cury+=18;
|
|
|
|
int cancel_button=UID_CANCEL;
|
|
void * cancel_hs = DLLHotSpotCreate(main_wnd,UID_CANCEL,KEY_ESC,exit_off_text,exit_on_text, 10,cury, 180, 30,UIF_FIT|UIF_CENTER);
|
|
//put the multiplayer dll's into the listbox
|
|
dllcount=1;
|
|
char buffer[_MAX_PATH];
|
|
|
|
#if (!(defined(OEM) || defined(DEMO)))
|
|
char search[256];
|
|
DLLddio_MakePath(search,DLLLocalD3Dir,"netgames","*.d3m",NULL);
|
|
if(DLLddio_FindFileStart(search,buffer))
|
|
{
|
|
dllcount = 1;
|
|
buffer[strlen(buffer)-4] = '\0';//Strip out the extention
|
|
strcpy(dll_text[dllcount-1],buffer);
|
|
while( (DLLddio_FindNextFile(buffer)) && (dllcount<MAX_DLLS) )
|
|
{
|
|
buffer[strlen(buffer)-4] = '\0';//Strip out the extention
|
|
strcpy(dll_text[dllcount],buffer);
|
|
dllcount++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dllcount = 0;
|
|
}
|
|
DLLddio_FindFileClose();
|
|
#else
|
|
strcpy(dll_text[0],"Anarchy");
|
|
strcpy(dll_text[1],"Capture The Flag");
|
|
dllcount = 2;
|
|
#endif
|
|
DLLListRemoveAll(script_list);
|
|
|
|
int index;
|
|
|
|
for(index=0;index<dllcount;index++)
|
|
{
|
|
dll_txt_items[index] = DLLCreateNewUITextItem(dll_text[index],UICOL_LISTBOX_LO,-1);
|
|
DLLListAddItem(script_list,dll_txt_items[index]);
|
|
|
|
}
|
|
#if (!(defined(OEM) || defined(DEMO)))
|
|
_msn_list *mi;
|
|
|
|
DLLddio_MakePath(search,DLLLocalD3Dir,"data","levels","*.msn",NULL);
|
|
//DLLmprintf((0,search));
|
|
if(DLLddio_FindFileStart(search,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);
|
|
}
|
|
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;index<dllcount;index++)
|
|
{
|
|
if(stricmp(dll_text[index],DLLNetgame->scriptname)==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;index<dllcount;index++)
|
|
{
|
|
if(strcmpi(dll_text[index],DLLNetgame->scriptname)==0)
|
|
{
|
|
DLLListSelectItem(script_list,dll_txt_items[index]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
DLLNewUIWindowClose(main_wnd);
|
|
DLLNewUIWindowDestroy(main_wnd);
|
|
for(a=0;a<MAX_DLLS;a++) if(dll_txt_items[a]) DLLRemoveUITextItem(dll_txt_items[a]);
|
|
RemoveAllMsnItems();
|
|
//cleanup
|
|
#ifdef DEMO
|
|
DLLRemoveUITextItem(msn_multi_ti);
|
|
DLLRemoveUITextItem(msn_single_ti);
|
|
DLLRemoveUITextItem(msn_multi_2);
|
|
#endif
|
|
DLLRemoveUITextItem(game_name_text);
|
|
DLLRemoveUITextItem(mission_name_text);
|
|
DLLRemoveUITextItem(script_name_text);
|
|
DLLRemoveUITextItem(start_game_on_text);
|
|
DLLRemoveUITextItem(multiplayer_opts_on_text);
|
|
DLLRemoveUITextItem(exit_on_text);
|
|
DLLRemoveUITextItem(start_game_off_text);
|
|
DLLRemoveUITextItem(multiplayer_opts_off_text);
|
|
DLLRemoveUITextItem(exit_off_text);
|
|
DLLRemoveUITextItem(blank_text);
|
|
DLLRemoveUITextItem(save_settings_txt_on);
|
|
DLLRemoveUITextItem(save_settings_txt_off);
|
|
DLLRemoveUITextItem(load_settings_txt_on);
|
|
DLLRemoveUITextItem(load_settings_txt_off);
|
|
|
|
DLLRemoveUITextItem(start_text);
|
|
|
|
DLLDeleteUIItem(start_title);
|
|
DLLDeleteUIItem(save_hs);
|
|
DLLDeleteUIItem(load_hs);
|
|
DLLDeleteUIItem(main_wnd);
|
|
DLLDeleteUIItem(game_name);
|
|
DLLDeleteUIItem(list_1);
|
|
DLLDeleteUIItem(mission_text);
|
|
DLLDeleteUIItem(mission_name_edit);
|
|
DLLDeleteUIItem(script_name);
|
|
DLLDeleteUIItem(script_list);
|
|
DLLDeleteUIItem(option_hs);
|
|
DLLDeleteUIItem(start_hs);
|
|
DLLDeleteUIItem(cancel_hs);
|
|
|
|
return ret;
|
|
}
|
|
|
|
void MultiplayerOptionsMenu ()
|
|
{
|
|
#ifndef MULTI_USE_ALL_OPTIONS
|
|
DLLMultiGameOptionsMenu(0);
|
|
#else
|
|
DLLMultiGameOptionsMenu(1);
|
|
#endif
|
|
|
|
}
|