/* * Descent 3 * Copyright (C) 2024 Parallax Software * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * $Logfile: /DescentIII/Main/dmfc/dmfcinternal.h $ * $Revision: 1.1.1.1 $ * $Date: 2003/08/26 03:57:21 $ * $Author: kevinb $ * * Internal DMFC header * * $Log: dmfcinternal.h,v $ * Revision 1.1.1.1 2003/08/26 03:57:21 kevinb * initial 1.5 import * * * 76 9/05/01 6:04p Matt * Added code to save the user's preferred HUD name level setting even if * the server bashes it down. * * 75 9/28/99 10:55a Jeff * changed size of pointer for mastertracker game from ubyte* to int* * * 74 8/21/99 12:32a Jeff * Changed the name of the GetRealGametime function to * GetRealGametimePacket since it was confusing some compilers with the * other GetRealGametime function. * * 73 8/15/99 4:36p Jeff * finished exporting all inventory class functions. export object_info * array. added check for -nooutragelogo to display Outrage logo display. * * 72 8/11/99 1:47p Jeff * interface functions * * 71 7/16/99 2:43p Jeff * changed CreateMenuItemWArgs function * * 70 7/14/99 11:47a Jeff * localized text for patch fixes * * 69 7/13/99 10:05a Jeff * text taunt token decoding * * 68 7/11/99 3:31p Jeff * exported game arguments, made command line option to specify * autoexec.dmfc * * 67 7/09/99 7:02p Jeff * put in countdown timer for when a level is about to end * * 66 7/09/99 6:18p Jeff * added $remoteadminlogout and $wait commands * * 65 7/09/99 2:54p Jeff * handle gametime better (pause it when needed) if the server is 'waiting * for players' * * 64 7/08/99 9:55p Jeff * added event handler for weapon fired event * * 63 7/08/99 6:25p Jeff * remote admin in and working * * 62 7/08/99 2:39a Jeff * rough implementation of remote administration checked in. Still needs * some polishing, but should work basically. * * 61 7/07/99 6:10p Jeff * don't count the time that a player is in observer mode for death/kill * messages * * 60 7/07/99 5:00p Jeff * removed vararg functions from interface functions, just made different * versions of them * * 59 7/07/99 12:16p Jeff * all mangles symbol names fixed. Finished making interface functions. * * 58 6/10/99 5:42p Jeff * fixed mprintf define * * 57 6/10/99 11:10a Jeff * don't display the Outrage logo for non-Outrage games * * 56 5/22/99 1:12a Jeff * correctly handle Viewer_object * * 55 5/19/99 11:51p Jeff * set version number for 1.0 for release * * 54 5/13/99 11:46a Jeff * increased version number * * 53 5/12/99 11:04p Jeff * dmfc and multiplayer games now have endian friendly packets (*whew*) * * 52 5/10/99 2:44a Jeff * handle new scheme of player's joining in a team game, where the team is * set before player enters game in the main code, but the team is * determined via event call to dmfc * * 51 5/09/99 6:20a Jeff * improved Entropy (added sounds, max virii per room). Fixed rendering * bugs for other multiplayer dlls. * * 50 5/08/99 11:06a Jeff * * 49 5/07/99 12:52p Jeff * audio taunt icon is ppic if available. coop has hard max team set of 4 * * 48 5/04/99 8:46p Jeff * display icon when someone plays an audio taunt * * 47 4/30/99 10:53p Jeff * added $warp command * * 46 4/30/99 7:36p Jeff * exported vis_effects to dmfc * * 45 4/25/99 7:19p Jeff * added code to handle suicides in pinfo * * 44 4/23/99 6:15p Jeff * fixed double calls to GameClose * * 43 4/19/99 3:54a Jeff * got compiling for Linux * * 42 4/14/99 1:15a Jeff * fixed case mismatched #includes * * 41 4/12/99 11:36a Jeff * added permissable cs string * * 40 4/04/99 4:56p Jeff * added functionality to call osiris functions from multiplayer d3ms * * 39 4/03/99 4:06p Jeff * added loss/ping gauge * * 38 3/30/99 9:01p Jeff * exported polymodels * * 37 3/30/99 7:42p Jeff * fixed a misspelling on a function name * * 36 3/27/99 4:53p Jeff * player rankings in multiplayer games implemented. Fixed join message * so it doesn't get cut off * * 35 3/22/99 6:20p Jeff * added 2 more audio taunts. a mulitplayer event when someone plays an * audio taunt. option to disable audio taunts. * * 34 3/22/99 1:55p Jeff * make sure initialization happens (possible crashing) * * 33 3/17/99 12:24p Jeff * converted DMFC to be COM interface * * 32 1/19/99 3:55a Jeff * all strings localized out * * 31 1/18/99 7:27p Jeff * localized strings in dmfcbase.cpp * * 30 1/10/99 7:41p Jeff * added initial version of waitforplayers dialog * * 29 1/04/99 12:21p Jeff * added support for hosts.allow/deny and updates stats manager a little * * 28 12/08/98 12:17p Jeff * various changes that include an improved Team Control dialog (doesn't * switch teams until exit..) and spew/respawn players that change teams * * 27 11/19/98 5:56p Jeff * added slider exported and improved Hoard * * 26 11/17/98 6:29p Jeff * mod can specify whether or not to display the team setup dialog on team * game start. Added a menu item to display team setup dialog in mid-game * * 25 11/16/98 5:35p Jeff * removed log functions, added support for changing team names, fixed ctf * to work better with different team names * * 24 11/11/98 7:19p Jeff * changed version number * * 23 11/11/98 7:19p Jeff * changes made so that a dedicated server's team is always -1 (team game * or not) * * 22 10/29/98 7:01p Jeff * creation of team placement dialog. Moved TranslateEvent into DMFC * * 21 10/20/98 4:35p Jeff * added a flag for menu to add a to MIT_PLIST... * * 20 10/20/98 12:16p Jeff * added death message filter, hud callsign filter * * 19 10/18/98 7:59p Jeff * functions added to dmfc for client->server objnum matching. Banning * now uses tracker id when available. * * 18 10/15/98 1:34p Jeff * added scrollable onscreen menu. Remove ban in dmfc. prejoin event * * 17 10/08/98 3:37p Jeff * general improvements (Netgame info things, save to registry). Changes * so it would send packets on NETSEQ_OBJECTS * * 16 10/05/98 2:50p Jeff * * 15 9/30/98 3:50p Jeff * general improvements (many) * * 14 9/29/98 3:04p Jeff * added time in game and start_time support * * 13 9/28/98 5:05p Jeff * made the statisitical death messages an option in the menu * * 12 9/24/98 5:52p Jeff * starting adding statistical death messages, checked in for testing * * 11 9/21/98 7:11p Jeff * made InputCommand interface API and moved existing input commands to * the interface. Changed mprintf/ASSERT so they are valid in DMFC * * $NoKeywords: $ */ #ifndef __DMFC_INTERNAL_H #define __DMFC_INTERNAL_H #include #include #include #include "idmfc.h" #include "DMFC.h" #include "gamedll_header.h" #include "DMFCKeyCodes.h" #define DMFC_VERSION_MAJOR 1 #define DMFC_VERSION_MINOR 0 // DEMO 1.0 // #define DMFC_VERSION_MAJOR 0 // #define DMFC_VERSION_MINOR 60 class DMFCBase; #ifdef mprintf // undefine mprintf and redirect it to use DLLmprintf #undef mprintf #endif #define mprintf DLLmprintf #define MAX_DBNAME_SIZE 32 #define MAX_DBLABEL_SIZE 128 // DMFC Control Messages #define CM_KICKED 0xFF // tell the player he is kicked #define CM_BANNED 0xFE // tell the player he is banned #define CM_TEAMCHANGEDENIED 0xFD // tell the player change team request denied #define CM_SIGNALSTART 0xFC // tell the player he can start moving #define CM_SIGNALWAIT 0xFB // tell the player to stop moving #define CM_PAUSETIME 0xFA // tell the player to pause gametime #define CM_UNPAUSETIME 0xF9 // tell the player to unpause gametime typedef struct { char *message; // pointer to the actual message bool inuse; // whether the node is being used bool victim_first; // whether the victim is listed first or second in the message } tDeathMsg; typedef struct tSPHandler { void (*func)(ubyte *); // Function handler to handle the packet void (DMFCBase::*DMFCfunc)(ubyte *); tSPHandler *next; // Pointer to next handler int type; ubyte ID; // ID of special packet } tSPHandler; // Struct for Input Command nodes (commands that begin with $) typedef struct tInputCommandNode { char *data; char *desc; tInputCommandNode *next; void (*handler)(const char *); bool allow_remote; } tInputCommandNode; typedef struct tPKillerInfo { ubyte slot; int kills; tPKillerInfo *next; } tPKillerInfo; typedef struct { float last_kill_time; // Game time of the last kill for this player (previous kill) float last_death_time; // Game time of the last time this player was killed (previous death) float kill_time; // time of latest kill float death_time; // time of latest death float observer_time; // time the player entered observer mode (or 0 if not) ushort kills_in_a_row; // Number of kills in a row for this player ushort deaths_in_a_row; // Number of deaths in a row for this player sbyte last_kill_num; // Player record num of last person this player killed sbyte last_death_num; // Player record num of the player that last killed this player char got_revenge; // 1 if revenge has been made on last killer } tPExtraInfo; class PInfo { public: PInfo(int slot); ~PInfo(); tPKillerInfo *GetKillerInfo(int slot); void Update(int slot, tPKillerInfo *amount); tPKillerInfo *GetFirstKiller(void); tPKillerInfo *GetNextKiller(void); void RemoveKiller(int slot); void ResetAll(void); int GetSizeOfData(void); int GetExtraInfoSize(void); void PackData(ubyte *buffer); bool UnpackData(ubyte *buffer, int buffsize); tPExtraInfo *GetExtraInfo(void); void HandleKill(int killer_num); void HandleDeath(int victim_num); void HandleSuicide(void); void EnterObserverMode(void); void ExitObserverMode(void); private: tPKillerInfo *FindKiller(int slot, tPKillerInfo **prev = NULL); tPKillerInfo *CreateKiller(int slot); tPKillerInfo *killer_list; tPKillerInfo *curr; tPExtraInfo extra_info; int m_slot; }; class MenuItem : public IMenuItem { public: MenuItem(); MenuItem(const char *title, char type, ubyte flags, void (*fp)(int), ...); // the last parameters are the state items, which // is an int (the number of states), followed by // an int (the initial state), followed by a // a list of char * to the names of the items // this is required for MIT_STATE type only ~MenuItem(); bool AddSubMenu(IMenuItem *p); bool DetachSubMenu(IMenuItem *p); bool Forward(void); bool Back(void); bool Up(void); bool Down(void); void Execute(void); void Draw(int x, int y, int height, int backgroundbmp, float *ratio = NULL); void SetInputFocus(void); void LoseInputFocus(void); bool GetFocus(void); const char *GetTitle(void); int GetCustomSubMenuCount(void); void CallFunc(int value); bool HasSubMenus(void); char GetType(void); void SetState(int state); bool SetStateItemList(int count, ...); bool SetStateItemListArray(int count, char **array); public: void Delete(void); void *Dynamic_Cast(const char *pszType); void DuplicatePointer(void); void DestroyPointer(void); private: int m_cPtrs; // How many submenus this has int SubMenuCount; // Points to the currently active submenu (-1 if none) int CurrSubMenu; // State of the menu (only for MIT_STATE) int m_iState; // List of player nums according to the submenu index int Pnums[DLLMAX_PLAYERS]; // The array of Submenus IMenuItem **SubMenus; // The title for this Menu char m_sTitle[MAX_STRING_LEN]; // Handler for execute void (*func)(int); // true is this menu currently has input focus bool HasInputFocus; // What type of submenus this has // only if this is set to MIT_NORMAL can it have submenus of its submenus // no submenus are allowed to be added to a MIT_PLIST, as this is automatically handled // no submenus are allowed for MIT_STATEITEM as they are specific ends for a MIT_STATE submenu char m_cType; ubyte m_iFlags; ubyte m_Alpha; bool m_AlphaDir; int m_iTopIndex; bool m_bMoreToScroll, m_bAtBottom; tCustomMenu m_cmInfo; }; typedef struct { bool inuse; void (*handler)(void); void (*onkill)(void); float starttime; float longevity; float nexttime; float intval; } tDMFCTimerInfo; typedef struct { bool inuse; bool victim_first; char *message; } tWeaponKillMsg; typedef struct tBanItem { network_address addr; char callsign[MAX_CALLSIGN_SIZE]; char tracker_id[24]; tBanItem *next; } tBanItem; // This class handles displaying and processing a customizable and detailed stats screen (in-game) class CDmfcStats : public IDmfcStats { public: // constuctor/destructor CDmfcStats(); ~CDmfcStats(); // initialization member function, must be called first bool Initialize(tDmfcStatsInit *init_info); // enables/disables the displaying of the stats screen void Enable(bool enable); // returns the state of the stats manager bool IsEnabled(); // the do-it-all function, call once per frame void DoFrame(); // scrolls the player list down one void ScrollDown(); // scrolls the player list up one void ScrollUp(); // returns true if the player list can scroll down any more bool CanScrollDown(); // returns true if the player list can scroll up any more bool CanScrollUp(); public: void Delete(void); void *Dynamic_Cast(const char *pszType); void DuplicatePointer(void); void DestroyPointer(void); protected: int m_cPtrs; // true if initialized bool m_init; int m_flags; // array of sorted prec numbers int *m_SortedPRecs; // pointer to the max number displayed (if the flag is set) int *m_pMaxNumberDisplayed; // number of players to be displayed for this frame int m_MaxCount; // number of columns for the player lists int m_iPLColCount; // number of columns for the detailed list int m_iDColCount; // information for the player list columns tDmfcStatsColumnInfo *m_PLColInfo; // information for the detailed columns tDmfcStatsColumnInfo *m_DColInfo; // callback for DSCOL_CUSTOM column types for Player list void (*m_PLColCallback)(int precord_num, int column_num, char *buffer, int buffer_size); // callback for DSCOL_CUSTOM column types for detailed void (*m_DColCallback)(int precord_num, int column_num, char *buffer, int buffer_size); // callback for DSCOL_BMP column types for Player list (bitmaps) void (*m_PLColCallbackBMP)(int precord_num, int column_num, int x, int y, int w, int h, ubyte alpha_to_use); // callback for DSCOL_BMP column types for detailed (bitmaps) void (*m_DColCallbackBMP)(int precord_num, int column_num, int x, int y, int w, int h, ubyte alpha_to_use); // callback for team data void (*m_TeamCallback)(int team, char *buffer, int buffer_size); // name of the multiplayer game char *m_GameName; // starting scroll index int m_top_index; // selected index int m_selected_index; // bottom index value int m_bottom_index; // true if the stats is enabled bool m_enabled; // height of the font int m_font_height; // starting y value of player list data int m_y_start_plist; // starting y value of detailed list data int m_y_start_detail; // starting x value of player list data int m_x_start_plist; // starting x value of detailed list data int m_x_start_detail; // selected prec num int m_selected_prec; // translatation index->prec int m_translate[MAX_PLAYER_RECORDS]; // bmp handle to highlight bar int m_highlight_bmp; // bmp handle to window background int m_background_bmp; // what page of who-killed-who stats are we on int m_page_index; // how many items can we fit on the who-killed-who stats int m_can_fit_count; // how long has the current page been displayed float m_page_display_time; // does this guy have multiple pages? bool m_has_multiple_pages; // alpha of the items ubyte m_alpha; float alpha_in_time; // validates all the variables void ValidateInfo(); // renders the stats screen void Render(); // displays in a window the view of the viewer object void DisplayPlayerView(int x, int y, int w, int h, object *viewer); }; typedef struct tHostsNode { unsigned int ip; unsigned int mask; tHostsNode *next; } tHostsNode; // Allow/Deny IP address nodes // DMFCBase class // This is the base class that the DMFCApp class is based off of. This just handles general // functions, and handling default events. extern DMFCBase *basethis; class DMFCBase : public IDMFC { public: DMFCBase(void); ~DMFCBase(void); // ##################Setup and processing functions####################### // DMGFBase::LoadFunctions // // Initializes all the functions for a multiplayer game...must be first thing called void LoadFunctions(int *api_func); // DMFCBase::GameInit // // Sets up all the DLL functions and pointers and preps the class for use. This ABSOLUTLY must be // called, so if you override DMFCApp::GameInit, make sure that you put a call to this somewhere in // the override. void GameInit(int teams); // DMFCBase::GameClose // // Closes up any needed DLL and DMFC tasks. This ABSOLUTLY must be called, so if you override // DMFCApp::GameClose, make sure that you put a call to this somewhere in the override void GameClose(void); // ###################Server Only functions################################ // DMFCBase::OnServerPlayerKilled // // Event handler for when a player gets killed, either by another player or some other way // killer_obj = object pointer to the object that killed the player // victim_pnum = player number of the player that got killed virtual void OnServerPlayerKilled(object *killer_obj, int victim_pnum); // DMFCBase::OnServerPlayerExploded // // Event handler for when a player explodes. Gets called after a EVT_GAMEPLAYERKILLED event. // player_num = player number of the player exploding virtual void OnServerPlayerExploded(int player_num); // DMFCBase::OnServerCollide // // Event handler for when two objects collide. At least one of the two objects is a player or a robot. // Be aware that this event will be called twice per collision, the second time it is called the me and // it objects will be flipped. // me_obj = object pointer to the me object // it_obj = object pointer to the it object virtual void OnServerCollide(object *me_obj, object *it_obj); virtual void OnServerCollide(object *me_obj, object *it_obj, vector *point, vector *normal); // DMFCBase::OnServerPlayerChangeSegment // // Event handler for when a player changes rooms or a "large" terrain cell // (8x8 Terrain block). // player_num = player number of the player who just changed the room/segment // newseg = New room/cell location // oldseg = Old room/cell location virtual void OnServerPlayerChangeSegment(int player_num, int newseg, int oldseg); // DMFCBase::OnServerObjectChangeSegment (Only called if server tells client to execute) // // Event handler for when a player changes rooms or a "large" terrain cell // (8x8 Terrain block). // obj = Object pointer of the object who just changed the room/segment // newseg = New room/cell location // oldseg = Old room/cell location virtual void OnServerObjectChangeSegment(object *obj, int newseg, int oldseg); // DMFCBase::OnServerPlayerEntersGame // // Event handler for when a player enters the game. This will only get called once per // player, it usually gets called right after they connect to the server to start playing. // player_num = player number of the player entering the game virtual void OnServerPlayerEntersGame(int player_num); // DMFCBase::OnServerPlayerDisconnect // // Event handler for when a player disconnects from the server. // player_num = player number of the player that just disconnected virtual void OnServerPlayerDisconnect(int player_num); // DMFCBase::OnServerGameCreated // // Event handler when the server's game first gets started. This will only be called once // while the server is running, and that is when the server first starts up. virtual void OnServerGameCreated(void); // DMFCBase::OnServerLevelChange // // Event handler when the server changes levels. This will get called after a level ends and a server // is starting a new level. virtual void OnServerLevelChange(void); // DMFCBase::OnServerLevelStart // // Event handler for when a multiplayer level is starting up. This will get called right before the level // starts. virtual void OnServerLevelStart(void); // DMFCBase::OnServerLevelEnd // // Event handler for when a multiplayer level is ending. virtual void OnServerLevelEnd(void); // DMFCBase::OnServerObjectShieldsChanged // // Event handler for when an objects shield's change virtual void OnServerObjectShieldsChanged(object *obj, float amount); // DMFCBase::OnServerIsAddressBanned // // Called by the game to determine if the given network address is banned from the game virtual bool OnServerIsAddressBanned(network_address *addr, const char *tracker_id); // DMFCBase::OnServerWallCollide // // Called by the game when their is a collision between an object and a wall virtual void OnServerWallCollide(object *obj, float hitspeed, int hitseg, int hitwall, vector *hitpt, vector *wall_normal, float hit_dot); // DMFCBase::OnServerObjectKilled // // Called when an object is being killed // Not automatically sent to clients (OnClientObjectKilled) // killer might not be valid (NULL) virtual void OnServerObjectKilled(object *obj, object *killer); // DMFCBase::OnServerObjectDestroyed // // Called when an object is about to be deleted // Not automatically sent to clients virtual void OnServerObjectDestroyed(object *obj); // ######################### Client allowed event handlers############################ // DMFCBase::OnClientPlayerKilled (Only called if server tells client to execute) // // Event handler for when a player gets killed, either by another player or some other way. // killer_obj = object pointer to the object that killed the player // victim_pnum = player number of the player that got killed virtual void OnClientPlayerKilled(object *killer_obj, int victim_pnum); // DMFCBase::OnClientPlayerExploded (Only called if server tells client to execute) // // Event handler for when a player explodes. Gets called after a EVT_GAMEPLAYERKILLED event. // player_num = player number of the player exploding virtual void OnClientPlayerExploded(int player_num); // DMFCBase::OnClientCollide (Only called if server tells client to execute) // // Event handler for when two objects collide. At least one of the two objects is a player or a robot. // Be aware that this event will be called twice per collision, the second time it is called the me and // it objects will be flipped. // ALSO NOTE: In order for the OnClientCollide() that passes the point and normal to have valid values // the server must pass true to the parameter to send arguments in CallClientEvent(). // me_obj = object pointer to the me object // it_obj = object pointer to the it object virtual void OnClientCollide(object *me_obj, object *it_obj); virtual void OnClientCollide(object *me_obj, object *it_obj, vector *point, vector *normal); // DMFCBase::OnClientPlayerChangeSegment (Only called if server tells client to execute) // // Event handler for when a player changes rooms or a "large" terrain cell // (8x8 Terrain block). // player_num = player number of the player who just changed the room/segment // newseg = New room/cell location // oldseg = Old room/cell location virtual void OnClientPlayerChangeSegment(int player_num, int newseg, int oldseg); // DMFCBase::OnClientObjectChangeSegment (Only called if server tells client to execute) // // Event handler for when a player changes rooms or a "large" terrain cell // (8x8 Terrain block). // obj = Object pointer of the object who just changed the room/segment // newseg = New room/cell location // oldseg = Old room/cell location virtual void OnClientObjectChangeSegment(object *obj, int newseg, int oldseg); // DMFCBase::OnClientPlayerEntersGame (Only called if server tells client to execute) // // Event handler for when a player enters the game. This will only get called once per // player, it usually gets called right after they connect to the server to start playing. // player_num = player number of the player entering the game virtual void OnClientPlayerEntersGame(int player_num); // DMFCBase::OnClientPlayerDisconnect (Only called if server tells client to execute) // // Event handler for when a player disconnects from the server. // player_num = player number of the player that just disconnected virtual void OnClientPlayerDisconnect(int player_num); // DMFCBase::OnMeDisconnectFromServer // // Event handler that gets called if we disconnect from the server for some reason (not purposesly quit) virtual void OnMeDisconnectFromServer(void); // DMFCBase::OnClientGameCreated (Only called if server tells client to execute) // // Event handler when the server's game first gets started. This will only be called once // while the server is running, and that is when the server first starts up. virtual void OnClientGameCreated(void); // DMFCBase::OnClientObjectShieldsChanged // // Event handler for when an objects shield's change virtual void OnClientObjectShieldsChanged(object *obj, float amount); // DMFCBase::OnWeaponFired // // Event handler for when an object fires a weapon virtual void OnWeaponFired(object *weapon_obj, object *shooter); // DMFCBase::OnClientLevelChange (Only called if server tells client to execute) // // Event handler when the server changes levels. This will get called after a level ends and a server // is starting a new level. virtual void OnClientLevelChange(void); // DMFCBase::OnClientLevelStart (Only called if server tells client to execute) // // Event handler for when a multiplayer level is starting up. This will get called right before the level // starts. virtual void OnClientLevelStart(void); // DMFCBase::OnClientLevelEnd (Only called if server tells client to execute) // // Event handler for when a multiplayer level is ending. virtual void OnClientLevelEnd(void); // DMFCBase::OnClientWallCollide // // Called by the game when their is a collision between an object and a wall virtual void OnClientWallCollide(object *obj, float hitspeed, int hitseg, int hitwall, vector *hitpt, vector *wall_normal, float hit_dot); // DMFCBase::OnClientObjectKilled // // Called when an object is being killed // Not automatically sent to clients (OnClientObjectKilled) // killer might not be valid (NULL) virtual void OnClientObjectKilled(object *obj, object *killer); // DMFCBase::OnClientObjectDestroyed // // Called when an object is about to be deleted // Not automatically sent to clients virtual void OnClientObjectDestroyed(object *obj); // DMFCBase::OnPlayerEntersObserver // // Event handler when a player becomes an observer mode // If they are piggybacking another player than piggy is the object pointer, else it's NULL virtual void OnPlayerEntersObserver(int pnum, object *piggy); // DMFCBase::OnPlayerExitsObserver // // Event handler when a player is leaving observer mode virtual void OnPlayerExitsObserver(int pnum); // DMFCBase::OnCanChangeTeam // // Called to determine if a player can change teams, you can override this so the server won't // let a player change teams if it is not desired (for that player) virtual bool OnCanChangeTeam(int pnum, int newteam); // DMFCBase::OnSpecialPacket // // Event handler for when a special packet arrives and needs to be processed. // Both the server and client can get this event, although it is more common for the // client to recieve these. virtual void OnSpecialPacket(void); // DMFCBase::OnInterval // // Event handler that gets called once a frame virtual void OnInterval(void); // DMFCBase::OnHUDInterval // // Event handler that gets called once a frame when it's time to render the HUD images virtual void OnHUDInterval(void); // DMFCBase::OnPLRInterval // // Event handler that gets called once a frame when the Post Level Results screen is being display virtual void OnPLRInterval(void); // DMFCBase::OnPLRInit // // Event handler that gets called the first frame of the PLR screen for each level virtual void OnPLRInit(void); // DMFCBase::OnKeypress // // Event handler for when a user presses a key while in the game // key = Key code of the key being pressed virtual void OnKeypress(int key); // DMFCBase::OnInputString // // Event handler for when the user types a message at the console (F8) that begins with a $ // input_string = string that was typed virtual void OnInputString(char *input_string); // DMFCBase::OnPlayerChangeTeam // // Called when a player changes team // if announce is true than it is a change in the middle of the game, else it's an initial assignment change virtual void OnPlayerChangeTeam(int player_num, int newteam, bool announce, bool spew_everything); // DMFCBase::OnGameStateRequest // // Server only. Override this to listen for Game state requests from the clients // When this function is called a client (who's player number is passed in) is requesting // game state information. Do what you need to do to send game state information to that player virtual void OnGameStateRequest(int pnum); // DMFCBase::OnSaveStatsToFile // // // The user is requesting the game stats to be saved to file, you must handle this completly on // the game's side, nothing is done in DMFC virtual void OnSaveStatsToFile(void); // DMFCBase::OnPlayerReconnect // // // This player is reconnecting to the game virtual void OnPlayerReconnect(int player_num); // DMFCBase::OnPlayerConnect // // // This player is connecting to the game for the first time virtual void OnPlayerConnect(int player_num); // DMFCBase::OnControlMessage // // // There is a control message sent from someone virtual void OnControlMessage(ubyte msg, int from_pnum); // DMFCBase::OnAllowObserverChange // // // returns true if the requested change for observer mode should go through virtual bool OnAllowObserverChange(bool turnonobserver); // DMFCBase::OnClientShowUI // // // The game is saying it's ok to do any UI. Only handle the id's that belong to you and pass the rest // to DMFCBase::OnClientShowUI(). virtual void OnClientShowUI(int id, void *user_data); // DMFCBase::OnPrintScores // // // The user is requesting that the scores be printed out (For Dedicated Server use). Use DPrintf // level: -1 Requesting all the available scores // n Print only the top n scores // Override this to how you see fit, but it should conform to the above. virtual void OnPrintScores(int level); // DMFCBase::OnDisconnectSaveStatsToFile // // // The game should save the stats because the player (only ourself as the client in the game), // has disconnected. virtual void OnDisconnectSaveStatsToFile(void); // DMFCBase::OnLevelEndSaveStatsToFile // // // The game should save the "End of Level" stats to file. You must handle this completly on // the game's side, nothing is done in DMFC virtual void OnLevelEndSaveStatsToFile(void); // DMFCBase::OnGetHudCallSignColor // // This is an event sent in by the game requesting what color it should draw the HUD callsign // of the passed in playernum. Using GR_RGB return the color from the function. This function // gets called every frame that the player is on the clients HUD. virtual ddgr_color OnGetHudCallSignColor(int playernum); // DMFCBase::TranslateEvent // // Translates the event passed in to handle, calls the appropriate handler function. If a function isn't // created to handle the event, then it calls the default handler. Handler functions should call the default // handler unless it absolutly shouldn't virtual void TranslateEvent(int eventnum, dllinfo *data); // DMFCBase::OnTeamChangeName // // This event occurs on the client when a team's name has just changed virtual void OnTeamChangeName(int team, char *oldname, char *newname); // DMFCBase::OnDoControls // // This event occurs when there is a new back of game controls data virtual void OnDoControls(game_controls *controls); // DMFCBase::OnPlayAudioTaunt // // This event occurs when a player plays an audio taunt virtual void OnPlayAudioTaunt(int pnum); // DMFCBase::OnGetTokenString // // This event occurs when a text macro is being used that has tokens // in it, if you have a specific token, override this event to handle it. virtual void OnGetTokenString(char *src, char *dest, int dest_size); void DrawMenu(void); void DisplayPlayerInfo(int background_bmp = -1, bool dedicated_server = false); // DMFCBase::SwitchPlayerInfoDisplay // // Switches on/off displaying a Playerinfo void SwitchPlayerInfoDisplay(int pnum); // DMFCBase::DisplayingPlayerInfo // // Returns the pnum of who you are currently displaying, -1 if noone int DisplayingPlayerInfo(void); // DMFCBase::GetTeamFromString // // Returns the int value of a team based on a string, -1 if not a team int GetTeamFromString(char *str); // DMFCBase::GetPlayerNum // // Returns your playernum, useful when finding out if an event is referring to you (by looking at // the playernum passed to the event handler, compared to your playernum int GetPlayerNum(void); // DMFCBase::GetLocalRole // // Returns your role in the multiplayer game. The result returned will be either LR_SERVER or LR_CLIENT int GetLocalRole(void); // DMFCBase::CheckPlayerNum // // Returns true if the player number passed in is a valid player number (the player is connected) bool CheckPlayerNum(int player_num); // DMFCBase::PacketCheckPlayerNum // // Returns true if it's ok to send a packet to this player bool PacketCheckPlayerNum(int player_num); // DMFCBase::CallClientEvent // // Server Only. This will send an event to a client for it to execute. // event = An EVT_CLIENT_* // me_objnum,it_objnum = Object numbers of the objects to be me and it for the event // destination = Player number of the client to send to, or -1 if to send to all void CallClientEvent(int event, int me_objnum, int it_objnum, int destination, bool parms = false); // DMFCBase::GetTimeLeft // // Server Only. This will fill in the float pointer passed to it with how much time is // left in the multiplayer game. The value placed in the float is only valid if GetTimeLeft // returns true. If it returns false it was because either it is not a game with a time limit // or it is being called on a client. bool GetTimeLeft(float *time); // DMFCBase::EndLevel // // Server Only. This will end the current multiplayer level, and will go on to the next level. void EndLevel(void); // DMFCBase::WarpToLevel // // Warps to another level in the mission. Pass a level number (1 to Current_mission.num_levels) // It will end the level and go to that level. void WarpToLevel(int lev); // DMFCBase::GetScoreLimit // // Server Only. This will fill in the int pointer passed to it with what the scoring limit // is, set in in the multiplayer options. The value point into the int is only valid if // GetScoreLimit returns true. If it returns false it is because you are either not the // server or this option wasn't set in the multiplayer options bool GetScoreLimit(int *limit); // DMFCBase::AutoTimeLimit // // Server Only. This turns off or on the automatic level ending by DMFC of a timed multiplayer game. // If you turn it off, it is your responsibility to end a time multiplayer game when it's time // is up. If it is turned on, DMFC will automatically handle ending the game. By default it is on. void AutoTimeLimit(bool turnon); // DMFCBase::AutoDeathMessage // // This turns on or off DMFC's automatic handling of death messages. If it is turned on (Default) // then when a player dies it will display a random death message from the list added by you using // AddDeathMessage. If it is turned off, then it is your responsibility to handle the messages, you // can use DoRandomDeathMessage to display one when appropriate. void AutoDeathMessage(bool turnon); // DMFCBase::AddDeathMessage // // This will add a death message to DMFC. // format = string in a "printf" type format (using %s for player callsigns) of the message // victim_first = Set this to true if the victim is listed first in the format void AddDeathMessage(const char *string, bool victim_first = true); // DMFCBase::AddSuicideMessage // // This will add a death message to DMFC. // format = string in a "printf" type format (using %s for player callsigns) of the message void AddSuicideMessage(const char *string); // DMFCBase::DoRandomDeathMessage // // DMFC will display a death message (or suicide message if killer and victim are the same) when // this function is called, based on the strings added with AddDeathMessage or AddSuicideMessage. // killernum = object number of the killer // victimnum = object number of the victim // hash = hash index of the weapon killer, -1 if none void DoRandomDeathMessage(int killernum, int victimnum, uint hash = -1); // DMFCBase::GetItObjNum // // Returns the it object number of the current event for use. int GetItObjNum(void); // DMFCBase::GetMeObjNum // // Returns the me object number of the current event for use. int GetMeObjNum(void); // DMFCBase::RegisterPacketReceiver // // Sets up a handler for a Special Packet ID. When a special packet is recieved it's ID is compared // to the ID's given to this function. If any match than it calls the handler given to process // the packet. // id = ID of the packet // func = Function handler to handle the packet. Must be declared like void MyFunction(ubyte *data); void RegisterPacketReceiver(ubyte id, void (*func)(ubyte *)); void RegisterPacketReceiver(ubyte id, void (DMFCBase::*func)(ubyte *)); // DMFCBase::StartPacket // // Initializes a packet so it is ready to be sent out. // data = pointer to buffer of data for packet. This buffer should be MAX_GAME_DATA_SIZE in size, even // if you don't plan on using all that data, there is header information that is added // in this function. // id = ID of the Special packet. When the packet is recieved by whomever, this is the ID that determines which // handler to // call. // count = pointer to your packet index pointer void StartPacket(ubyte *data, ubyte id, int *count); // DMFCBase::SendPacket // // Ships a Special Packet away to the destination. This call must be preceeded by a StartPacket call // data = buffer of data to be sent out (same buffer that was passed to StartPacket // size = size (in bytes) of the packet // destination = either a player number, SP_ALL for all the players or SP_SERVER to send to the server (if you are a // client) void SendPacket(ubyte *data, int size, int destination); // DMFCBase::GetTeamForNewPlayer // // A Helper function (Server only), which will give you the optimum team assignment (whoever has the // lowest amount of players on their team, for a new player. // player_num = player number of the new player // num_teams = The number of teams in your game int GetTeamForNewPlayer(int player_num, int num_teams); // DMFCBase::SetNumberOfTeams // // Sets the number of teams to be used in the game. By default there is 1 team (everyone against everyone). // You can set up to a maximum of 4 teams. Call this function as soon as possible. // teams = number of teams void SetNumberOfTeams(int teams); // DMFCBase::AutoTeamSelect // // Turns on or off DMFC's auto team assignment. If it is on, then when a new player joins, they will // be placed on the team with fewest players. If it is off, then you must handle that. Defualt on. void AutoTeamSelect(bool turnon); // DMFCBase::SendTeamAssignment // // A DMFC Special Packet function, this sends a team assignment packet to all the players. Server only. // playernum = player to change teams // team = new team void SendTeamAssignment(int playernum, int team, bool spew_on_respawn); // DMFCBase::GetTeamAssignmentPacket // // Reciever for the team assignment packet. void GetTeamAssignmentPacket(ubyte *data); // DMFCBase::GetChangeTeamPacket // // Reciever for the change team packet.(Server Only) void GetChangeTeamPacket(ubyte *data); // DMFCBase::GetGameStateRequest // // Receiver for the server from a client asking for the state of the game void GetGameStateRequest(ubyte *data); // DMFCBase::SendChangeTeamRequest // // Sends a request to the server to change teams (Client Only) // spew_onchange should be true if you want the client the spew his inventory on the change void SendChangeTeamRequest(int newteam, bool spew_onchange); // DMFCBase::GetDMFCGameInfo // // Receives information about the DMFC game void GetDMFCGameInfo(ubyte *data); // DMFCBase::SendDMFCGameInfo // // Sends information about the DMFC game void SendDMFCGameInfo(int player); // DMFCBase::GetRemoteKey // // Handles a new remote key from the server void GetRemoteKey(ubyte *data); // DMFCBase::SendRemoteKey // // Sends out the players remote admin key void SendRemoteKey(int pnum); // DMFCBase::ChangeTeams // // If you are the server it will make the player change teams. If you // are a client then it sends a request to the server to change teams // spew_on_repsawn is true if the player should spew his inventory before he respawns void RequestTeamChange(int team, int pnum, bool spew_on_respawn); // DMFCBase::RequestGameState // // Sends a request to the server for the game state void RequestGameState(void); // DMFCBase::AddHudItemCallback // // Adds an item to the hud. Everytime the hud needs to be updated, it will call the // handler passed in. The handler must be declared as: // void func(struct tHudItem *item); // type = HI_BITMAP for bitmap, HI_TEXT for a text item // func = function callback void AddHUDItemCallback(int type, void (*func)(struct tHUDItem *)); // DMFCBase::GetMyTeam // // Returns the int value of the team you are on...only useful in a team game. int GetMyTeam(void); // DMFCBase::GetTeamString // // Returns a pointer to a string name of a team // team = integer value of the team const char *GetTeamString(int team); // DMFCBase::GetTeamColor // // Returns the color components of a team // team = integer value of the team ddgr_color GetTeamColor(int team); // DMFCBase::GetNumTeams // // Returns the number of teams in the game int GetNumTeams(void); // DMFCBase::AllowTeamChange // // Returns true if team changing is allowed bool AllowTeamChange(void); // DMFCBase::SwitchAllowTeamChange // // Turns on/off allowing of team changing void SwitchAllowTeamChange(bool turnon); // DMFCBase::GetSortedPlayerSlots // // Fills in the passed array (of size maxsize) with the playernums sorted by (kills-suicides) void GetSortedPlayerSlots(int *sortedindex, int maxsize); // DMFCBase::GetSortedPlayerSlotsByEfficiency // // Fills in the passed array (of size maxsize) with the playernums sorted by kills/(kills+deaths+suicides) void GetSortedPlayerSlotsByEfficiency(int *sortedindex, int maxsize); // DMFCBase::IsMenuUp // // Returns true if the on screen menu is being shown bool IsMenuUp(void); // DMFCBase::ConvertHUDAlpha // // Returns a converted alpha based on what you give, it will be a more transparent if the onscreen menu is up float ConvertHUDAlpha(float normal); ubyte ConvertHUDAlpha(ubyte normal); // DMFCBase::ClipString // // Given a width, the string will be clipped to that width. If you pass true for arrow, then an arrow will be // appended if the string has been clipped. Based off current font void ClipString(int width, char *string, bool arrow); // DMFCBase::DisplayOutrageLogo(void) // // Displays the Outrage Logo for 5 seconds (call repeatedly, after 5 seconds it will just short circuit) // Does nothing for non-Outrage releases void DisplayOutrageLogo(void); // DMFCBase::InitTimers // // Inializes the timers void InitTimers(void); // DMFCBase::KillAllTimers // // Kills all running timers void KillAllTimers(void); // DMFCBase::SetTimerInterval // // Starts a timer event running int SetTimerInterval(void (*func)(void), float intval, float longevity, void (*onkill)(void) = NULL); // DMFCBase::KillTimer // // Kills a timer void KillTimer(int handle); // DMFCBase::ProcessTimers // // Goes through all the timers and updates them if they need to be updated void ProcessTimers(void); // DMFCBase::SwitchShowHudCallsignLevel // // // Sets the level for displaying of Player's Callsigns on the HUD void SwitchShowHudCallsignLevel(ubyte level, bool announce = true); // DMFCBase::SwitchServerHudCallsignLevel // // // Sets the max level of HUD callsign displayage...determined by the server void SwitchServerHudCallsignLevel(ubyte level); // DMFCBase::GetCounterMeasureOwner // // // Given a counter measure it will determine the pnum of it's owner...if it can't find it, it returns -1 int GetCounterMeasureOwner(object *robot); // DMFCBase::CFGOpen // // Opens the registry/cfg information for the DMFC game, see error codes for return values int CFGOpen(char *filename); // DMFCBase::CFGClose // // Closes the registry information for the game. void CFGClose(void); // DMFCBase::CFGFlush // // Flushes out the registry information to fall int CFGFlush(void); // DMFCBase::CFGCreateKey // // Creates a key in the registry int CFGCreateKey(char *name); // DMFCBase::CFGLookupKey // // Sets the active key in the registry int CFGLookupKey(char *name); // DMFCBase::CFGLookupRecord // // Looks up a record in the active key int CFGLookupRecord(char *record, void *data); // DMFCBase::CFGCreateRecord // // Create/overwrites a record in the active key. Type is either REGT_DWORD or REGT_STRING int CFGCreateRecord(char *name, char type, void *data); // DMFCBase::DecryptData // // Decrypts a buffer of data void DecryptData(ubyte *data, int size); // DMFCBase::EncryptData // // Encrypts (weak) a buffer of data void EncryptData(ubyte *data, int size); // DMFCBase::VersionCheck // // Makes sure Client has same DMFC version void VersionCheck(int pnum); // DMFCBase::FindPInfo // // Given a player number it will search the list and find that player, returning the pointer, or NULL if it // can't be found or created PInfo *FindPInfo(int pnum); // DMFCBase::UpdatePInfo // // // Updates a victim's pinfo stat void UpdatePInfo(int victim, int killer, int amount); // DMFCBase::ResetPInfo // // // Resets all the PInfo stats (and frees memory) void ResetPInfo(void); // DMFCBase::WriteDMFCStatsToFile // // // This function will write out DMFC's stats to the file given (it must be opened for writing) void WriteDMFCStatsToFile(CFILE *file); // DMFCBase::SetWeaponDeathMessage // // Sets a death message for a weapon kill (you only need to pass in one version of the weapon if it // consists of multiple weapons...make sure AddWeaponHash has been called before this for this weapon) bool SetWeaponDeathMessage(const char *weapon_name, const char *message, bool victim_first); // DMFCBase::GetWeaponDeathMessage // // Returns the format string for a weapon death message, NULL if it doesn't exist char *GetWeaponDeathMessage(int index, bool *victim_first); // DMFCBase::AddWeaponHash // // Since one weapon may actually consist of many weapons, in order to save space you can create // one weapon where all those other weapon id's will be mapped to it...use WeaponHash[id] to // get the actual weapon. End list of children with a NULL void AddWeaponHash(const char *parent, ...); // DMFCBase::AddWeaponHashArray // // Since one weapon may actually consist of many weapons, in order to save space you can create // one weapon where all those other weapon id's will be mapped to it...use WeaponHash[id] to // get the actual weapon. void AddWeaponHashArray(const char *parent, int count, char **array); // DMFCBase::SetupPlayerRecord // // Sets up memory for multiplayer mod user defined data in the Player Records. Pass in the size (in bytes) // of 1 struct (each player will get one). Use GetPlayerRecordData to retrieve a pointer to the data. // // pack_callback : callback function called when data from the struct needs to be packed // into a packet. It is SUPER important that this function packs the data // in little endian format. This function gets a pointer to the struct that // needs to be packed (user_info), and a buffer in which to pack it to. This // function is to return the number of bytes it has packed. // unpack_callback : callback function called when data from the struct needs to be unpacket // from a packet. This data will be in little endian format. Returns the number of // bytes unpacked. // returns: 1 if size given was <=0 (if so all previous user stats will be removed) // 0 all went ok // -1 out of memory (all user stats memory will be freed) int SetupPlayerRecord(int sizeof_individual_data, int (*pack_callback)(void *user_info, ubyte *data), int (*unpack_callback)(void *user_info, ubyte *data)); // DMFCBase::GetPlayerRecordData // // Returns a pointer to the memory set aside for a particular player (NULL on error) void *GetPlayerRecordData(int pnum); // DMFCBase::GetPlayerRecord // // Returns a pointer to the player record at the given slot (passed in slot must be in the range // 0<=slot" #define DTXT_DEATHLASER DTXT(34) //%s's Laser blasts %s to smithereens" #define DTXT_DEATHVAUSS DTXT(35) //"%s punctures %s's ship with the Vauss" #define DTXT_DEATHMICROWAVE DTXT(36) //"%s is vaporized by %s's Microwave beam" #define DTXT_DEATHPLASMA DTXT(37) //"%s pulverizes %s with Plasma power" #define DTXT_DEATHFUSION DTXT(38) //"%s disintigrates %s's hull with the fusion" #define DTXT_DEATHSUPERLASER DTXT(39) //"%s's Super Laser blasts %s to smithereens" #define DTXT_DEATHMASS DTXT(40) //"%s targets %s for Mass destruction" #define DTXT_DEATHNAPALM DTXT(41) //"%s's Napalm burns %s beyond recognition" #define DTXT_DEATHEMD DTXT(42) //"%s's EMD electrocutes %s!" #define DTXT_DEATHOMEGA DTXT(43) //"%s's Omega peels off %s's shields" #define DTXT_DEATHCONC DTXT(44) //%s takes a pounding from %s's Concussion" #define DTXT_DEATHHOMING DTXT(45) //"%s's Homer swoops down on %s for the kill" #define DTXT_DEATHSMART DTXT(46) //"%s can't shake %s's Smart missile" #define DTXT_DEATHMEGA DTXT(47) //"%s's Mega reduces %s to smoldering scrap" #define DTXT_DEATHFRAG DTXT(48) //"%s catches shrapnel from %s's Frag" #define DTXT_DEATHGUIDED DTXT(49) //"%s's Guided hunts down %s" #define DTXT_DEATHNAPALMROCKET DTXT(50) //"%s is incinerated by %s's Napalm Rocket" #define DTXT_DEATHCYCLONE DTXT(51) //%s's Cyclone overwhelms %s's defenses" #define DTXT_DEATHFLARE DTXT(52) //"%s's Flare ignites %s's fuel leak" #define DTXT_OSM_REMOVEBAN DTXT(53) //"Remove Ban" #define DTXT_OSM_REHASHLIST DTXT(54) //"Rehash Allow/Deny List" #define DTXT_OSM_MAXHUDNAME DTXT(55) //"Max HUD Name Level" #define DTXT_PLAIN_NONE DTXT(56) //"None" #define DTXT_OSM_TEAMONLY DTXT(57) //"Team Only" #define DTXT_OSM_FULL DTXT(58) //"Full" #define DTXT_OSM_TEAMCONFIG DTXT(59) //"Show Team Config Dialog" #define DTXT_OSM_PIGGYBACK DTXT(60) //"PiggyBack Observer" #define DTXT_OSM_BACKGROUND DTXT(61) //"OnScreen Menu Background" #define DTXT_OSM_HUDNAMELEVEL DTXT(62) //"HUD Name Level" #define DTXT_OSM_SHIPLOGOS DTXT(63) //"Ship Logos" #define DTXT_OSM_STATSTOFILE DTXT(64) //"Game Stats To File" #define DTXT_OSM_STATLEVELEND DTXT(65) //"AutoSave On Level End" #define DTXT_OSM_STATDISCONNECT DTXT(66) //"AutoSave On Disconnect" #define DTXT_OSM_NETGAMEINFO DTXT(67) //"NetGame Info" #define DTXT_OSM_HUDFILTER DTXT(68) //"HUD Message Filters" #define DTXT_OSM_KILLMESSAGES DTXT(69) //"Kill Messages" #define DTXT_OSM_SIMPLE DTXT(70) //"Simple" #define DTXT_OSM_STATMESSAGES DTXT(71) //"Statistical Messages" #define DTXT_OSM_EXIT DTXT(72) //"Exit Menu" #define DTXT_PI_TIMEINGAME DTXT(73) //"Total Time In Game: %s\n" #define DTXT_SETTEAMNAME DTXT(74) //"%s changed team name to %s" #define DTXT_HUDLEVEL_FULL DTXT(75) //"Personal HUD Name Level: Full" #define DTXT_HUDLEVEL_TEAM DTXT(76) //"Personal HUD Name Level: Team Only" #define DTXT_HUDLEVEL_NONE DTXT(77) //"Personal HUD Name Level: None" #define DTXT_SHUDLEVEL_FULL DTXT(78) //"Server Max HUD Name Level: Full" #define DTXT_SHUDLEVEL_TEAM DTXT(79) //"Server Max HUD Name Level: Team Only" #define DTXT_SHUDLEVEL_NONE DTXT(80) //"Server Max HUD Name Level: None" #define DTXT_DMFC_STAT_HEADER DTXT(81) //"Callsign: Kills: Deaths:" #define DTXT_DEDS_BAN DTXT(82) //"Banning %s\n" #define DTXT_DEDS_BAN_ERROR DTXT(83) //"Unable to ban player...pnum not valid\n" #define DTXT_TIME_HOUR DTXT(84) //"01:00:00 hour" #define DTXT_TIME_HOURS DTXT(85) //"%d:%.2d:%.2d hours" #define DTXT_TIME_MINUTE DTXT(86) //"1:00 minute" #define DTXT_TIME_MINUTES DTXT(87) //"%d:%.2d minutes" #define DTXT_TIME_SECOND DTXT(88) //"1 second" #define DTXT_TIME_SECONDS DTXT(89) //"%d seconds" #define DTXT_IC_ALLOWTEAMCHANGE DTXT(90) //"allowteamchange" #define DTXT_IC_ALLOWTEAMCHANGED \ DTXT(91) //"[Server Only]\nTurns off/on allowing clients to change their team.\nUsage: \"$allowteamchange \"" #define DTXT_IC_AUTOBALANCE DTXT(92) //"autobalance" #define DTXT_IC_AUTOBALANCED \ DTXT(93) //"[Server Only]\nTurns off/on allowing the automatic team placement of new players by the server.\nUsage: //\"$autobalance \"" #define DTXT_IC_AUTOSAVEDISC DTXT(94) //"autosavedisconnect" #define DTXT_IC_AUTOSAVEDISCD \ DTXT(95) //"Enables/Disables the automatic saving of the game stats if you disconnect from the server.\nUsage: //\"$autosavedisconnect \"" #define DTXT_IC_AUTOSAVELEVEL DTXT(96) //"autosavelevel" #define DTXT_IC_AUTOSAVELEVELD \ DTXT(97) //"Enables/Disables the automatic saving of the game stats when the level ends.\nUsage: \"$autosavelevel //\"" #define DTXT_IC_BALANCE DTXT(98) //"balance" #define DTXT_IC_BALANCED \ DTXT(99) //"[Server Only]\nAutomatically balances the teams, based on senority.\nUsage: \"$balance\"" #define DTXT_IC_BAN DTXT(100) //"ban" #define DTXT_IC_BAND DTXT(101) //"[Server Only]\nBans a player from the game.\nUsage: \"$ban \"" #define DTXT_IC_BANLIST DTXT(102) //"banlist" #define DTXT_IC_BANLISTD \ DTXT(103) //"[Dedicated Server Only]\nLists the players banned from the game along with their ban number, which can be // used to remove the ban.\nUsage: \"$banlist\"" #define DTXT_IC_CHANGETEAM DTXT(104) //"changeteam" #define DTXT_IC_CHANGETEAMD \ DTXT(105) //"[Server Only]\nForces a player to a team.\nUsage: \"$changeteam \"" #define DTXT_IC_ENDLEVEL DTXT(106) //"endlevel" #define DTXT_IC_ENDLEVELD DTXT(107) //"[Server Only]\nEnds the level.\nUsage: \"$endlevel\"" #define DTXT_IC_HELP DTXT(108) //"help" #define DTXT_IC_HELPD DTXT(109) //"Displays help information for the input commands.\nUsage: \"$help [command]\"" #define DTXT_IC_HUDNAME DTXT(110) //"hudnames" #define DTXT_IC_HUDNAMED \ DTXT(111) //"Sets your personal level for the HUD name filter.\nUsage: \"$hudnames \"\nNOTE: You can // only set your HUD Callsign level up to the level that the server is. So if the server is only allowing // up to teammates, you won't be able to set to full" #define DTXT_IC_KICK DTXT(112) //"kick" #define DTXT_IC_KICKD DTXT(113) //"[Server Only]\nKicks a player from the game.\nUsage: \"$kick \"" #define DTXT_IC_KILLMSGFILTER DTXT(114) //"killmsgfilter" #define DTXT_IC_KILLMSGFILTERD \ DTXT(115) //"Sets the kill message filter, for what style of messages you want.\nUsage: \"$killmsgfilter //\"" #define DTXT_IC_NETGAMEINFO DTXT(116) //"netgameinfo" #define DTXT_IC_NETGAMEINFOD DTXT(117) //"Displays information about the net game.\nUsage: \"$netgameinfo\"" #define DTXT_IC_OBSERVER DTXT(118) //"observer" #define DTXT_IC_OBSERVERD \ DTXT(119) //"If you pass specify 'on', it puts you into observer mode, else it will return you back to normal // mode.\nUsage: \"$observer \"" #define DTXT_IC_PIGGYBACK DTXT(120) //"piggyback" #define DTXT_IC_PIGGYBACKD DTXT(121) //"Puts you into Piggyback Observer mode.\"$piggyback \"" #define DTXT_IC_PLAYERINFO DTXT(122) //"playerinfo" #define DTXT_IC_PLAYERINFOD DTXT(123) //"Displays information about a player.\nUsage: \"$playerinfo \"" #define DTXT_IC_PLAYERS DTXT(124) //"players" #define DTXT_IC_PLAYERSD \ DTXT(125) //"[Dedicated Server Only]\nDisplays a list of the players in the game, with their player numbers.\nUsage: //\"$players\"" #define DTXT_IC_REHASH DTXT(126) //"rehash" #define DTXT_IC_REHASHD \ DTXT(127) //"[Server Only]\nRehashes the hosts.allow and hosts.deny files. First it flushes the old, and reloads // them.\nUsages: \"$rehash\"" #define DTXT_IC_REMOVEBAN DTXT(128) //"removeban" #define DTXT_IC_REMOVEBAND \ DTXT(129) //"[Dedicated Server Only]\nRemoves a ban from a player, given the number associated with them from //$banlist.\nUsage: \"$removeban \"" #define DTXT_IC_SAVESTATS DTXT(130) //"savestats" #define DTXT_IC_SAVESTATSD DTXT(131) //"Saves the game stats to file immediatly.\nUsage: \"$savestats\"" #define DTXT_IC_SCORES DTXT(132) //"scores" #define DTXT_IC_SCORESD DTXT(133) //"Displays the scores or stats of the game.\nUsage: \"$scores\"" #define DTXT_IC_SERVERHUDNAMES DTXT(134) //"serverhudnames" #define DTXT_IC_SERVERHUDNAMESD \ DTXT(135) //"[Server Only]\nSets the highest HUD name filter permitted for the clients.\nUsage: \"$serverhudnames //\"" #define DTXT_IC_SETGOALLIMIT DTXT(136) //"setgoallimit" #define DTXT_IC_SETGOALLIMITD \ DTXT(137) //"[Server Only]\nChanges the goal limit for the level.\nUsage: \"$setgoallimit \"" #define DTXT_IC_SETMAXPLAYERS DTXT(138) //"setmaxplayers" #define DTXT_IC_SETMAXPLAYERSD \ DTXT(139) //"[Server Only]\nSets the maximum number of players allowed in the game.\nUsage: \"$setmaxplayers //\"" #define DTXT_IC_SETPPS DTXT(140) //"setpps" #define DTXT_IC_SETPPSD \ DTXT(141) //"[Server Only]\nChanges the Packets Per Second (PPS) threshold of the game\nUsage: \"$setpps \"" #define DTXT_IC_SETRESPAWNTIME DTXT(142) //"setrespawntime" #define DTXT_IC_SETRESPAWNTIMED \ DTXT(143) //"[Server Only]\nChanges the respawn time of the powerups in the level.\nUsage: \"$setrespawntime //\"" #define DTXT_IC_SETTEAMNAME DTXT(144) //"setteamname" #define DTXT_IC_SETTEAMNAMED \ DTXT(145) //"[Server Only]\nChanges the name of a team.\nUsage: \"$setteamname \"" #define DTXT_IC_SETTIMELIMIT DTXT(146) //"settimelimit" #define DTXT_IC_SETTIMELIMITD \ DTXT(147) //"[Server Only]\nChanges the time limit for the level.\nUsage: \"$settimelimit \"" #define DTXT_IC_STATMSGS DTXT(148) //"statmsgs" #define DTXT_IC_STATMSGSD DTXT(149) //"Enables/Disables random statistical messages.\nUsage: \"$statmsgs \"" #define DTXT_IC_TEAM DTXT(150) //"team" #define DTXT_IC_TEAMD DTXT(151) //"Change teams for yourself.\nUsage: \"$team \"" #define DTXT_IC_HEADEERLIST DTXT(152) //"Input Command List:\n" #define DTXT_IC_HEADERINSTRUCT \ DTXT(153) //"Prefix a '$' before the commands listed below. To get more detailed help\nabout a command, type '$help //'\n" #define DTXT_IC_NOADDITIONALINFO DTXT(154) //"No additional information is available\n" #define DTXT_IC_COMMANDNOTFOUND DTXT(155) //"Command not found\n" #define DTXT_SUNDAY DTXT(156) //"Sun" #define DTXT_MONDAY DTXT(157) //"Mon" #define DTXT_TUESDAY DTXT(158) //"Tue" #define DTXT_WEDNESDAY DTXT(159) //"Wed" #define DTXT_THURSDAY DTXT(160) //"Thur" #define DTXT_FRIDAY DTXT(161) //"Fri" #define DTXT_SATURDAY DTXT(162) //"Sat" #define DTXT_JANUARY DTXT(163) //"Jan" #define DTXT_FEBRUARY DTXT(164) //"Feb" #define DTXT_MARCH DTXT(165) //"March" #define DTXT_APRIL DTXT(166) //"April" #define DTXT_MAY DTXT(167) //"May" #define DTXT_JUNE DTXT(168) //"June" #define DTXT_JULY DTXT(169) //"July" #define DTXT_AUGUST DTXT(170) //"Aug" #define DTXT_SEPTEMBER DTXT(171) //"Sept" #define DTXT_OCTOBER DTXT(172) //"Oct" #define DTXT_NOVEMBER DTXT(173) //"Nov" #define DTXT_DECEMBER DTXT(174) //"Dec" #define DTXT_ENDOFLEVELCONCAT DTXT(175) //"End_Of_Level_" #define DTXT_NGI_HEADING DTXT(176) //"NetGame Information\n" #define DTXT_NGI_GAMENAME DTXT(177) //"Game Name: %s\n" #define DTXT_NGI_MISSIONNAME DTXT(178) //"Mission Name: %s\n" #define DTXT_NGI_SCRIPTNAME DTXT(179) //"Script Name: %s\n" #define DTXT_NGI_PPS DTXT(180) //"PPS: %d\n" #define DTXT_NGI_PPSSERVER DTXT(181) //"PPS (Server/You): %d/%d\n" #define DTXT_NGI_MAXPLAYERS DTXT(182) //"Max Players: %d\n" #define DTXT_NGI_ACCURATECOLL DTXT(183) //"Accurate Weapon Collisions: %s\n" #define DTXT_NGI_SENDROTATIONAL DTXT(184) //"Send Rotational Velocity: %s\n" #define DTXT_NGI_TIMELIMIT DTXT(185) //"Time Limit: %d %s\n" #define DTXT_MINUTE DTXT(186) //"minute" #define DTXT_MINUTES DTXT(187) //"minutes" #define DTXT_NGI_TIMELEFT DTXT(188) //"Time Left: %s\n" #define DTXT_NGI_NOTIMELIMIT DTXT(189) //"Time Limit: None" #define DTXT_NGI_GOALLIMIT DTXT(190) //"Goal: %d points\n" #define DTXT_NGI_NOGOAL DTXT(191) //"Goal: None\n" #define DTXT_NGI_RESPAWNTIME DTXT(192) //"Respawn Time: %s\n" #define DTXT_NGI_PACKETLOSSNA DTXT(193) //"Packet Loss: N/A\n" #define DTXT_NGI_PACKETLOSS DTXT(194) //"Packet Loss: %.1f%%\n" #define DTXT_NGI_NETWORKMODEL DTXT(195) //"Network Model: %s\n" #define DTXT_PEERTOPEER DTXT(196) //"Peer-To-Peer" #define DTXT_CLIENTSERVER DTXT(197) //"Client/Server" #define DTXT_NGI_MOVEMENTSMOOTHING DTXT(198) //"Movement Smoothing: %s\n" #define DTXT_CHANGETEAMDENIED DTXT(199) //"Team Change Was Denied" #define DTXT_KILLMSGFULL DTXT(200) //"Kill Message Filter: Full" #define DTXT_KILLMSGSIMPLE DTXT(201) //"Kill Message Filter: Simple" #define DTXT_KILLMSGNONE DTXT(202) //"Kill Message Filter: None" #define DTXT_WAITFORSERVER DTXT(203) //"Waiting For Server..." #define DTXT_PRESSPRNTSCRN DTXT(204) //"Press PrintScreen For A ScreenShot" #define DTXT_CHANGETEAM DTXT(205) //"%s changes teams to the %s team\n" #define DTXT_NOKILLERDEATHMSG DTXT(206) //"%s was killed" #define DTXT_SIMPLESUICIDEMSG DTXT(207) //"%s went suicidal" #define DTXT_HM_KILLSINAROW DTXT(208) //"That's %d kills in a row for %s!" #define DTXT_HM_DEATHSINAROW DTXT(209) //"That's %d deaths in a row for %s!" #define DTXT_HM_TIMESINCELASTKILL DTXT(210) //"It's %s's first kill in %s" #define DTXT_HM_TIMESINCELASTDEATH DTXT(211) //"%s lasted %s without being killed!" #define DTXT_HM_HIGHEFFICENCY DTXT(212) //"%s has an awesome efficiency of %.2f!!" #define DTXT_HM_GOODEFFICENCY DTXT(213) //"%s has an efficiency of %.2f" #define DTXT_HM_TIMESKILLED DTXT(214) //"%s has killed %s %d times!" #define DTXT_HM_REVENGE DTXT(215) //"%s got revenge on %s!" #define DTXT_TEAMCHANGEATTEMPT DTXT(216) //"Attempting to change teams to %s team" #define DTXT_STEAMCHANGEATTEMPT DTXT(217) //"Attempting to change %s to %s team" #define DTXT_GETPLAYERINFO DTXT(218) //"Getting Playerinfo for %s" #define DTXT_BALANCETEAMMSG DTXT(219) //"Balancing Teams" #define DTXT_AUTOTEAMBALANCEMSG DTXT(220) //"Auto Team Balance: %s" #define DTXT_ALLOWTEAMCHANGEMSG DTXT(221) //"Allow Team Changing: %s" #define DTXT_KICKMSG DTXT(222) //"Kicking %s from game" #define DTXT_BANMSG DTXT(223) //"Banning %s from game" #define DTXT_ENDLEVELMSG DTXT(224) //"Ending the level" #define DTXT_STATSMSGSET DTXT(225) //"Statistical Messages: %s" #define DTXT_AUTOSAVELEVELMSG DTXT(226) //"AutoSave Stats on Level End: %s" #define DTXT_AUTOSAVEDISCMSG DTXT(227) //"AutoSave Stats on Disconnect: %s" #define DTXT_TIMELIMITSETMSG DTXT(228) //"Time Limit: %d" #define DTXT_TIMELIMITOFFMSG DTXT(229) //"Time Limit: Off" #define DTXT_GOALLIMITSETMSG DTXT(230) //"Goal Limit: %d" #define DTXT_GOALLIMITOFFMSG DTXT(231) //"Goal Limit: None" #define DTXT_MAXPLAYERSSETMSG DTXT(232) //"Max Players: %d" #define DTXT_RESPAWNTIMEMSG DTXT(233) //"Respawn Time: %d" #define DTXT_PPSSETMSG DTXT(234) //"Max PPS: %d" #define DTXT_BANREMOVEDMSG DTXT(235) //"Ban Removed\n" #define DTXT_BANNOTREMOVEDMSG DTXT(236) //"Couldn't remove ban\n" #define DTXT_NOTINDEDICATED DTXT(237) //"Command Not Available To Dedicated Server\n" #define DTXT_OBSERVERDENIED DTXT(238) //"Observer mode request denied" #define DTXT_INVALIDPNUM DTXT(239) //"Invalid Player Number" #define DTXT_PLAYERLISTHEADER DTXT(240) //"PNum Name\n" #define DTXT_INVALIDTEAM DTXT(241) //"Invalid Team, Must be between 0 and %d" #define DTXT_SERVERCANTKICK DTXT(242) //"Server can't kick themself\n" #define DTXT_SERVERCANTBAN DTXT(243) //"Server can't ban themself\n" #define DTXT_BALANCINGTEAMS DTXT(244) //"Balancing Teams\n" #define DTXT_NODEDICATEDTEAM DTXT(245) //"Dedicated Server Can't Change Teams\n" #define DTXT_SAMETEAMCHANGE DTXT(246) //"You're already on the %s team\n" #define DTXT_SHIPLOGOSMSG DTXT(247) //"Ship Logos: %s" #define DTXT_ENABLED DTXT(248) //"Enabled" #define DTXT_DISABLED DTXT(249) //"Disabled" #define DTXT_REHASHINGMSG DTXT(250) //"Rehashing Hosts.allow and Hosts.deny" #define DTXT_STAT_STATUS DTXT(251) //"Status:" #define DTXT_STAT_TEAM DTXT(252) //"Team:" #define DTXT_STAT_PLAYTIME DTXT(253) //"Play Time:" #define DTXT_STAT_STREAK DTXT(254) //"Streak:" #define DTXT_STAT_LASTVICTIM DTXT(255) //"Last Victim:" #define DTXT_STAT_LASTKILLER DTXT(256) //"Last Killer:" #define DTXT_STAT_SERVER DTXT(257) //"Server" #define DTXT_STAT_OBSERVER DTXT(258) //"Observing" #define DTXT_STAT_PLAYING DTXT(259) //"Playing" #define DTXT_STAT_DISCONNECTED DTXT(260) //"Disconnected" #define DTXT_STAT_KILL DTXT(261) //"Kill" #define DTXT_STAT_KILLS DTXT(262) //"Kills" #define DTXT_STAT_DEATH DTXT(263) //"Death" #define DTXT_STAT_DEATHS DTXT(264) //"Deaths" #define DTXT_STAT_PILOTNAMELABEL DTXT(265) //"Pilot Name" #define DTXT_UI_STARTGAME DTXT(266) //"Start Game" #define DTXT_UI_RETURNTOGAME DTXT(267) //"Return to Game" #define DTXT_UI_CLIENTSWAIT DTXT(268) //"Make Clients Wait" #define DTXT_UI_TEAMSETUP DTXT(269) //"Team Setup" #define DTXT_UI_WAITFORPLAYERS DTXT(270) //"Waiting For Players" #define DTXT_UI_KICKPLAYER DTXT(271) //"Kick Player" #define DTXT_UI_BANPLAYER DTXT(272) //"Ban Player" #define DTXT_OSM_AUDIOTAUNTS DTXT(273) //"Audio Taunts" #define DTXT_AUDIOTAUNTSMSG DTXT(274) //"Audio Taunts: %s" #define DTXT_RANK DTXT(275) //"Rank:" #define DTXT_NETWORK_LOSS DTXT(276) //"Network Loss" #define DTXT_NETWORK_PING DTXT(277) //"Network Ping" #define DTXT_LOSSPINGIND DTXT(278) //"Loss/Ping HUD Indicator" #define DTXT_LOSSINDICATOR DTXT(279) //"Loss/Ping Indicator: %s" #define DTXT_PERMISSABLE DTXT(280) //"Permissable C/S" #define DTXT_IC_WARP DTXT(281) //"warp" #define DTXT_IC_WARPD \ DTXT(282) //"[Server Only]\nChanges the current level to another level in the mission.\nUsage: \"$warp \"" //--------------------- #define DTXT_REMOTELOGGEDOUT DTXT(283) //"Remote Admin Logged Out" #define DTXT_HUDMSGLOGGEDOUT DTXT(284) //"==%s has logged out==" #define DTXT_HUDMSGLOGGEDIN DTXT(285) //"==%s is remote administrating==" #define DTXT_REMOTELOGGEDIN DTXT(286) //"Remote Admin Logged In" #define DTXT_REMOTEEXECUTE DTXT(287) //"==%s executed "%s"" #define DTXT_REMOTESUCCESS DTXT(288) //"Remote Command Successful" #define DTXT_REMOTENOTSUCCESS DTXT(289) //"Remote Command Not Successful" #define DTXT_REMOTENOTALLOWED DTXT(290) //"Remote Command Not Allowed" #define DTXT_REMOTENOTFOUND DTXT(291) //"Remote Command Not Found" #define DTXT_UNABLETOREMOTE DTXT(292) //"Unable to enable remote administration (no password?)" #define DTXT_REMOTEADMINENABLE DTXT(293) //"Remote Administration: %s" #define DTXT_REMOTEADMINPASS DTXT(294) //"Remote Administration Password Set" #define DTXT_WAITSECS DTXT(295) //"Making Clients Wait %.2f seconds\n" #define DTXT_WAITOFF DTXT(296) //"Turning Off Client Wait Time\n" #define DTXT_WAITON DTXT(297) //"Making Clients Wait\n" #define DTXT_WAITNOLONGER DTXT(298) //"No Longer Making Clients Wait\n" #define DTXT_TEAMLABEL DTXT(299) //"%s Team:" #define DTXT_IC_REMOTE DTXT(300) //"remote" #define DTXT_IC_REMOTED \ DTXT(301) //"[Client Only]\nhandles a remote admin command\nUsage: \"$remote