Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
14875 lines
412 KiB
C++
14875 lines
412 KiB
C++
#include "MW4Headers.hpp"
|
|
|
|
#include "ShellFunctionHeaders.hpp"
|
|
|
|
#include "MW4Shell.hpp"
|
|
#include "MW4Headers.hpp"
|
|
#include "MWApplication.hpp"
|
|
#include "Salvage.hpp"
|
|
#include "NetParams.h"
|
|
#include "GameTypes.h"
|
|
#include "MechLabHeaders.h"
|
|
#include "MechLab.hpp"
|
|
#include "CampaignMechLab.hpp"
|
|
#include "MWApplication.hpp"
|
|
#include "MWMission.hpp"
|
|
#include "MWCampaign.hpp"
|
|
#include "MWGame.hpp"
|
|
#include "lancemate.hpp"
|
|
#include "MWTable.hpp"
|
|
#include "MWOptions.hpp"
|
|
#if !defined(NO_MR)
|
|
#include "review_playback.hpp"
|
|
#endif // !defined(NO_MR)
|
|
#include "HeatManager.hpp"
|
|
|
|
// MSL 5.06
|
|
#include "Weapon.hpp"
|
|
|
|
#include <Adept\NetStatCollector.hpp>
|
|
#include <Adept\EntityManager.hpp>
|
|
#include <Adept\Network.hpp>
|
|
#include <Adept\Application.hpp>
|
|
#include <Adept\audiorenderer.hpp>
|
|
|
|
#include <Stuff\NotationFile.hpp>
|
|
#include <direct.h>
|
|
#include <gosScript\gosScriptHeaders.hpp>
|
|
#include <gameOS\ToolOS.hpp>
|
|
#include <gameOS\Network.hpp>
|
|
#include <gameOS\GunGameList.h>
|
|
// jcem
|
|
#include <Adept\AudioCommand.hpp>
|
|
// end
|
|
|
|
#include <mbstring.h>
|
|
#include "missionlang\resource.h"
|
|
#include "..\ScriptStrings\resource.h" // scriptstrings.h - jcem
|
|
|
|
#include <MLR\MLRTexturePool.hpp>
|
|
|
|
// ngLog addition
|
|
#if !defined(NO_LOG)
|
|
#include "nglog_mw4.hpp"
|
|
#endif // !defined(NO_LOG)
|
|
|
|
#include "..\buildnum\buildnum.h"
|
|
|
|
#include "mechspecs.cpp"
|
|
|
|
// MSL 5.03 Mechview
|
|
void __stdcall CTCL_AfterBeginScene();
|
|
void __stdcall CTCL_UpdateMechView();
|
|
|
|
extern void (__stdcall *g_pfnCTCL_AfterBeginScene)();
|
|
#define MECHVIEW_GAP_TOP 20 // MechView Param - gap between top screen and mech-name-text
|
|
#define MECHVIEW_GAP_X 30 // MechView Param - left/right margin in radar(480 * 640) screen
|
|
#define MECHVIEW_GAP_Y 30 // MechView Param
|
|
#define MECHVIEW_GAP_ABOVE_MECH 20 // MechView Param - gap between mech-name-text & mech-image
|
|
#define MECHVIEW_GAP_UNDER_MECH 15 // MechView Param - gap between mech-image & text information
|
|
#define MECHVIEW_GAP_TEXTS 3 // MechView Param - gap between text information
|
|
//#define MECHVIEW_TIMETICKS 100 // MechView Param - time to display 1 still image - in msecs
|
|
#define MECHVIEW_TIMETICKS 90 // MechView Param - time to display 1 still image - in msecs
|
|
|
|
DWORD g_dwLastMechView = 0;
|
|
CMLCallData g_MLCallData;
|
|
////// MechView
|
|
|
|
// MSL 5.06
|
|
#define SHELLSCRIPTS_PATH "Content\\ShellScripts\\"
|
|
|
|
extern int __stdcall Mech4ReconnectGame();
|
|
void _stdcall CTCL_SetMissionParamsBy(void* pNMP, int nSize);
|
|
|
|
#define SCRIPTCALLBACK(func) int __stdcall func( void * instance, int args, void * arg[])
|
|
|
|
// jcem - start
|
|
#include <windows.h>
|
|
#include <WinBase.h>
|
|
#include <stdio.h>
|
|
#include <io.h>
|
|
|
|
#include <ddraw.h>
|
|
#include <d3d.h>
|
|
|
|
#include <GameOS\render.hpp>
|
|
|
|
#include "ctcls.h"
|
|
#include "ctcl.h"
|
|
#include "recscore.h" // jcem
|
|
#include "logreport.h"
|
|
|
|
extern char AssetsDirectory1[MAX_PATH];
|
|
typedef unsigned char* POINTER;
|
|
#include "logreport.cpp"
|
|
|
|
extern bool hsh_initialized;
|
|
// MSL 5.03 Mechview
|
|
extern int g_nMechViewType; // 0 - no mechview, 1 - on radar screen, 2 - on main screen
|
|
extern int g_nMR;
|
|
extern int g_nCoinCount;
|
|
extern int g_nCoinCountTemp;
|
|
extern int g_nCoinPerGame;
|
|
extern bool g_bUseCam;
|
|
extern bool g_bOldLOG;
|
|
extern char g_szTeslaInviter[128];
|
|
|
|
void _stdcall CTCL_SaveLogFileInfo(SYSTEMTIME& SysTime, const GUID& guid, char szPath[MAX_PATH], char szGUID[64]);
|
|
void _stdcall CTCL_SaveLogGameEnd(const SYSTEMTIME& SysTime, const GUID& guid, const char* pcszHost);
|
|
BOOL _stdcall CTCL_SaveLog(int nState, const NetMissionParameters::MWNetMissionParameters* params = NULL);
|
|
|
|
extern SCRIPTCALLBACK(CTCL_GetType);
|
|
extern SCRIPTCALLBACK(CTCL_IsConsole);
|
|
extern SCRIPTCALLBACK(CTCL_IsConsoleX);
|
|
extern SCRIPTCALLBACK(CTCL_Get);
|
|
extern SCRIPTCALLBACK(CTCL_Set);
|
|
extern SCRIPTCALLBACK(CTCL_SetCDSP);
|
|
extern SCRIPTCALLBACK(CTCL_GetTeamParams);
|
|
extern SCRIPTCALLBACK(CTCL_IsValidName);
|
|
extern SCRIPTCALLBACK(CTCL_DoMission);
|
|
extern SCRIPTCALLBACK(CTCL_AddPlayer);
|
|
extern SCRIPTCALLBACK(CTCL_GetMissionState);
|
|
extern SCRIPTCALLBACK(CTCL_DoBreak);
|
|
extern SCRIPTCALLBACK(CTCL_IsGameLoaded);
|
|
extern SCRIPTCALLBACK(CTCL_DoReprint);
|
|
extern SCRIPTCALLBACK(CTCL_CheckPlayMovie);
|
|
extern SCRIPTCALLBACK(CTCL_CheckCoinCounts);
|
|
extern SCRIPTCALLBACK(CTCL_CheckUseJPD);
|
|
extern SCRIPTCALLBACK(CTCL_GetPlayerName);
|
|
extern SCRIPTCALLBACK(CTCL_SetPlayerName);
|
|
extern SCRIPTCALLBACK(CTCL_CheckCOOP);
|
|
extern SCRIPTCALLBACK(CTCL_StartCOOP);
|
|
extern SCRIPTCALLBACK(CTCL_PosCOOP);
|
|
extern SCRIPTCALLBACK(CTCL_GetJoyInfo);
|
|
extern SCRIPTCALLBACK(CTCL_CheckCampaign);
|
|
extern SCRIPTCALLBACK(CTCL_SetDispStateCOOP);
|
|
extern SCRIPTCALLBACK(CTCL_CheckInviteCOOP);
|
|
extern SCRIPTCALLBACK(CTCL_DoInviteCOOP);
|
|
extern SCRIPTCALLBACK(CTCL_Inviter);
|
|
extern SCRIPTCALLBACK(TBL_GetResNames);
|
|
extern SCRIPTCALLBACK(CTCL_GetIncNums);
|
|
extern SCRIPTCALLBACK(CTCL_MiscFile);
|
|
extern SCRIPTCALLBACK(CTCL_GetACP);
|
|
extern SCRIPTCALLBACK(CTCL_IsBotAllowed);
|
|
// MSL 5.03 Mechview
|
|
extern SCRIPTCALLBACK(CTCL_MechViewOnMainScreen);
|
|
|
|
int g_nWhyPaused = 0; // 0: not paused - invitation in menu-state, 1: briefing, 2: score-sheet, 3: continue, 4: invited in single-game, 5: high-score(game-over?), 6: by ESC(for testing only)...
|
|
extern SCRIPTCALLBACK(CTCL_WhyPaused);
|
|
int g_nTimeList_Index = 3; // 3rd item in listbox...
|
|
int g_nTimeList_Value = 7; // 7 minutes
|
|
// MSL 5.06
|
|
int g_nMechVariant = 0;
|
|
int g_nMechLabOp = 0;
|
|
int g_nMechPodNum = 0;
|
|
int g_nBlackMech = 0;
|
|
|
|
void CTCL_CheckMech(SPlayerInfo& PI);
|
|
|
|
Time g_fLastGameStart = 0.0;
|
|
|
|
ResourceID g_CameraResID;
|
|
const char g_szCameraShip[] = "Camera Ship";
|
|
int g_naTeamSkins[16 + 1] = { 0, 1, 2, 3, 4, 5, 6, 7, 15, 19, 26, 23, 28, 30, 36, 37, 0 };
|
|
// MSL 5.02 Set Decals Here
|
|
int g_naTeamDecals[16 + 1] = { 3, 4, 2, 5, 6, 9, 50, 10, 11, 12, 16, 20, 21, 22, 24, 27, 0 };
|
|
int g_naFFADecals[37] = { 3, 4, 2, 5, 6, 9, 50, 10, 11, 12, 16, 20, 21, 22, 24, 27, 0, };
|
|
const char g_caCamoPrefixes[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0";
|
|
|
|
// Mech Datas
|
|
char** g_ppMech;
|
|
int* g_pStockIds;
|
|
|
|
void CTCL_API CTCL_InitMechDatas();
|
|
void CTCL_API CTCL_ClearMechDatas();
|
|
extern bool g_bCOOP; // COin OPeration
|
|
void AssignShellString(void* data[], int nIdx, const char* pcsz);
|
|
void AssignShellString(char** ppShellString, const char* pcsz);
|
|
|
|
void AssignShellString(void* data[], int nIdx, const char* pcsz)
|
|
{
|
|
AssignShellString(&STRPARM(nIdx), pcsz);
|
|
}
|
|
|
|
void AssignShellString(char** ppShellString, const char* pcsz)
|
|
{
|
|
FREEANDNULL(*ppShellString);
|
|
|
|
if (!pcsz) {
|
|
pcsz = "";
|
|
}
|
|
|
|
int nLen = strlen(pcsz) + 1;
|
|
*ppShellString = (char *)gos_Malloc(nLen);
|
|
memcpy(*ppShellString, pcsz, nLen);
|
|
}
|
|
|
|
class MiscFileEntry: public Stuff::Plug
|
|
{
|
|
private:
|
|
Stuff::MString m_FileName;
|
|
public:
|
|
MiscFileEntry(const char* pcszFileName);
|
|
Stuff::MString GetFileName() {Check_Object(this); return m_FileName;}
|
|
};
|
|
|
|
class MiscFileTable: public Stuff::Plug
|
|
{
|
|
public:
|
|
typedef Stuff::SortedChainIteratorOf<MiscFileEntry*, Stuff::MString> TableIterator;
|
|
public:
|
|
MString m_PathFormat;
|
|
int m_nMaxFiles;
|
|
MString m_UseDir;
|
|
int m_nCurIndex;
|
|
public:
|
|
MiscFileTable(const char* pcszPathFormat, int nMaxFiles = 0, const char* pcszUseDir = NULL);
|
|
~MiscFileTable();
|
|
void DoReadList();
|
|
TableIterator* MakeTableIterator() {Check_Object(this); return new TableIterator(&m_table);}
|
|
int GetTableSize() {Check_Object(this); return m_table.GetSize();}
|
|
MiscFileEntry* GetNthItem(int num) { Check_Object(this); return m_table.GetNth(num); }
|
|
private:
|
|
Stuff::SortedChainOf<MiscFileEntry *, Stuff::MString> m_table;
|
|
};
|
|
|
|
MiscFileEntry::MiscFileEntry(const char* pcszFileName)
|
|
: Plug(Plug::DefaultData), m_FileName(pcszFileName)
|
|
{
|
|
}
|
|
|
|
MiscFileTable::MiscFileTable(const char* pcszPathFormat, int nMaxFiles/* = 0*/, const char* pcszUseDir/* = NULL*/)
|
|
: Plug(Plug::DefaultData), m_table(NULL, true),
|
|
m_PathFormat(pcszPathFormat), m_nMaxFiles(nMaxFiles), m_UseDir(pcszUseDir), m_nCurIndex(0)
|
|
{
|
|
}
|
|
|
|
MiscFileTable::~MiscFileTable()
|
|
{
|
|
}
|
|
|
|
void MiscFileTable::DoReadList()
|
|
{
|
|
MString strDir(m_PathFormat);
|
|
strDir.IsolateDirectory();
|
|
const char* pcszDir = (0 < m_UseDir.GetLength()) ? m_UseDir: strDir;
|
|
|
|
Stuff::Directory resource_directory(m_PathFormat, true);
|
|
|
|
const char *file_name;
|
|
int nCount = 0;
|
|
while(((file_name = resource_directory.GetCurrentFileName()) != NULL) && ((m_nMaxFiles <= 0) || (nCount < m_nMaxFiles)))
|
|
{
|
|
MString FileName(pcszDir);
|
|
|
|
FileName += file_name;
|
|
|
|
MiscFileEntry& MFE = *new MiscFileEntry(FileName);
|
|
m_table.AddValue(&MFE, MFE.GetFileName());
|
|
nCount++;
|
|
|
|
resource_directory.AdvanceCurrentFile();
|
|
}
|
|
}
|
|
|
|
MiscFileTable* m_aMiscFileTables[3] =
|
|
{
|
|
NULL, NULL, NULL
|
|
};
|
|
|
|
HGOSAUDIO g_MusicSound4COOP = NULL;
|
|
// jcem - end
|
|
|
|
|
|
//========================================================================
|
|
// multiplayer options screen stuff
|
|
//========================================================================
|
|
#define FREE_PTR(ptr) if ((void *)ptr) { gos_Free((void *)ptr); (ptr)=NULL; }
|
|
extern SCRIPTCALLBACK(EnterMultiplayerOptionsScreen);
|
|
extern SCRIPTCALLBACK(LeaveMultiplayerOptionsScreen);
|
|
extern const char OPTIONS_INI[];
|
|
extern const char OPTIONS_SECTION[];
|
|
extern const char OPTIONS_SERVER_SECTION[];
|
|
extern const char OPTION_PLAYERNAME[];
|
|
extern const char OPTION_TEAMNAME[];
|
|
extern const char OPTION_PASSWORD[];
|
|
extern const char OPTION_USEPASSWORD[];
|
|
extern const char OPTION_PLAYERICON[];
|
|
extern const char OPTION_TEAMICON[];
|
|
extern const char OPTION_CONNECTIONNAME[];
|
|
extern const char OPTION_ALLOWDECALTRANSFER[];
|
|
extern const char OPTION_DEFAULTSERVERNAME[];
|
|
const char OPTIONS_INI[] = "options.ini";
|
|
const char OPTIONS_SECTION[] = "Network Options";
|
|
const char OPTIONS_SERVER_SECTION[] = "Server";
|
|
const char OPTION_PLAYERNAME[] = "PlayerName";
|
|
const char OPTION_TEAMNAME[] = "TeamName";
|
|
const char OPTION_PASSWORD[] = "Password";
|
|
const char OPTION_USEPASSWORD[] = "UsePassword";
|
|
const char OPTION_PLAYERICON[] = "PlayerIcon";
|
|
const char OPTION_TEAMICON[] = "TeamIcon";
|
|
const char OPTION_CONNECTIONNAME[] = "DefaultConnection";
|
|
const char OPTION_ALLOWDECALTRANSFER[] = "AllowDecalTransfer";
|
|
const char OPTION_DEFAULTSERVERNAME[] = "DefaultServerName";
|
|
//========================================================================
|
|
// end multiplayer options screen stuff
|
|
//========================================================================
|
|
|
|
|
|
int MW4Shell::numMechPrototypes = 0;
|
|
int MW4Shell::numMissions = 0;
|
|
char** MW4Shell::mechPrototypeNames = NULL;
|
|
char** MW4Shell::mechPrototypeFilenames = NULL;
|
|
char** MW4Shell::missionNames = NULL;
|
|
char** MW4Shell::missionFilenames = NULL;
|
|
|
|
int MW4Shell::vehicleID = -1;
|
|
int MW4Shell::missionID = -1;
|
|
|
|
|
|
int MW4Shell::ServerScale = 1024;
|
|
int MW4Shell::ClientScale = 1024;
|
|
double MW4Shell::TimeToLowerServerScale = 0;
|
|
double MW4Shell::TimeToLowerClientScale = 0;
|
|
namespace ABL
|
|
{
|
|
extern bool g_MissionMusic;
|
|
extern int GetEnemyTyps(int id_group, char** ppNames, int* pnCounts, int nMask);
|
|
}
|
|
|
|
int _stdcall ImeCallback(void *, int, void *data[])
|
|
{
|
|
int nCallId = VALUEPARM(0);
|
|
|
|
switch(nCallId)
|
|
{
|
|
case 0: // Check if IME is enabled
|
|
extern DWORD g_bDisableImeCompletely;
|
|
return g_bDisableImeCompletely ? 0 : 1;
|
|
case 1: // Call gos_SetIME
|
|
gos_SetIMEInsertMode(INTPARM(1) ? true : false);
|
|
return 0;
|
|
case 2:
|
|
return (int)gos_GetMachineInformation(gos_Info_GetIMECaretStatus);
|
|
};
|
|
return 0;
|
|
}
|
|
|
|
// used for call to gos_NetSetAdvertItem
|
|
//const char MAP_NAME_KEY[] = "Map Type"; // map name
|
|
//const char GAME_TYPE_KEY[] = "Game Type"; // game type name (i.e. ctf,koth,stb)
|
|
|
|
MW4Shell
|
|
*MW4Shell::Instance = NULL;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
MW4Shell::MW4Shell():
|
|
mechPrototypeList(NULL),
|
|
alphaMechNames(NULL, true)
|
|
{
|
|
if (!MWApplication::GetInstance()->Win32DedicatedServer)
|
|
gosScript_InitializeProcessor();
|
|
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
m_dwShellResources = gos_OpenResourceDLL("ScriptStrings.dll"); // jcem...
|
|
|
|
m_iaMissionName = (char *)gos_Malloc(256);
|
|
Str_Copy(m_iaMissionName, "No Mission Selected", 256);
|
|
|
|
m_endMovieName = (char *)gos_Malloc(256);
|
|
Str_Copy(m_endMovieName, "", 256);
|
|
|
|
m_LastMechName = (char *)gos_Malloc(256);
|
|
Str_Copy(m_LastMechName, "",256);
|
|
m_lastMechIndex = 0;
|
|
|
|
|
|
m_iaMissionCount = 0;
|
|
m_mechCount = 0;
|
|
m_listBoxSize = 60;
|
|
|
|
m_didSetMPMech = false;
|
|
|
|
shellCommand = MW4Shell::NoShellCommand;
|
|
currentShellRunning = MW4Shell::NoShellRunning;
|
|
|
|
missionID = -1;
|
|
vehicleID = -1;
|
|
missionNum = 0;
|
|
|
|
ia_gameType = IA_MISSIONSELECTION;
|
|
|
|
LoadMechPrototypes();
|
|
LoadMissions();
|
|
|
|
StartUp();
|
|
|
|
alphaMechNamesWithMCSorted = NULL;
|
|
|
|
m_doesHaveLoadGame = false;
|
|
firstRun = true;
|
|
loadingScript = NULL;
|
|
statScript = NULL;
|
|
netServerScript = NULL;
|
|
netClientScript = NULL;
|
|
netScoreScript = NULL;
|
|
netMissionReviewScript = NULL;
|
|
m_optionsFile = NULL;
|
|
m_optionsObject = NULL;
|
|
|
|
m_mapInfo = NULL;
|
|
m_mapAuthor = NULL;
|
|
m_mapLink = NULL;
|
|
m_mapLinkAvailable = 0;
|
|
|
|
m_skinPrefix = DefaultSkinPrefix;
|
|
m_teamDecal = "\0";
|
|
m_pilotDecal = "\0";
|
|
|
|
m_currentChatCount = 0;
|
|
m_maxChatCount = 25;
|
|
m_outgoingChat = NULL;
|
|
m_outgoingChatToPlayerCount = 0;
|
|
|
|
|
|
m_gameTypeStr = NULL;
|
|
|
|
m_chatArray = new char*[50];
|
|
m_chatFrom = new char*[50];
|
|
|
|
for (int i = 0; i < 50; ++i)
|
|
{
|
|
m_chatArray[i] = NULL;
|
|
m_chatFrom[i] = NULL;
|
|
}
|
|
|
|
|
|
m_scoreNames = new char*[32];
|
|
for (i = 0; i < 32; ++i)
|
|
{
|
|
m_scoreNames[i] = NULL;
|
|
m_scoreScores[i] = 0;
|
|
m_scoreKills[i] = 0;
|
|
m_scoreDeaths[i] = 0;
|
|
m_scorePlyrs[i] = 0;
|
|
}
|
|
for (i = 0; i < 8; ++i)
|
|
{
|
|
m_scoreTeamCounts[i] = 0;
|
|
m_scoreTeamScores[i] = 0;
|
|
m_scoreTeamKills[i] = 0;
|
|
m_scoreTeamDeaths[i] = 0;
|
|
}
|
|
m_scoreRuleType = 0;
|
|
m_scoreMapName = new char[256];
|
|
m_scoreTeamAllowed = 0;
|
|
m_scoreCount = 0;
|
|
m_scorePlyrIndex = -1;
|
|
|
|
m_serverName = new char[256];
|
|
m_serverIP = new char[256];
|
|
m_serverCPU = new char[256];
|
|
|
|
pauseScript = NULL;
|
|
pauseOptionsScript = NULL;
|
|
|
|
m_mechIDs = NULL;
|
|
m_stockMechIDs = NULL;
|
|
gos_PopCurrentHeap();
|
|
|
|
networkScenarioCount = 0;
|
|
maxNetworkScenarioCount = 0;
|
|
selectedScenario = -1;
|
|
currentCycleNumber = 0;
|
|
|
|
for (i = 0; i < 256; ++i)
|
|
{
|
|
scenarios[i].missionName[0] = '\0';
|
|
scenarios[i].longMissionName[0] = '\0';
|
|
scenarios[i].scenarioName[0] = '\0';
|
|
scenarios[i].scenarioTag[0] = '\0';
|
|
scenarios[i].usermissions = false;
|
|
|
|
cycleList[i].missionName[0] = '\0';
|
|
cycleList[i].longMissionName[0] = '\0';
|
|
cycleList[i].scenarioName[0] = '\0';
|
|
cycleList[i].scenarioTag[0] = '\0';
|
|
cycleList[i].usermissions = false;
|
|
cycleList[i].ruleType = -1;
|
|
|
|
}
|
|
|
|
lastRuleType = -1;
|
|
|
|
InitMovieList();
|
|
|
|
{for(int kk = 0; kk < sizeof(m_aMiscFileTables) / sizeof(m_aMiscFileTables[0]); kk++)
|
|
{
|
|
MiscFileTable*& pp = m_aMiscFileTables[kk];
|
|
gosASSERT(pp == NULL);
|
|
const char* pcszPathFormat = NULL;
|
|
const char* pcszUseDir = NULL;
|
|
switch(kk)
|
|
{
|
|
case 0:
|
|
pcszPathFormat = "hsh\\coop\\movies\\*.avi";
|
|
break;
|
|
case 1:
|
|
pcszPathFormat = "hsh\\coop\\musics\\*.wav";
|
|
break;
|
|
case 2:
|
|
pcszPathFormat = "hsh\\coop\\gmusics\\*.wav";
|
|
pcszUseDir = "content\\audio\\music\\";
|
|
break;
|
|
}
|
|
MiscFileTable& tbl = *new MiscFileTable(pcszPathFormat, 0, pcszUseDir);
|
|
tbl.DoReadList();
|
|
|
|
pp = &tbl;
|
|
}}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
MW4Shell::~MW4Shell()
|
|
{
|
|
{for(int kk = 0; kk < sizeof(m_aMiscFileTables) / sizeof(m_aMiscFileTables[0]); kk++)
|
|
{
|
|
MiscFileTable*& pp = m_aMiscFileTables[kk];
|
|
if (pp) {
|
|
delete pp;
|
|
pp = NULL;
|
|
}
|
|
}}
|
|
|
|
CTCL_ClearMechDatas(); // jcem
|
|
|
|
gos_Free(m_iaMissionName);
|
|
gos_Free(m_endMovieName);
|
|
gos_Free(m_LastMechName);
|
|
|
|
for (int i = 0; i < 50; i++)
|
|
{
|
|
if (m_chatArray[i] != NULL)
|
|
delete m_chatArray[i];
|
|
|
|
if (m_chatFrom != NULL)
|
|
delete m_chatFrom[i];
|
|
}
|
|
|
|
|
|
delete[] m_chatArray;
|
|
delete[] m_chatFrom;
|
|
|
|
|
|
for (i = 0; i < 32; i++)
|
|
{
|
|
if (m_scoreNames[i] != NULL)
|
|
delete [] m_scoreNames[i];
|
|
}
|
|
|
|
delete[] m_scoreNames;
|
|
delete[] m_scoreMapName;
|
|
m_scoreCount = 0;
|
|
m_scorePlyrIndex = -1;
|
|
m_scoreTeamAllowed = 0;
|
|
|
|
delete[] m_serverName;
|
|
delete[] m_serverIP;
|
|
delete[] m_serverCPU;
|
|
|
|
for (i = 0; i < numMechPrototypes; i++)
|
|
delete [] mechPrototypeNames[i];
|
|
|
|
delete [] mechPrototypeNames;
|
|
|
|
for (i = 0; i < numMechPrototypes; i++)
|
|
delete [] mechPrototypeFilenames[i];
|
|
|
|
delete [] mechPrototypeFilenames;
|
|
|
|
for (i = 0; i < numMissions; i++)
|
|
delete [] missionNames[i];
|
|
|
|
delete [] missionNames;
|
|
|
|
for (i = 0; i < numMissions; i++)
|
|
delete [] missionFilenames[i];
|
|
|
|
delete [] missionFilenames;
|
|
|
|
ChainIteratorOf<MechPrototype*> prototypes(&mechPrototypeList);
|
|
prototypes.DeletePlugs();
|
|
|
|
ShutDown();
|
|
|
|
if(MechLab::Instance)
|
|
{
|
|
delete MechLab::Instance;
|
|
MechLab::Instance = NULL;
|
|
}
|
|
if(m_mechIDs)
|
|
{
|
|
gos_Free(m_mechIDs);
|
|
}
|
|
if(m_stockMechIDs)
|
|
{
|
|
gos_Free(m_stockMechIDs);
|
|
}
|
|
|
|
if (m_mapInfo)
|
|
{
|
|
delete m_mapInfo;
|
|
m_mapInfo = NULL;
|
|
}
|
|
|
|
|
|
if (m_mapAuthor)
|
|
{
|
|
delete m_mapAuthor;
|
|
m_mapAuthor = NULL;
|
|
}
|
|
|
|
if (m_mapLink)
|
|
{
|
|
delete m_mapLink;
|
|
m_mapLink = NULL;
|
|
}
|
|
m_mapLinkAvailable = 0;
|
|
ResetMovieList();
|
|
|
|
if(m_optionsObject)
|
|
delete m_optionsObject;
|
|
if(m_optionsFile)
|
|
delete m_optionsFile;
|
|
|
|
alphaMechNames.DeletePlugs();
|
|
if (alphaMechNamesWithMCSorted)
|
|
delete [] alphaMechNamesWithMCSorted;
|
|
|
|
if (!MWApplication::GetInstance()->Win32DedicatedServer)
|
|
gosScript_ShutdownProcessor();
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::EndAllScripts()
|
|
{
|
|
gosScript_EndAllScripts();
|
|
|
|
loadingScript = NULL;
|
|
pauseScript = NULL;
|
|
pauseOptionsScript = NULL;
|
|
statScript = NULL;
|
|
|
|
netServerScript = NULL;
|
|
netClientScript = NULL;
|
|
netScoreScript = NULL;
|
|
netMissionReviewScript = NULL;
|
|
|
|
currentShellRunning = MW4Shell::NoShellRunning;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartUp()
|
|
{
|
|
|
|
m_moviePlaying = 0;
|
|
m_moviesStopped = 0;
|
|
if (MWApplication::GetInstance()->Win32DedicatedServer)
|
|
return;
|
|
|
|
// jcem - start
|
|
gosScript_RegisterCallback("CTCL_GetType",&CTCL_GetType,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_IsConsole",&CTCL_IsConsole,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_IsConsoleX",&CTCL_IsConsoleX,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_Get",&CTCL_Get,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_Set",&CTCL_Set,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_SetCDSP",&CTCL_SetCDSP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_GetTeamParams",&CTCL_GetTeamParams,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_IsValidName",&CTCL_IsValidName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_DoMission",&CTCL_DoMission,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_AddPlayer",&CTCL_AddPlayer,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_GetMissionState",&CTCL_GetMissionState,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_DoBreak",&CTCL_DoBreak,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_IsGameLoaded",&CTCL_IsGameLoaded,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_DoReprint",&CTCL_DoReprint,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_CheckPlayMovie",&CTCL_CheckPlayMovie,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_CheckCoinCounts",&CTCL_CheckCoinCounts,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_CheckUseJPD",&CTCL_CheckUseJPD,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_GetPlayerName",&CTCL_GetPlayerName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_SetPlayerName",&CTCL_SetPlayerName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_CheckCOOP",&CTCL_CheckCOOP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_StartCOOP",&CTCL_StartCOOP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_PosCOOP",&CTCL_PosCOOP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_GetJoyInfo",&CTCL_GetJoyInfo,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_CheckCampaign",&CTCL_CheckCampaign,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_SetDispStateCOOP",&CTCL_SetDispStateCOOP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_CheckInviteCOOP",&CTCL_CheckInviteCOOP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_DoInviteCOOP",&CTCL_DoInviteCOOP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_Inviter",&CTCL_Inviter,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("TBL_GetResNames",&TBL_GetResNames,GOSVAR_INT,0,NULL);
|
|
// MSL 5.03 Mechview
|
|
gosScript_RegisterCallback("CTCL_GetIncNums",&CTCL_GetIncNums,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_MiscFile",&CTCL_MiscFile,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_GetACP",&CTCL_GetACP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_IsBotAllowed",&CTCL_IsBotAllowed,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("CTCL_MechViewOnMainScreen",&CTCL_MechViewOnMainScreen,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CTCL_WhyPaused",&CTCL_WhyPaused,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterVariable("g_nTimeList_Index", &g_nTimeList_Index, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("g_nTimeList_Value", &g_nTimeList_Value, GOSVAR_INT, 0, NULL);
|
|
// MSL 5.06
|
|
gosScript_RegisterVariable("g_nMechVariant", &g_nMechVariant, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("g_nMechLabOp", &g_nMechLabOp, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("g_nMechPodNum", &g_nMechPodNum, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("g_nBlackMech", &g_nBlackMech, GOSVAR_INT, 0, NULL);
|
|
// jcem - end
|
|
|
|
gosScript_RegisterVariable("m_moviePlaying", &m_moviePlaying, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_moviesStopped", &m_moviesStopped, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_listBoxSize", &m_listBoxSize, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("DemoMode", &MWApplication::DemoMode, GOSVAR_INT, 0, NULL);
|
|
|
|
|
|
gosScript_RegisterCallback("SetNetworkMissionParamater",&SetNetworkMissionParamater,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetLocalNetworkMissionParamater",&GetLocalNetworkMissionParamater,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetServerNetworkMissionParamater",&GetServerNetworkMissionParamater,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("NetConnectedToServer",&NetConnectedToServer,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("NetClientVehicleAccepted",&NetClientVehicleAccepted,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("GetVehicleRejectionReason",&GetVehicleRejectionReason,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetVehicleRejectionReasonCount",&GetVehicleRejectionReasonCount,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("GetBotVehicleRejectionReason",&GetBotVehicleRejectionReason,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotVehicleRejectionReasonCount",&GetBotVehicleRejectionReasonCount,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("ClearLocalRestrictions",&ClearLocalRestrictions,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("CheckForLocalRestrictions",&CheckForLocalRestrictions,GOSVAR_INT,0,NULL);
|
|
|
|
|
|
gosScript_RegisterCallback("NetHaveMap",&NetHaveMap,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("NetLaunchBrowserMapLink",&NetLaunchBrowserMapLink,GOSVAR_INT,0,NULL);
|
|
|
|
|
|
gosScript_RegisterCallback("GetClientReady",&GetClientReady,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetClientReady",&SetClientReady,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetClientUnready",&SetClientUnready,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("SendVehicleRequest",&SendVehicleRequest,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("RequestTeam",&RequestTeam,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("GetStartScreen",&GetStartScreen,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetMechName",&GetMechName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SelectMech",&SelectMech,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("SelectSkin",&SelectSkin,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("SetShellCommand",&SetShellCommand,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("LoadQuickSave",&LoadQuickSave,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SaveQuickSave",&SaveQuickSave,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetVideoRes",&SetVideoRes,GOSVAR_INT,0,NULL);
|
|
|
|
// mdm - for game type management at the script level
|
|
gosScript_RegisterCallback("GetGameTypeString", &GetGameTypeString, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterCallback("GetGameTypeFromString", &GetGameTypeFromString, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_gameTypeStr", &m_gameTypeStr, GOSVAR_STRING, 0, NULL );
|
|
// mdm - to check the gun status for advertising a game
|
|
gosScript_RegisterCallback("CheckGUNAdvertise", &CheckGUNAdvertise,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("RemoveOneChat",&RemoveOneChat,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SendChat",&SendChat,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SendBroadcastChat",&SendBroadcastChat,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterVariable("m_currentChatCount", &m_currentChatCount, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_maxChatCount", &m_maxChatCount, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_chatFrom", &m_chatFrom, GOSVAR_STRING, 50, NULL);
|
|
gosScript_RegisterVariable("m_chatArray", &m_chatArray, GOSVAR_STRING, 50, NULL);
|
|
gosScript_RegisterVariable("m_outgoingChat", &m_outgoingChat, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_outgoingChatToPlayerCount", &m_outgoingChatToPlayerCount, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_outgiongChatToPlayer", &m_outgiongChatToPlayer, GOSVAR_INT, 32, NULL);
|
|
|
|
gosScript_RegisterVariable("m_serverName",&m_serverName, GOSVAR_STRING,0,NULL);
|
|
gosScript_RegisterVariable("m_serverIP",&m_serverIP, GOSVAR_STRING,0,NULL);
|
|
|
|
gosScript_RegisterVariable("m_scoreNames", &m_scoreNames, GOSVAR_STRING, 32, NULL);
|
|
gosScript_RegisterVariable("m_scoreCount", &m_scoreCount, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_scorePlyrIndex", &m_scorePlyrIndex, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_scoreScores", &m_scoreScores, GOSVAR_INT, 32, NULL);
|
|
gosScript_RegisterVariable("m_scoreDeaths", &m_scoreDeaths, GOSVAR_INT, 32, NULL);
|
|
gosScript_RegisterVariable("m_scorePlyrs", &m_scorePlyrs, GOSVAR_INT, 32, NULL);
|
|
gosScript_RegisterVariable("m_scoreKills", &m_scoreKills, GOSVAR_INT, 32, NULL);
|
|
gosScript_RegisterVariable("m_scoreTeamCounts", &m_scoreTeamCounts, GOSVAR_INT, 8, NULL);
|
|
gosScript_RegisterVariable("m_scoreTeamScores", &m_scoreTeamScores, GOSVAR_INT, 8, NULL);
|
|
gosScript_RegisterVariable("m_scoreTeamDeaths", &m_scoreTeamDeaths, GOSVAR_INT, 8, NULL);
|
|
gosScript_RegisterVariable("m_scoreTeamKills", &m_scoreTeamKills, GOSVAR_INT, 8, NULL);
|
|
gosScript_RegisterVariable("m_scoreRuleType", &m_scoreRuleType, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_scoreMapName", &m_scoreMapName, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_scoreTeamAllowed", &m_scoreTeamAllowed, GOSVAR_INT, 0, NULL);
|
|
|
|
|
|
|
|
gosScript_RegisterCallback("MyPlayerId",&MyPlayerId,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("IsPlayerConnectionValid",&IsPlayerConnectionValid,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionName",&GetPlayerConnectionName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionClan",&GetPlayerConnectionClan,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionReady",&GetPlayerConnectionReady,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionLaunched",&GetPlayerConnectionLaunched,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionChasis",&GetPlayerConnectionChasis,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionTeam",&GetPlayerConnectionTeam,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerConnectionSkin",&GetPlayerConnectionSkin,GOSVAR_INT,0,NULL);
|
|
|
|
|
|
|
|
gosScript_RegisterCallback("AddBot",&AddBot,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("RemoveBot",&RemoveBot,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("RemoveAllBots",&RemoveAllBots,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetTeamBot",&SetTeamBot,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetMechBot",&SetMechBot,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotValid",&GetBotValid,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotName",&GetBotName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotClan",&GetBotClan,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotChasis",&GetBotChasis,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotTeam",&GetBotTeam,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetBotVehicleAccepted",&GetBotVehicleAccepted,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("FillTeams",&FillTeams,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("GetTimeToLaunch",&GetTimeToLaunch,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetTimeToLaunchLock",&GetTimeToLaunchLock,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetTimeToGameEnd",&GetTimeToGameEnd,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("GetNetworkError",&GetNetworkError,GOSVAR_INT,0,NULL);
|
|
|
|
|
|
|
|
gosScript_RegisterCallback("ServerStatsDirty",&ServerStatsDirty,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("ServerStatsScale",&ServerStatsScale,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("ClientStatsScale",&ClientStatsScale,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("ServerCleanDirtyFlag",&ServerCleanDirtyFlag,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetCurrentGameName",&GetCurrentGameName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetCurrentMissionName",&GetCurrentMissionName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerCount",&GetPlayerCount,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("IsPlayerValid",&IsPlayerValid,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerName",&GetPlayerName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetStatisticsCount",&GetStatisticsCount,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetStatisticName",&GetStatisticName,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetStatisticbps",&GetStatisticbps,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetStatisticLifeTimeTotal",&GetStatisticLifeTimeTotal,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayersbps",&GetPlayersbps,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayerPing",&GetPlayerPing,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayersIncommingPacketsPerSecond",&GetPlayersIncommingPacketsPerSecond,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetPlayersOutgoingPacketsPerSecond",&GetPlayersOutgoingPacketsPerSecond,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetGameTime",&GetGameTime,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetRealTime",&GetRealTime,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetRealDate",&GetRealDate,GOSVAR_INT,0,NULL);
|
|
|
|
|
|
//This is the only real one that should exist
|
|
gosScript_RegisterCallback("Shell_CallbackHandler",&Shell_CallbackHandler,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterVariable("m_iaMissionName", &m_iaMissionName, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_endMovieName", &m_endMovieName, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_iaMissionCount", &m_iaMissionCount, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_mechCount", &m_mechCount, GOSVAR_INT, 0, NULL);
|
|
|
|
|
|
gosScript_RegisterVariable("m_LastMechName", &m_LastMechName, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_lastMechIndex", &m_lastMechIndex, GOSVAR_INT, 0, NULL);
|
|
|
|
|
|
gosScript_RegisterVariable("m_mapInfo", &m_mapInfo, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_mapAuthor", &m_mapAuthor, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_mapLink", &m_mapLink, GOSVAR_STRING, 0, NULL);
|
|
gosScript_RegisterVariable("m_mapLinkAvailable", &m_mapLinkAvailable, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("m_serverCPU", &m_serverCPU, GOSVAR_STRING, 0, NULL);
|
|
|
|
|
|
gosScript_RegisterVariable("networkScenarioCount", &networkScenarioCount, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterVariable("maxNetworkScenarioCount", &maxNetworkScenarioCount, GOSVAR_INT, 0, NULL);
|
|
|
|
gosScript_RegisterCallback("InitNetworkScenarios",&InitNetworkScenarios,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetNetworkScenarios",&GetNetworkScenarios,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SelectNetworkScenario",&SelectNetworkScenario,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetScenarioCount",&GetScenarioCount,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback("GetDecalCount",&GetDecalCount,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("GetDecalNames",&GetDecalNames,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetTeamDecal",&SetTeamDecal,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SetPilotDecal",&SetPilotDecal,GOSVAR_INT,0,NULL);
|
|
|
|
gosScript_RegisterCallback( "GetWeaponStats", &gosGetWeaponStats, GOSVAR_INT, 0, NULL );
|
|
|
|
gosScript_RegisterCallback("BanPlayer",&BanPlayer,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("BanPlayersISP",&BanPlayersISP,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("KickPlayer",&KickPlayer,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("SquelchPlayer",&SquelchPlayer,GOSVAR_INT,0,NULL);
|
|
gosScript_RegisterCallback("IsPlayerSquelched",&IsPlayerSquelched,GOSVAR_INT,0,NULL);
|
|
|
|
|
|
gosScript_RegisterCallback("IsMissionReviewAvailable",&IsMissionReviewAvailable,GOSVAR_INT,0,NULL);
|
|
|
|
// ngLog additions
|
|
gosScript_RegisterCallback("IsRegisteredForStats", &IsRegisteredForStats, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterCallback("ViewStatsInBrowser", &ViewStatsInBrowser, GOSVAR_INT, 0, NULL);
|
|
|
|
gosScript_RegisterCallback("EnterMultiplayerOptionsScreen", &EnterMultiplayerOptionsScreen, GOSVAR_INT, 0, NULL);
|
|
gosScript_RegisterCallback("LeaveMultiplayerOptionsScreen", &LeaveMultiplayerOptionsScreen, GOSVAR_INT, 0, NULL);
|
|
|
|
gosScript_RegisterCallback("ImeCallback", &ImeCallback, GOSVAR_INT, 0, NULL);
|
|
gos_SetIMELevel(2);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::ShutDown()
|
|
{
|
|
if (MWApplication::GetInstance()->Win32DedicatedServer)
|
|
return;
|
|
|
|
gosScript_UnregisterVariable("m_moviePlaying");
|
|
gosScript_UnregisterVariable("m_moviesStopped");
|
|
gosScript_UnregisterVariable("m_listBoxSize");
|
|
gosScript_UnregisterVariable("DemoMode");
|
|
|
|
gosScript_UnregisterVariable("SetNetworkMissionParamater");
|
|
gosScript_UnregisterVariable("GetLocalNetworkMissionParamater");
|
|
gosScript_UnregisterVariable("GetServerNetworkMissionParamater");
|
|
gosScript_UnregisterVariable("NetConnectedToServer");
|
|
gosScript_UnregisterVariable("NetClientVehicleAccepted");
|
|
gosScript_UnregisterVariable("GetVehicleRejectionReason");
|
|
gosScript_UnregisterVariable("GetVehicleRejectionReasonCount");
|
|
|
|
|
|
gosScript_UnregisterVariable("GetBotVehicleRejectionReason");
|
|
gosScript_UnregisterVariable("GetBotVehicleRejectionReasonCount");
|
|
gosScript_UnregisterVariable("ClearLocalRestrictions");
|
|
gosScript_UnregisterVariable("CheckForLocalRestrictions");
|
|
|
|
|
|
|
|
|
|
gosScript_UnregisterVariable("NetHaveMap");
|
|
gosScript_UnregisterVariable("NetLaunchBrowserMapLink");
|
|
|
|
|
|
gosScript_UnregisterVariable("SendVehicleRequest");
|
|
gosScript_UnregisterVariable("SetClientUnready");
|
|
gosScript_UnregisterVariable("SetClientReady");
|
|
gosScript_UnregisterVariable("GetClientReady");
|
|
|
|
gosScript_UnregisterVariable("RequestTeam");
|
|
gosScript_UnregisterVariable("SetVideoRes");
|
|
gosScript_UnregisterVariable("LoadQuickSave");
|
|
gosScript_UnregisterVariable("SaveQuickSave");
|
|
gosScript_UnregisterVariable("SetShellCommand");
|
|
gosScript_UnregisterVariable("GetMechName");
|
|
gosScript_UnregisterVariable("SelectMech");
|
|
gosScript_UnregisterVariable("SelectSkin");
|
|
gosScript_UnregisterVariable("GetStartScreen");
|
|
|
|
gosScript_UnregisterVariable("m_serverName");
|
|
gosScript_UnregisterVariable("m_serverIP");
|
|
|
|
gosScript_UnregisterCallback("RemoveOneChat");
|
|
gosScript_UnregisterCallback("SendChat");
|
|
gosScript_UnregisterCallback("SendBroadcastChat");
|
|
gosScript_UnregisterVariable("m_currentChatCount");
|
|
gosScript_UnregisterVariable("m_maxChatCount");
|
|
gosScript_UnregisterVariable("m_chatFrom");
|
|
gosScript_UnregisterVariable("m_chatArray");
|
|
gosScript_UnregisterVariable("m_outgoingChat");
|
|
gosScript_UnregisterVariable("m_outgoingChatToPlayerCount");
|
|
gosScript_UnregisterVariable("m_outgiongChatToPlayer");
|
|
|
|
gosScript_UnregisterVariable("m_scoreNames");
|
|
gosScript_UnregisterVariable("m_scorePlyrIndex");
|
|
gosScript_UnregisterVariable("m_scoreCount");
|
|
gosScript_UnregisterVariable("m_scorePlyrs");
|
|
gosScript_UnregisterVariable("m_scoreDeaths");
|
|
gosScript_UnregisterVariable("m_scoreKills");
|
|
gosScript_UnregisterVariable("m_scoreScores");
|
|
gosScript_UnregisterVariable("m_scoreTeamCounts");
|
|
gosScript_UnregisterVariable("m_scoreTeamDeaths");
|
|
gosScript_UnregisterVariable("m_scoreTeamKills");
|
|
gosScript_UnregisterVariable("m_scoreTeamScores");
|
|
gosScript_UnregisterVariable("m_scoreRuleType");
|
|
gosScript_UnregisterVariable("m_scoreMapName");
|
|
gosScript_UnregisterVariable("m_scoreTeamAllowed");
|
|
|
|
gosScript_UnregisterVariable("m_gameTypeStr");
|
|
|
|
gosScript_UnregisterVariable("MyPlayerId");
|
|
gosScript_UnregisterVariable("IsPlayerConnectionValid");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionName");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionClan");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionReady");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionLaunched");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionChasis");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionTeam");
|
|
gosScript_UnregisterVariable("GetPlayerConnectionSkin");
|
|
|
|
|
|
gosScript_UnregisterVariable("AddBot");
|
|
gosScript_UnregisterVariable("RemoveBot");
|
|
gosScript_UnregisterVariable("RemoveAllBots");
|
|
gosScript_UnregisterVariable("SetTeamBot");
|
|
gosScript_UnregisterVariable("SetMechBot");
|
|
gosScript_UnregisterVariable("GetBotValid");
|
|
gosScript_UnregisterVariable("GetBotName");
|
|
gosScript_UnregisterVariable("GetBotClan");
|
|
gosScript_UnregisterVariable("GetBotChasis");
|
|
gosScript_UnregisterVariable("GetBotTeam");
|
|
gosScript_UnregisterVariable("GetBotVehicleAccepted");
|
|
gosScript_UnregisterVariable("FillTeams");
|
|
|
|
gosScript_UnregisterVariable("GetTimeToLaunch");
|
|
gosScript_UnregisterVariable("GetTimeToLaunchLock");
|
|
gosScript_UnregisterVariable("GetTimeToGameEnd");
|
|
|
|
gosScript_UnregisterVariable("GetNetworkError");
|
|
|
|
|
|
gosScript_UnregisterVariable("ServerStatsDirty");
|
|
gosScript_UnregisterVariable("ServerStatsScale");
|
|
gosScript_UnregisterVariable("ClientStatsScale");
|
|
gosScript_UnregisterVariable("ServerCleanDirtyFlag");
|
|
gosScript_UnregisterVariable("GetCurrentGameName");
|
|
gosScript_UnregisterVariable("GetCurrentMissionName");
|
|
gosScript_UnregisterVariable("GetPlayerCount");
|
|
gosScript_UnregisterVariable("IsPlayerValid");
|
|
gosScript_UnregisterVariable("GetPlayerName");
|
|
gosScript_UnregisterVariable("GetStatisticsCount");
|
|
gosScript_UnregisterVariable("GetStatisticName");
|
|
gosScript_UnregisterVariable("GetStatisticbps");
|
|
gosScript_UnregisterVariable("GetStatisticLifeTimeTotal");
|
|
gosScript_UnregisterVariable("GetPlayersbps");
|
|
gosScript_UnregisterVariable("GetPlayerPing");
|
|
gosScript_UnregisterVariable("GetPlayersIncommingPacketsPerSecond");
|
|
gosScript_UnregisterVariable("GetPlayersOutgoingPacketsPerSecond");
|
|
gosScript_UnregisterVariable("GetGameTime");
|
|
gosScript_UnregisterVariable("GetRealTime");
|
|
gosScript_UnregisterVariable("GetRealDate");
|
|
|
|
//Again this in the only one that should exist
|
|
gosScript_UnregisterCallback("Shell_CallbackHandler");
|
|
gosScript_UnregisterVariable("m_iaMissionName");
|
|
gosScript_UnregisterVariable("m_endMovieName");
|
|
gosScript_UnregisterVariable("m_iaMissionCount");
|
|
gosScript_UnregisterVariable("m_mechCount");
|
|
|
|
gosScript_UnregisterVariable("m_LastMechName");
|
|
gosScript_UnregisterVariable("m_lastMechIndex");
|
|
|
|
|
|
gosScript_UnregisterVariable("m_mapInfo");
|
|
gosScript_UnregisterVariable("m_mapAuthor");
|
|
gosScript_UnregisterVariable("m_mapLink");
|
|
gosScript_UnregisterVariable("m_mapLinkAvailable");
|
|
gosScript_UnregisterVariable("m_serverCPU");
|
|
|
|
gosScript_UnregisterVariable("networkScenarioCount");
|
|
gosScript_UnregisterVariable("maxNetworkScenarioCount");
|
|
gosScript_UnregisterCallback("InitNetworkScenarios");
|
|
gosScript_UnregisterCallback("GetNetworkScenarios");
|
|
gosScript_UnregisterCallback("SelectNetworkScenario");
|
|
gosScript_UnregisterCallback("GetScenarioCount");
|
|
|
|
gosScript_UnregisterCallback("GetDecalCount");
|
|
gosScript_UnregisterCallback("GetDecalNames");
|
|
gosScript_UnregisterCallback("SetTeamDecal");
|
|
gosScript_UnregisterCallback("SetPilotDecal");
|
|
|
|
gosScript_UnregisterCallback( "GetWeaponStats" );
|
|
|
|
gosScript_UnregisterCallback("BanPlayer");
|
|
gosScript_UnregisterCallback("BanPlayersISP");
|
|
gosScript_UnregisterCallback("KickPlayer");
|
|
gosScript_UnregisterCallback("SquelchPlayer");
|
|
gosScript_UnregisterCallback("IsPlayerSquelched");
|
|
|
|
gosScript_UnregisterCallback("IsMissionReviewAvailable");
|
|
|
|
// ngLog additions
|
|
gosScript_UnregisterCallback("IsRegisteredForStats");
|
|
gosScript_UnregisterCallback("ViewStatsInBrowser");
|
|
|
|
gosScript_UnregisterCallback("EnterMultiplayerOptionsScreen");
|
|
gosScript_UnregisterCallback("LeaveMultiplayerOptionsScreen");
|
|
|
|
gosScript_UnregisterCallback("ImeCallback");
|
|
|
|
// jcem - start
|
|
gosScript_UnregisterVariable("g_nTimeList_Value");
|
|
gosScript_UnregisterVariable("g_nTimeList_Index");
|
|
// MSL 5.06
|
|
gosScript_UnregisterVariable("g_nBlackMech");
|
|
gosScript_UnregisterVariable("g_nMechVariant");
|
|
gosScript_UnregisterVariable("g_nMechLabOp");
|
|
gosScript_UnregisterVariable("g_nMechPodNum");
|
|
gosScript_UnregisterCallback("CTCL_WhyPaused");
|
|
// MSL 5.03 Mechview
|
|
gosScript_UnregisterCallback("CTCL_MechViewOnMainScreen");
|
|
gosScript_UnregisterCallback("CTCL_IsBotAllowed");
|
|
gosScript_UnregisterCallback("CTCL_GetACP");
|
|
gosScript_UnregisterCallback("CTCL_MiscFile");
|
|
gosScript_UnregisterCallback("CTCL_GetIncNums");
|
|
gosScript_UnregisterCallback("TBL_GetResNames");
|
|
gosScript_UnregisterCallback("CTCL_Inviter");
|
|
gosScript_UnregisterCallback("CTCL_DoInviteCOOP");
|
|
gosScript_UnregisterCallback("CTCL_CheckInviteCOOP");
|
|
gosScript_UnregisterCallback("CTCL_SetDispStateCOOP");
|
|
gosScript_UnregisterCallback("CTCL_CheckCampaign");
|
|
gosScript_UnregisterCallback("CTCL_GetJoyInfo");
|
|
gosScript_UnregisterCallback("CTCL_PosCOOP");
|
|
gosScript_UnregisterCallback("CTCL_StartCOOP");
|
|
gosScript_UnregisterCallback("CTCL_CheckCOOP");
|
|
gosScript_UnregisterCallback("CTCL_SetPlayerName");
|
|
gosScript_UnregisterCallback("CTCL_GetPlayerName");
|
|
gosScript_UnregisterCallback("CTCL_CheckUseJPD");
|
|
gosScript_UnregisterCallback("CTCL_CheckCoinCounts");
|
|
gosScript_UnregisterCallback("CTCL_CheckPlayMovie");
|
|
gosScript_UnregisterCallback("CTCL_DoReprint");
|
|
gosScript_UnregisterCallback("CTCL_IsGameLoaded");
|
|
gosScript_UnregisterCallback("CTCL_DoBreak");
|
|
gosScript_UnregisterCallback("CTCL_GetMissionState");
|
|
gosScript_UnregisterCallback("CTCL_AddPlayer");
|
|
gosScript_UnregisterCallback("CTCL_DoMission");
|
|
gosScript_UnregisterCallback("CTCL_IsValidName");
|
|
gosScript_UnregisterCallback("CTCL_GetTeamParams");
|
|
gosScript_UnregisterCallback("CTCL_SetCDSP");
|
|
gosScript_UnregisterCallback("CTCL_Set");
|
|
gosScript_UnregisterCallback("CTCL_Get");
|
|
gosScript_UnregisterCallback("CTCL_IsConsoleX");
|
|
gosScript_UnregisterCallback("CTCL_IsConsole");
|
|
gosScript_UnregisterCallback("CTCL_GetType");
|
|
// jcem - end
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
void MW4Shell::StartMainShell()
|
|
{
|
|
if (MWApplication::DemoMode)
|
|
{
|
|
STOP(("SERVER OFF LINE"));
|
|
}
|
|
|
|
if (MWApplication::RunFromLobby)
|
|
{
|
|
gos_TerminateApplication();
|
|
}
|
|
else
|
|
{
|
|
// jcem - begin
|
|
if (CTCL_IsConsoleX()) {
|
|
#ifdef _DEBUG
|
|
OutputDebugString("StartMainShell\n");
|
|
#endif // _DEBUG
|
|
CTCL_SetGameStateAsIdle();
|
|
}
|
|
// jcem - end
|
|
ClearChat();
|
|
|
|
gos_SetScreenMode(800,600,Environment.bitDepth,Environment.FullScreenDevice);
|
|
gosScript_ExecuteScript(SHELLSCRIPTS_PATH"Shell.script",0x1000);
|
|
currentShellRunning = MainShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
firstRun = false;
|
|
}
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartNetworkServerExecute()
|
|
{
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
for (int i = 0; i < Maximum_Lancemates; ++i)
|
|
{
|
|
app->lancemateConnectionData[i].Disconnect();
|
|
}
|
|
|
|
if (!MWApplication::GetInstance()->Win32DedicatedServer) {
|
|
netServerScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"NetServer.script",0x1000);
|
|
currentShellRunning = NetServerShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
}
|
|
|
|
firstRun = false;
|
|
//selectedScenario = -1;
|
|
app->memoryDiffKiller.Init();
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartNetworkClientExecute()
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
for (int i = 0; i < Maximum_Lancemates; ++i)
|
|
{
|
|
app->lancemateConnectionData[i].Disconnect();
|
|
}
|
|
|
|
if (!MWApplication::GetInstance()->Win32DedicatedServer) {
|
|
netClientScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"NetClient.script",0x1000);
|
|
currentShellRunning = NetClientShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
}
|
|
|
|
firstRun = false;
|
|
app->memoryDiffKiller.Init();
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartNetworkScoreExecute()
|
|
{
|
|
gos_SetScreenMode(800, 600,Environment.bitDepth,Environment.FullScreenDevice);
|
|
netScoreScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"NetScore.script",0x1000);
|
|
currentShellRunning = NetScoreShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
|
|
firstRun = false;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartNetworkMissionReviewExecute()
|
|
{
|
|
netMissionReviewScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"NetMissionReview.script",0x0000);
|
|
currentShellRunning = NetMissionReviewShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
|
|
firstRun = false;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartNetworkStartupScreen()
|
|
{
|
|
|
|
if (MWApplication::RunFromLobby)
|
|
{
|
|
gos_TerminateApplication();
|
|
}
|
|
else
|
|
{
|
|
gos_SetScreenMode(800, 600,Environment.bitDepth,Environment.FullScreenDevice);
|
|
currentShellRunning = NetStartupShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
firstRun = false;
|
|
MWApplication::GetInstance()->LoadServerOptions();
|
|
gos_NetStartGame(0, MWApplication::SecureNetGame);
|
|
}
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void MW4Shell::StopNetworkShellsExecute()
|
|
{
|
|
if (MWApplication::GetInstance()->Win32DedicatedServer) {
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
app->memoryDiffKiller.Uninit();
|
|
return;
|
|
}
|
|
|
|
HGOSSCRIPT mechbay_1 = gosScript_GetScriptHandle("MechBay", 0);
|
|
if (mechbay_1 != NULL)
|
|
{
|
|
gosScript_EndScript(mechbay_1);
|
|
mechbay_1 = NULL;
|
|
}
|
|
|
|
HGOSSCRIPT mechbay_2 = gosScript_GetScriptHandle("MechBay_main", 0);
|
|
if (mechbay_2 != NULL)
|
|
{
|
|
gosScript_EndScript(mechbay_2);
|
|
mechbay_2 = NULL;
|
|
}
|
|
|
|
if (netServerScript != NULL)
|
|
{
|
|
gosScript_EndScript(netServerScript);
|
|
netServerScript = NULL;
|
|
currentShellRunning = NoShellRunning;
|
|
}
|
|
|
|
if (netClientScript != NULL)
|
|
{
|
|
gosScript_EndScript(netClientScript);
|
|
netClientScript = NULL;
|
|
currentShellRunning = NoShellRunning;
|
|
}
|
|
|
|
if (netScoreScript != NULL)
|
|
{
|
|
gosScript_EndScript(netScoreScript);
|
|
netScoreScript = NULL;
|
|
currentShellRunning = NoShellRunning;
|
|
}
|
|
|
|
if (netMissionReviewScript != NULL)
|
|
{
|
|
gosScript_EndScript(netMissionReviewScript);
|
|
netMissionReviewScript = NULL;
|
|
currentShellRunning = NoShellRunning;
|
|
}
|
|
|
|
|
|
HGOSSCRIPT net_1 = gosScript_GetScriptHandle("NetLobby", 0);
|
|
if (net_1 != NULL)
|
|
{
|
|
gosScript_EndScript(net_1);
|
|
net_1 = NULL;
|
|
}
|
|
|
|
HGOSSCRIPT net_2 = gosScript_GetScriptHandle("Mouse", 0);
|
|
if (net_2 != NULL)
|
|
{
|
|
gosScript_EndScript(net_2);
|
|
net_2 = NULL;
|
|
}
|
|
// jcem - begin
|
|
HGOSSCRIPT net_3 = gosScript_GetScriptHandle("ConLobby", 0);
|
|
if (net_3 != NULL)
|
|
{
|
|
gosScript_EndScript(net_3);
|
|
net_3 = NULL;
|
|
}
|
|
// jcem - end
|
|
if (CTCL_IsConsoleX()) {
|
|
EndAllScripts();
|
|
}
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
app->memoryDiffKiller.Uninit();
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartPauseShellExecute()
|
|
{
|
|
if (currentShellRunning == NoShellRunning)
|
|
{
|
|
if (MWApplication::GetInstance()->serverFlag)
|
|
pauseScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"PauseServer.script",0x1000);
|
|
else
|
|
pauseScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"PauseClient.script",0x1000);
|
|
currentShellRunning = InGameShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
}
|
|
|
|
firstRun = false;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StopPauseShellExecute()
|
|
{
|
|
if (pauseScript != NULL)
|
|
{
|
|
gosScript_EndScript(pauseScript);
|
|
pauseScript = NULL;
|
|
}
|
|
|
|
currentShellRunning = NoShellRunning;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartPauseShellExecuteModal()
|
|
{
|
|
if (currentShellRunning == NoShellRunning)
|
|
{
|
|
if (shellStart == InstantActionShellStart)
|
|
gosScript_ExecuteScript(SHELLSCRIPTS_PATH"PauseModalInstantAction.script",0x2000);
|
|
else {
|
|
if (g_bCOOP)
|
|
gosScript_ExecuteScript(SHELLSCRIPTS_PATH"gs_PauseModalCampaign.script", 0x2000);
|
|
else
|
|
gosScript_ExecuteScript(SHELLSCRIPTS_PATH"PauseModalCampaign.script", 0x2000);
|
|
}
|
|
}
|
|
|
|
firstRun = false;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartPauseOptionsShellExecute()
|
|
{
|
|
if (currentShellRunning == NoShellRunning)
|
|
{
|
|
if ((shellStart != InstantActionShellStart) && (shellStart != CampaignShellStart))
|
|
pauseOptionsScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"PauseOptions.script", 0x1000);
|
|
else
|
|
gosScript_ExecuteScript(SHELLSCRIPTS_PATH"PauseOptionsModal.script", 0x2000);
|
|
}
|
|
|
|
firstRun = false;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StopPauseOptionsShellExecute()
|
|
{
|
|
if (pauseOptionsScript != NULL)
|
|
{
|
|
gosScript_EndScript(pauseOptionsScript);
|
|
pauseOptionsScript = NULL;
|
|
}
|
|
|
|
currentShellRunning = NoShellRunning;
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartNetworkErrorExecuteModal()
|
|
{
|
|
gosScript_ExecuteScript(SHELLSCRIPTS_PATH"NetworkError.script",0x2000);
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartLoadingShell(bool multiplayer)
|
|
{
|
|
if (!MWApplication::GetInstance()->Win32DedicatedServer)
|
|
{
|
|
// from here - for MechView by jcem
|
|
#if 1
|
|
gosASSERT(!g_pfnCTCL_AfterBeginScene);
|
|
|
|
bool bMechView;
|
|
if (!multiplayer || (m_mechID == m_mechIDs[0]) || (g_nMR == 2) || (g_nMechViewType == 0))
|
|
{
|
|
//(CTCL_GetType() != _ECTCL_Game)
|
|
// it's cameraship or MissionReplay...
|
|
bMechView = false;
|
|
}
|
|
else if (g_nMechViewType == 1)
|
|
{
|
|
if (hsh_initialized && radar_device.pD3DDevice)
|
|
{
|
|
bMechView = true;
|
|
}
|
|
else
|
|
{
|
|
bMechView = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (g_nMechViewType == 2)
|
|
bMechView = true;
|
|
else
|
|
bMechView = false;
|
|
}
|
|
|
|
if (bMechView)
|
|
{
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
|
|
NetMissionParameters::MWNetMissionParameters *params;
|
|
if (app->serverFlag)
|
|
{
|
|
params = MWApplication::GetInstance()->GetLocalNetParams();
|
|
}
|
|
else
|
|
{
|
|
params = MWApplication::GetInstance()->GetServerNetParams();
|
|
}
|
|
|
|
InitMechLabScreen();
|
|
|
|
MechLab::Instance->SetMech(m_mechID, m_mechShortResFile, "Resource\\Variants\\");
|
|
int nSkinPrefix;
|
|
|
|
if (params->m_teamAllowed)
|
|
{
|
|
int nTeamNumber = app->servedConnectionData[Connection::Local->GetID()].pilotTeam;
|
|
if ((nTeamNumber < 0) || (MWApplication::No_Team < nTeamNumber))
|
|
nTeamNumber = MWApplication::No_Team;
|
|
#if 1
|
|
nSkinPrefix = g_caCamoPrefixes[g_naTeamSkins[nTeamNumber]];
|
|
#else
|
|
int nParams = 3;
|
|
int nTeamParam = TEAM_PARAMETER;
|
|
int nTeamSkin = TEAM_SKIN;
|
|
void* data_teamskin[3] = {
|
|
&nTeamParam,
|
|
&nTeamNumber,
|
|
&nTeamSkin,
|
|
};
|
|
nSkinPrefix = g_caCamoPrefixes[GetNetworkMissionParamater(params, 3, data_teamskin)];
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
nSkinPrefix = *(BYTE*)&m_skinPrefix;
|
|
}
|
|
|
|
void* data_skin[3] = {
|
|
MechLab::Instance, // instance
|
|
NULL,
|
|
&nSkinPrefix,
|
|
};
|
|
|
|
MechLab::Instance->SetMechSkin(data_skin, 3);
|
|
|
|
if (g_nMechViewType == 1)
|
|
{
|
|
g_MLCallData.Setup_MLCallData();
|
|
g_pfnCTCL_AfterBeginScene = CTCL_AfterBeginScene;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
radar_device.m_nMechViewMax = 0; // no MechView Images...
|
|
g_pfnCTCL_AfterBeginScene = NULL;
|
|
}
|
|
#endif
|
|
// to here - for MechView by jcem
|
|
|
|
if (multiplayer)
|
|
loadingScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"NetLoading.script",0x0100);
|
|
else
|
|
loadingScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"Loading.script",0x1000);
|
|
}
|
|
|
|
currentShellRunning = LoadingShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
|
|
firstRun = false;
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void MW4Shell::StopLoadingShell()
|
|
{
|
|
if (loadingScript != NULL)
|
|
{
|
|
gosScript_EndScript(loadingScript);
|
|
loadingScript = NULL;
|
|
}
|
|
#if 1
|
|
// from here - for MechView by jcem
|
|
if (g_nMechViewType)
|
|
{
|
|
if (g_nMechViewType == 1)
|
|
{
|
|
g_pfnCTCL_AfterBeginScene = NULL;
|
|
}
|
|
else
|
|
{ // if (g_nMechViewType == 2)
|
|
MW4Shell::Instance->ClearMechLab(-1);
|
|
}
|
|
}
|
|
// to here - for MechView by jcem
|
|
#endif
|
|
currentShellRunning = NoShellRunning;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::StartStatShell()
|
|
{
|
|
if (!MWApplication::GetInstance()->Win32DedicatedServer) {
|
|
|
|
gos_SetScreenMode(800, 600,Environment.bitDepth,Environment.FullScreenDevice);
|
|
|
|
#ifdef LAB_ONLY
|
|
statScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"ServerStatDbg.script",0x1000);
|
|
#else
|
|
statScript = gosScript_ExecuteScript(SHELLSCRIPTS_PATH"ServerStat.script",0x1000);
|
|
#endif
|
|
}
|
|
|
|
firstRun = false;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void MW4Shell::StopStatShell()
|
|
{
|
|
if (statScript != NULL)
|
|
{
|
|
gosScript_EndScript(statScript);
|
|
statScript = NULL;
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
const char* MW4Shell::GetGameName()
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::LoadMechPrototypes()
|
|
{
|
|
Stuff::MString vehicles_path = "Content\\Mechs\\*.*";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(vehicles_path, true);
|
|
Check_Object(resource_directory);
|
|
Register_Object(resource_directory);
|
|
|
|
Stuff::MString temp_dir_string;
|
|
|
|
while((char *)(temp_dir_string = resource_directory->GetCurrentFolderName()) != NULL)
|
|
{
|
|
Stuff::MString new_directory_path = vehicles_path;
|
|
new_directory_path.IsolateDirectory();
|
|
new_directory_path += temp_dir_string;
|
|
new_directory_path += "\\interface.instance";
|
|
if(gos_DoesFileExist(new_directory_path))
|
|
{
|
|
MechPrototype* newMechPrototype = new MechPrototype;
|
|
newMechPrototype->name = temp_dir_string;
|
|
newMechPrototype->path = vehicles_path;
|
|
newMechPrototype->path += temp_dir_string;
|
|
newMechPrototype->path += '\\';
|
|
newMechPrototype->path += temp_dir_string;
|
|
newMechPrototype->path += ".instance";
|
|
mechPrototypeList.Add(newMechPrototype);
|
|
}
|
|
resource_directory->AdvanceCurrentFolder();
|
|
}
|
|
Unregister_Object(resource_directory);
|
|
delete resource_directory;
|
|
|
|
Stuff::ChainIteratorOf<MechPrototype *> iterator(&mechPrototypeList);
|
|
numMechPrototypes = iterator.GetSize();
|
|
|
|
mechPrototypeNames = new char* [1024];
|
|
mechPrototypeFilenames = new char* [1024];
|
|
|
|
for (int i = 0; i < numMechPrototypes; i++)
|
|
{
|
|
MechPrototype *mp = iterator.ReadAndNext();
|
|
|
|
mechPrototypeNames[i] = new char[mp->name.GetLength() + 1];
|
|
Str_Copy(mechPrototypeNames[i], (char*)mp->name, mp->name.GetLength() + 1);
|
|
mechPrototypeFilenames[i] = new char[mp->path.GetLength() + 1];
|
|
Str_Copy(mechPrototypeFilenames[i],(char*)mp->path, mp->path.GetLength() + 1);
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::LoadMissions()
|
|
{
|
|
// char Working_Directory[128];
|
|
// _getcwd(Working_Directory, 128);
|
|
|
|
// Stuff::MString mission_path = Working_Directory;
|
|
Stuff::MString mission_path = "Content\\Missions\\*.*";
|
|
// mission_path += "\\Content\\Missions\\*.*";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(mission_path, true);
|
|
Check_Object(resource_directory);
|
|
Register_Object(resource_directory);
|
|
|
|
Stuff::MString temp_dir_string;
|
|
|
|
missionNames = new char* [1024];
|
|
missionFilenames = new char* [1024];
|
|
numMissions = 0;
|
|
|
|
while((char *)(temp_dir_string = resource_directory->GetCurrentFolderName()) != NULL)
|
|
{
|
|
Stuff::MString new_directory_path;
|
|
Stuff::MString temp_string;
|
|
new_directory_path = mission_path;
|
|
new_directory_path.IsolateDirectory();
|
|
new_directory_path += temp_dir_string;
|
|
new_directory_path += "\\";
|
|
new_directory_path += temp_dir_string;
|
|
new_directory_path += ".instance";
|
|
Stuff::Directory *mission_directory = new Stuff::Directory(new_directory_path);
|
|
Register_Object(mission_directory);
|
|
while((char *)(temp_string = mission_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
temp_string.StripExtension();
|
|
missionNames[numMissions] = new char[temp_string.GetLength() + 1];
|
|
strcpy(missionNames[numMissions],(char*)temp_string);
|
|
|
|
Stuff::MString temp_m_string;
|
|
temp_m_string = "Content\\Missions\\";
|
|
temp_m_string += temp_dir_string;
|
|
temp_m_string += "\\";
|
|
temp_m_string += temp_string;
|
|
temp_m_string += ".instance";
|
|
|
|
missionFilenames[numMissions] = new char[temp_m_string.GetLength() + 1];
|
|
strcpy(missionFilenames[numMissions],(char*)temp_m_string);
|
|
numMissions++;
|
|
|
|
mission_directory->AdvanceCurrentFile();
|
|
}
|
|
Unregister_Object(mission_directory);
|
|
delete mission_directory;
|
|
resource_directory->AdvanceCurrentFolder();
|
|
}
|
|
Unregister_Object(resource_directory);
|
|
delete resource_directory;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetStartScreen(void * instance, int, void *[])
|
|
{
|
|
if (Instance->firstRun)
|
|
return OPENINGCINEMA;
|
|
|
|
if (Instance->shellStart == InstantActionShellStart)
|
|
return IAWRAPUP_SCREEN;
|
|
else if (Instance->shellStart == CampaignShellStart)
|
|
{
|
|
if(MWApplication::GetInstance()->m_campaignIsComplete)
|
|
return CAMPAIGNLOBBY;
|
|
return CAMPAIGN_REVIEW;
|
|
}
|
|
else if (Instance->shellStart == CampaignLoadShellStart)
|
|
return CAMPAIGNLOBBY;
|
|
else
|
|
return MAINMENU;
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SetNetworkMissionParamater(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
if (!MWApplication::GetInstance()->serverFlag)
|
|
{
|
|
#ifdef _ARMOR
|
|
PAUSE(("Shell Client is tring to set a parameter. Only servers can set parameters"));
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
int param_number = INTPARM(0);
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
|
|
switch (param_number)
|
|
{
|
|
case MAX_PLAYERS_PARAMETER:
|
|
params->m_maxPlayers = INTPARM(1);
|
|
break;
|
|
|
|
case MAX_BOTS_PARAMETER:
|
|
params->m_maxBots = INTPARM(1);
|
|
Max_Clamp(params->m_maxBots, params->m_maxPlayers);
|
|
break;
|
|
|
|
case DEDICATED_SERVER_PARAMETER:
|
|
params->m_runDedicated = INTPARM(1);
|
|
if (params->m_runDedicated)
|
|
gos_EnableSetting( gos_Set_LoseFocusBehavior, 3);
|
|
else
|
|
gos_EnableSetting( gos_Set_LoseFocusBehavior, 0);
|
|
break;
|
|
|
|
case CLOSED_GAME_PARAMETER:
|
|
params->m_closedGame = INTPARM(1);
|
|
gos_NetServerCommands(gos_Command_LockGame, (DWORD)params->m_closedGame);
|
|
if (params->m_closedGame)
|
|
ServerAdvertiser::SetFlagsAllAdvertisers(ServerAdvertiser::GetFlagsAllAdvertisers() | NETFLAGS_LOCKED_FLAG);
|
|
else
|
|
ServerAdvertiser::SetFlagsAllAdvertisers(ServerAdvertiser::GetFlagsAllAdvertisers() & ~NETFLAGS_LOCKED_FLAG);
|
|
break;
|
|
|
|
case PLAYER_LIMIT_PARAMETER:
|
|
params->m_playerLimit = INTPARM(1);
|
|
Min_Clamp(params->m_playerLimit, Network::GetInstance()->GetPlayerCount());
|
|
Environment.NetworkMaxPlayers = params->m_playerLimit;
|
|
gos_NetServerCommands(gos_Commend_UpdateMaxPlayers,0);
|
|
break;
|
|
|
|
case JOIN_IN_PROGRESS_PARAMETER:
|
|
params->m_joinInProgress = INTPARM(1);
|
|
break;
|
|
|
|
case JOIN_IN_PROGRESS_CUTOFF_PARAMETER:
|
|
params->m_joinInProgressCutOff = INTPARM(1);
|
|
break;
|
|
|
|
case JOIN_IN_PROGRESS_CUTOFF_TIME_PARAMETER:
|
|
params->m_joinInProgressCutOffTime = INTPARM(1);
|
|
break;
|
|
|
|
case HEAT_PARAMETER:
|
|
params->m_heatOn = INTPARM(1);
|
|
break;
|
|
|
|
case KILL_LIMIT_PARAMETER:
|
|
params->m_killLimit = INTPARM(1);
|
|
break;
|
|
|
|
case KILL_LIMIT_NUMBER_PARAMETER:
|
|
params->m_killLimitNumber = INTPARM(1);
|
|
break;
|
|
|
|
case RESPAWN_LIMIT_PARAMETER:
|
|
params->m_respawnLimit = INTPARM(1);
|
|
break;
|
|
|
|
case RESPAWN_LIMIT_NUMBER_PARAMETER:
|
|
params->m_respawnLimitNumber = INTPARM(1);
|
|
break;
|
|
|
|
case FORCE_RESPAWN_PARAMETER:
|
|
params->m_forceRespawn = INTPARM(1);
|
|
break;
|
|
|
|
case SPLASH_ON_PARAMETER:
|
|
params->m_splashOn = INTPARM(1);
|
|
break;
|
|
|
|
case WEAPON_JAM_PARAMETER:
|
|
params->m_weaponjamOn = INTPARM(1);
|
|
break;
|
|
|
|
case AMMO_BAY_FIRE_PARAMETER:
|
|
params->m_ammobayfireOn = INTPARM(1);
|
|
break;
|
|
|
|
// MSL 5.05 Advance Mode
|
|
case ADVANCE_MODE_PARAMETER:
|
|
params->m_advancemodeOn = INTPARM(1);
|
|
break;
|
|
|
|
// MSL 5.06 Armor Mode
|
|
case ARMOR_MODE_PARAMETER:
|
|
params->m_armormodeOn = INTPARM(1);
|
|
break;
|
|
|
|
case SPLSH_PERCENTAGE_PARAMETER:
|
|
params->m_splashPercentage = INTPARM(1);
|
|
break;
|
|
|
|
case UNLIMITED_AMMO_PARAMETER:
|
|
params->m_unlimitedAmmo = INTPARM(1);
|
|
break;
|
|
|
|
case FRIENDLY_FIRE_PERCENTGE_PARAMETER:
|
|
params->m_friendlyFirePercentage = INTPARM(1);
|
|
break;
|
|
|
|
case ALLOW_ZOOM_PERCENTAGE_PARAMETER:
|
|
params->m_allowZoom = INTPARM(1);
|
|
break;
|
|
|
|
case ALLOW_3RD_PERSON_PARAMETER:
|
|
params->m_allow3rdPerson = INTPARM(1);
|
|
break;
|
|
|
|
case ALLOW_AUTO_AIM_PARAMETER:
|
|
params->m_allowAutoAim = INTPARM(1);
|
|
break;
|
|
|
|
case ALLOW_DEAD_CHAT_PARAMETER:
|
|
params->m_allowDeadToChat = INTPARM(1);
|
|
break;
|
|
|
|
case INUVNERABLE_DROP_PARAMETER:
|
|
params->m_invulnerableDrop = INTPARM(1);
|
|
break;
|
|
|
|
|
|
case ONLY_STOCK_MECH_PARAMETER:
|
|
params->m_onlyStockMech = INTPARM(1);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case MINIMUM_TONNAGE_PARAMETER:
|
|
params->m_minimumTonnage = INTPARM(1);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case MAXIMUM_TONNAGE_PARAMETER:
|
|
params->m_maximumTonnage = INTPARM(1);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case ALLOWED_MECH_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstMechID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(2);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedMech[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedMech[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case ALLOWED_BEAM_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstBeamID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(2);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedBeam[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedBeam[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case ALLOWED_MISSILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstMissileID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(2);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedMissile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedMissile[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case ALLOWED_PROJECTILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstProjectileID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(2);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedProjectile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedProjectile[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case ALLOWED_GENERIC_SUBSYSTEM_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstGenericSubsystemID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(2);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedSubsystem[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedSubsystem[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case GAME_LENGTH_PARAMETER:
|
|
params->m_gameLength = INTPARM(1);
|
|
break;
|
|
|
|
case SERVER_RECYCLE_PARAMETER:
|
|
params->m_serverRecycle = INTPARM(1);
|
|
break;
|
|
|
|
case RECYCLE_DELAY_PARAMETER:
|
|
params->m_recycleDelay = INTPARM(1);
|
|
|
|
if (!params->m_runDedicated)
|
|
params->m_serverRecycle = 0;
|
|
|
|
break;
|
|
|
|
case PLAY_MISSION_REVIEW_PARAMETER:
|
|
params->m_playMissionReview = INTPARM(1);
|
|
break;
|
|
|
|
case MAP_ID_PARAMETER:
|
|
{
|
|
params->m_mapID = INTPARM(1);
|
|
|
|
|
|
// Str_Copy(params->m_mapName, MW4Shell::Instance->scenarios[params->m_mapID].missionName, 124);
|
|
Str_Copy(params->m_mapName, MW4Shell::Instance->scenarios[params->m_mapID].longMissionName, 124);
|
|
Str_Copy(params->m_scenarioName, MW4Shell::Instance->scenarios[params->m_mapID].scenarioName, 124);
|
|
if (MW4Shell::Instance->scenarios[params->m_mapID].usermissions)
|
|
Str_Copy(params->m_scenarioPath, "Resource\\Usermissions\\", 124);
|
|
else
|
|
Str_Copy(params->m_scenarioPath, "Resource\\Missions\\", 124);
|
|
|
|
params->m_mapClientCRC = MWApplication::GetInstance()->CalculateMapMissionCRC(params->m_mapName);
|
|
gos_NetSetAdvertItem(0, GAMELIST_KEY_MAP_TYPE, params->m_mapName);
|
|
}
|
|
|
|
break;
|
|
|
|
case MAP_NAME_PARAMETER:
|
|
STOP(("GetServerNetworkMissionParamater: MAP_NAME_PARAMETER NOT ALLOWED!!!!"));
|
|
break;
|
|
|
|
case SCENARIO_NAME_PARAMETER:
|
|
STOP(("GetServerNetworkMissionParamater: SCENARIO_NAME_PARAMETER NOT ALLOWED!!!!"));
|
|
break;
|
|
|
|
case NIGHT_TIME_PARAMETER:
|
|
params->m_isNight = INTPARM(1);
|
|
break;
|
|
|
|
|
|
|
|
|
|
case WEATHER_PARAMETER:
|
|
params->m_weather = INTPARM(1);
|
|
break;
|
|
|
|
case RADAR_MODE_PARAMETER:
|
|
if (CTCL_IsConsole()) {
|
|
int n = INTPARM(1);
|
|
switch(n) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
n--;
|
|
break;
|
|
default:
|
|
n = 3;
|
|
break;
|
|
}
|
|
params->m_radarMode = n;
|
|
} else {
|
|
params->m_radarMode = INTPARM(1);
|
|
}
|
|
break;
|
|
|
|
case VISIBILITY_PARAMETER:
|
|
params->m_visibility = INTPARM(1);
|
|
break;
|
|
|
|
case REPORTSTATS_PARAMETER:
|
|
params->m_reportStats = INTPARM(1);
|
|
break;
|
|
|
|
case SERVER_CONNECTION_PARAMETER:
|
|
STOP(("SetServerNetworkMissionParamater: SERVER_CONNECTION_PARAMETER NOT ALLOWED!!!!"));
|
|
break;
|
|
|
|
case SERVER_BANDWIDTH_PARAMETER:
|
|
STOP(("SetServerNetworkMissionParamater: SERVER_BANDWIDTH_PARAMETER NOT ALLOWED!!!!"));
|
|
break;
|
|
|
|
case SERVER_CPU_PARAMETER:
|
|
STOP(("SetServerNetworkMissionParamater: SERVER_CPU_PARAMETER NOT ALLOWED!!!!"));
|
|
break;
|
|
|
|
case SERVER_NAME_PARAMETER:
|
|
{
|
|
const char* server_name = STRPARM(1);
|
|
Str_Copy(params->m_serverName, server_name, 256);
|
|
}
|
|
break;
|
|
|
|
case SERVER_IP_PARAMETER:
|
|
{
|
|
const char* server_ip = STRPARM(1);
|
|
Str_Copy(params->m_serverIP, server_ip, 256);
|
|
}
|
|
break;
|
|
|
|
case DEAD_MECH_CANT_SEE_PARAMETER:
|
|
params->m_deadMechCantSee = INTPARM(1);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case DEAD_MECH_CANT_SEE_OTHER_TEAM:
|
|
params->m_deadMechCantSeeOtherTeam = INTPARM(1);
|
|
break;
|
|
|
|
case RULE_TYPE_PARAMETER:
|
|
params->m_ruleType = INTPARM(1);
|
|
//{
|
|
// char szGameType[256];
|
|
// // mdm - advertise the current game type
|
|
// _mbsncpy((unsigned char *)szGameType, (unsigned char *)GetRuleName( params->m_ruleType ), sizeof(szGameType));
|
|
// gos_NetSetAdvertItem(0, GAMELIST_KEY_GAME_TYPE, szGameType);
|
|
//}
|
|
MW4Shell::Instance->selectedScenario = -1;
|
|
break;
|
|
|
|
|
|
case ALLOW_DECAL_TRANSFER_PARAMETER:
|
|
params->m_allowdecaltransfer = INTPARM(1);
|
|
break;
|
|
|
|
case USE_MAP_CYCLE_PARAMETER:
|
|
params->m_useMapCycle = INTPARM(1);
|
|
break;
|
|
|
|
case PURE_MAP_CYCLE_PARAMETER:
|
|
params->m_pureMapCycle = INTPARM(1);
|
|
break;
|
|
|
|
case TEAM_ALLOWED_PARAMETER:
|
|
params->m_teamAllowed = INTPARM(1);
|
|
break;
|
|
|
|
case TEAM_COUNT_PARAMETER:
|
|
params->m_teamCount = INTPARM(1);
|
|
Clamp(params->m_teamCount, 2, 8);
|
|
break;
|
|
|
|
case SCENARIO_INFO_PARAMATER:
|
|
STOP(("Paramater Not Allowed to be Set : SCENARIO_INFO_PARAMATER"));
|
|
break;
|
|
|
|
|
|
case TEAM_PARAMETER:
|
|
{
|
|
int team = INTPARM(1);
|
|
int sub_param = INTPARM(2);
|
|
|
|
Verify (team >= 0);
|
|
Verify (team < 8);
|
|
|
|
switch(sub_param)
|
|
{
|
|
case TEAM_MAX_PLAYERS:
|
|
params->m_teamParams[team].m_maxPlayersOnTeam = INTPARM(3);
|
|
break;
|
|
|
|
case TEAM_MIN_TONNAGE:
|
|
params->m_teamParams[team].m_minimumTonnage = INTPARM(3);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_MAX_TONNAGE:
|
|
params->m_teamParams[team].m_maximumTonnage = INTPARM(3);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_TOTAL_MAX_TONNAGE:
|
|
params->m_teamParams[team].m_maximumTotalTonnage = INTPARM(3);
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_SKIN:
|
|
params->m_teamParams[team].m_skin = INTPARM(3);
|
|
break;
|
|
|
|
case TEAM_ALIGNMENT:
|
|
params->m_teamParams[team].m_alignment = INTPARM(3);
|
|
break;
|
|
|
|
case TEAM_ALLOWED_MECH_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstMechID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(4);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedMech[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedMech[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_ALLOWED_BEAM_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstBeamID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(4);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedBeam[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedBeam[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_ALLOWED_MISSILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstMissileID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(4);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedMissile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedMissile[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_ALLOWED_PROJECTILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstProjectileID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(4);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedProjectile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedProjectile[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
case TEAM_ALLOWED_GENERIC_SUBSYSTEM_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstGenericSubsystemID;
|
|
Verify(offset < 64);
|
|
int value = INTPARM(4);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedSubsystem[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedSubsystem[0];
|
|
}
|
|
|
|
if (value)
|
|
*data |= (0x1 << offset);
|
|
else
|
|
*data &= ~(0x1 << offset);
|
|
}
|
|
app->VerifyAllPlayerVehicles();
|
|
break;
|
|
|
|
default :
|
|
STOP(("UNKOWN TEAM PARAMETER TYPE"));
|
|
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
app->parametersDirty = true;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetLocalNetworkMissionParamater(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
return GetNetworkMissionParamater(params, numParms, data);
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetServerNetworkMissionParamater(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetServerNetParams();
|
|
|
|
return GetNetworkMissionParamater(params, numParms, data);
|
|
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetNetworkMissionParamater(NetMissionParameters::MWNetMissionParameters *params, int numParms, void **data)
|
|
{
|
|
int param_number = INTPARM(0);
|
|
|
|
switch (param_number)
|
|
{
|
|
case MAX_PLAYERS_PARAMETER:
|
|
return params->m_maxPlayers;
|
|
|
|
case MAX_BOTS_PARAMETER:
|
|
return params->m_maxBots;
|
|
|
|
case DEDICATED_SERVER_PARAMETER:
|
|
return params->m_runDedicated;
|
|
|
|
case CLOSED_GAME_PARAMETER:
|
|
return params->m_closedGame;
|
|
|
|
case PLAYER_LIMIT_PARAMETER:
|
|
return params->m_playerLimit;
|
|
|
|
case JOIN_IN_PROGRESS_PARAMETER:
|
|
return params->m_joinInProgress;
|
|
|
|
case JOIN_IN_PROGRESS_CUTOFF_PARAMETER:
|
|
return params->m_joinInProgressCutOff;
|
|
|
|
case JOIN_IN_PROGRESS_CUTOFF_TIME_PARAMETER:
|
|
return params->m_joinInProgressCutOffTime;
|
|
|
|
case HEAT_PARAMETER:
|
|
return params->m_heatOn;
|
|
|
|
case KILL_LIMIT_PARAMETER:
|
|
return params->m_killLimit;
|
|
|
|
case KILL_LIMIT_NUMBER_PARAMETER:
|
|
return params->m_killLimitNumber;
|
|
|
|
case RESPAWN_LIMIT_PARAMETER:
|
|
return params->m_respawnLimit;
|
|
|
|
case RESPAWN_LIMIT_NUMBER_PARAMETER:
|
|
return params->m_respawnLimitNumber;
|
|
|
|
case FORCE_RESPAWN_PARAMETER:
|
|
return params->m_forceRespawn;
|
|
|
|
case SPLASH_ON_PARAMETER:
|
|
return params->m_splashOn;
|
|
|
|
case WEAPON_JAM_PARAMETER:
|
|
return params->m_weaponjamOn;
|
|
|
|
case AMMO_BAY_FIRE_PARAMETER:
|
|
return params->m_ammobayfireOn;
|
|
|
|
case ADVANCE_MODE_PARAMETER:
|
|
return params->m_advancemodeOn;
|
|
|
|
case ARMOR_MODE_PARAMETER:
|
|
return params->m_armormodeOn;
|
|
|
|
case SPLSH_PERCENTAGE_PARAMETER:
|
|
return params->m_splashPercentage;
|
|
|
|
case UNLIMITED_AMMO_PARAMETER:
|
|
return params->m_unlimitedAmmo;
|
|
|
|
case FRIENDLY_FIRE_PERCENTGE_PARAMETER:
|
|
return params->m_friendlyFirePercentage;
|
|
|
|
case ALLOW_ZOOM_PERCENTAGE_PARAMETER:
|
|
return params->m_allowZoom;
|
|
|
|
case ALLOW_3RD_PERSON_PARAMETER:
|
|
return params->m_allow3rdPerson;
|
|
|
|
case ALLOW_AUTO_AIM_PARAMETER:
|
|
return params->m_allowAutoAim;
|
|
|
|
case ALLOW_DEAD_CHAT_PARAMETER:
|
|
return params->m_allowDeadToChat;
|
|
|
|
case INUVNERABLE_DROP_PARAMETER:
|
|
return params->m_invulnerableDrop;
|
|
|
|
case ONLY_STOCK_MECH_PARAMETER:
|
|
return params->m_onlyStockMech;
|
|
|
|
case MINIMUM_TONNAGE_PARAMETER:
|
|
return params->m_minimumTonnage;
|
|
|
|
case MAXIMUM_TONNAGE_PARAMETER:
|
|
return params->m_maximumTonnage;
|
|
|
|
|
|
|
|
|
|
case ALLOWED_MECH_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstMechID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedMech[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedMech[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case ALLOWED_BEAM_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstBeamID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedBeam[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedBeam[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case ALLOWED_MISSILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstMissileID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedMissile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedMissile[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case ALLOWED_PROJECTILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstProjectileID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedProjectile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedProjectile[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case ALLOWED_GENERIC_SUBSYSTEM_PARAMETER:
|
|
{
|
|
int offset = INTPARM(1) - FirstGenericSubsystemID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_allowedSubsystem[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_allowedSubsystem[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case GAME_LENGTH_PARAMETER:
|
|
return params->m_gameLength;
|
|
|
|
case SERVER_RECYCLE_PARAMETER:
|
|
return params->m_serverRecycle;
|
|
|
|
case RECYCLE_DELAY_PARAMETER:
|
|
return params->m_recycleDelay;
|
|
|
|
case PLAY_MISSION_REVIEW_PARAMETER:
|
|
return params->m_playMissionReview;
|
|
|
|
case MAP_ID_PARAMETER:
|
|
return params->m_mapID;
|
|
|
|
case MAP_NAME_PARAMETER:
|
|
//Str_Copy(MW4Shell::Instance->m_iaMissionName, params->m_mapName, 256);
|
|
|
|
if (params->m_mapName[0] != '\0')
|
|
{
|
|
|
|
char **game_name = &STRPARM(1);
|
|
|
|
FREEANDNULL(*game_name);
|
|
*game_name = (char *)gos_Malloc(256);
|
|
::memset(*game_name, 0, 256);
|
|
|
|
_mbscpy((unsigned char *)*game_name, (const unsigned char *)¶ms->m_mapName[0]);
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
case SCENARIO_NAME_PARAMETER:
|
|
{
|
|
MString scenario_name;
|
|
//scenario_name = params->m_mapName;
|
|
//scenario_name += " : ";
|
|
//scenario_name += params->m_scenarioName;
|
|
scenario_name = params->m_scenarioName;
|
|
|
|
Str_Copy(MW4Shell::Instance->m_iaMissionName, (char*)scenario_name, 256);
|
|
MWApplication::GetInstance()->m_currentMissionName = scenario_name;
|
|
}
|
|
return 0;
|
|
|
|
case SCENARIO_PATH_PARAMETER:
|
|
{
|
|
char** scenario_path = &STRPARM(1);
|
|
|
|
FREEANDNULL(*scenario_path);
|
|
*scenario_path = (char*) gos_Malloc(256);
|
|
|
|
(*scenario_path)[0] = '\0';
|
|
|
|
char file[256];
|
|
Str_Copy(file, params->m_scenarioPath, 256);
|
|
Str_Cat(file, params->m_mapName, 256);
|
|
Str_Cat(file, ".tga", 256);
|
|
|
|
if (gos_DoesFileExist(file) == 0)
|
|
(*scenario_path)[0] = '\0';
|
|
else
|
|
Str_Copy(*scenario_path, params->m_scenarioPath, 256);
|
|
}
|
|
return 0;
|
|
|
|
case SERVER_NAME_PARAMETER:
|
|
Str_Copy(MW4Shell::Instance->m_serverName, params->m_serverName, 256);
|
|
return 0;
|
|
|
|
case SERVER_IP_PARAMETER:
|
|
Str_Copy(MW4Shell::Instance->m_serverIP, params->m_serverIP, 256);
|
|
return 0;
|
|
|
|
case NIGHT_TIME_PARAMETER:
|
|
return params->m_isNight;
|
|
|
|
|
|
|
|
case WEATHER_PARAMETER:
|
|
return params->m_weather;
|
|
|
|
case RADAR_MODE_PARAMETER:
|
|
if (CTCL_IsConsole()) {
|
|
int n = params->m_radarMode;
|
|
switch(n) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
return n + 1;
|
|
default:
|
|
return 0;
|
|
}
|
|
} else {
|
|
return params->m_radarMode;
|
|
}
|
|
|
|
case VISIBILITY_PARAMETER:
|
|
return params->m_visibility;
|
|
|
|
case REPORTSTATS_PARAMETER:
|
|
return params->m_reportStats;
|
|
|
|
case SERVER_CONNECTION_PARAMETER:
|
|
return params->m_serverConnection;
|
|
|
|
case SERVER_BANDWIDTH_PARAMETER:
|
|
return params->m_serverBandwidth;
|
|
|
|
case SERVER_CPU_PARAMETER:
|
|
Str_Copy(MW4Shell::Instance->m_serverCPU, params->m_serverCPU, 256);
|
|
return 0;
|
|
|
|
case DEAD_MECH_CANT_SEE_PARAMETER:
|
|
return params->m_deadMechCantSee;
|
|
|
|
case DEAD_MECH_CANT_SEE_OTHER_TEAM:
|
|
return params->m_deadMechCantSeeOtherTeam;
|
|
|
|
case RULE_TYPE_PARAMETER:
|
|
return params->m_ruleType;
|
|
|
|
case ALLOW_DECAL_TRANSFER_PARAMETER:
|
|
return params->m_allowdecaltransfer;
|
|
|
|
case USE_MAP_CYCLE_PARAMETER:
|
|
return params->m_useMapCycle;
|
|
|
|
case PURE_MAP_CYCLE_PARAMETER:
|
|
return params->m_pureMapCycle;
|
|
|
|
case TEAM_ALLOWED_PARAMETER:
|
|
return params->m_teamAllowed;
|
|
|
|
case TEAM_COUNT_PARAMETER:
|
|
return params->m_teamCount;
|
|
|
|
case SCENARIO_INFO_PARAMATER:
|
|
{
|
|
//return params->m_teamCount;
|
|
|
|
if (params->m_scenarioText[0] != '\0')
|
|
{
|
|
|
|
char **game_name = &STRPARM(1);
|
|
|
|
FREEANDNULL(*game_name);
|
|
*game_name = (char *)gos_Malloc(1024);
|
|
::memset(*game_name, 0, 1024);
|
|
|
|
_mbscpy((unsigned char *)*game_name, (unsigned const char *)¶ms->m_scenarioText[0]);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
case TEAM_PARAMETER:
|
|
{
|
|
int team = INTPARM(1);
|
|
int sub_param = INTPARM(2);
|
|
|
|
Verify (team >= 0);
|
|
Verify (team < 8);
|
|
|
|
switch(sub_param)
|
|
{
|
|
case TEAM_MAX_PLAYERS:
|
|
return params->m_teamParams[team].m_maxPlayersOnTeam;
|
|
|
|
case TEAM_MIN_TONNAGE:
|
|
return params->m_teamParams[team].m_minimumTonnage;
|
|
|
|
case TEAM_MAX_TONNAGE:
|
|
return params->m_teamParams[team].m_maximumTonnage;
|
|
|
|
case TEAM_TOTAL_MAX_TONNAGE:
|
|
return params->m_teamParams[team].m_maximumTotalTonnage;
|
|
|
|
case TEAM_SKIN:
|
|
|
|
{
|
|
|
|
char team_prefix = (char)params->m_teamParams[team].m_skin;
|
|
int skin_id = 0;
|
|
|
|
Check_Object(MWApplication::GetInstance()->m_skinsTable);
|
|
|
|
|
|
MWTable::TableIterator *iterator = MWApplication::GetInstance()->m_skinsTable->MakeTableIterator();
|
|
MWTableEntry *entry = NULL;
|
|
|
|
while ((entry = iterator->ReadAndNext()) != NULL)
|
|
{
|
|
|
|
char *prefix = entry->GetData();
|
|
|
|
if (team_prefix == *prefix)
|
|
{
|
|
delete iterator;
|
|
return skin_id;
|
|
}
|
|
++skin_id;
|
|
|
|
}
|
|
|
|
delete iterator;
|
|
return 0;
|
|
}
|
|
|
|
//return params->m_teamParams[team].m_skin;
|
|
|
|
|
|
case TEAM_ALIGNMENT:
|
|
return params->m_teamParams[team].m_alignment;
|
|
|
|
|
|
case TEAM_ALLOWED_MECH_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstMechID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedMech[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedMech[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case TEAM_ALLOWED_BEAM_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstBeamID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedBeam[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedBeam[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case TEAM_ALLOWED_MISSILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstMissileID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedMissile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedMissile[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case TEAM_ALLOWED_PROJECTILE_WEAPON_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstProjectileID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedProjectile[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedProjectile[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
case TEAM_ALLOWED_GENERIC_SUBSYSTEM_PARAMETER:
|
|
{
|
|
int offset = INTPARM(3) - FirstGenericSubsystemID;
|
|
Verify(offset < 64);
|
|
|
|
DWORD *data;
|
|
if (offset >= 32)
|
|
{
|
|
offset -= 32;
|
|
data = ¶ms->m_teamParams[team].m_allowedSubsystem[1];
|
|
}
|
|
else
|
|
{
|
|
data = ¶ms->m_teamParams[team].m_allowedSubsystem[0];
|
|
}
|
|
|
|
return (*data & (0x1 << offset))?1:0;
|
|
}
|
|
|
|
default :
|
|
STOP(("UNKOWN TEAM PARAMETER TYPE"));
|
|
|
|
}
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::NetConnectedToServer(void * instance,int, void *[])
|
|
{
|
|
if (Connection::Server != NULL)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
// DBCS-safe strncpy() that guarantees NUL terminate
|
|
//extern "C" unsigned int _stdcall IsDBCSLeadByte(BYTE TestChar);
|
|
static char* mbs_strncpy( char *strDest, const char *strSource, size_t count )
|
|
{
|
|
char* pRet = strncpy(strDest, strSource, count);
|
|
if (strDest) {
|
|
strDest[count - 1] = 0;
|
|
char* p = strDest;
|
|
while (*p) {
|
|
if (IsDBCSLeadByte(*p)) {
|
|
if (p[1] == 0) {
|
|
*p = 0;
|
|
break;
|
|
}
|
|
p++;
|
|
}
|
|
p++;
|
|
}
|
|
}
|
|
return pRet;
|
|
}
|
|
|
|
//========================================================================
|
|
// This callback checks to make sure the game advertised properly with
|
|
// GUN. If it didn't, a message box is displayed. This function is
|
|
// designed to be called only fromt he Host lobby script.
|
|
//========================================================================
|
|
|
|
double lastCheck = 0.0;
|
|
|
|
int MW4Shell::CheckGUNAdvertise(void *instance, int, void*[])
|
|
{
|
|
|
|
int status = GetGUNRegStatus();
|
|
|
|
if (status != GRS_SUCCESS)
|
|
{
|
|
if (gos_GetElapsedTime() - lastCheck > 10.0)
|
|
{
|
|
lastCheck = gos_GetElapsedTime();
|
|
int ret = Mech4ReconnectGame();
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
char szGameType[256];
|
|
mbs_strncpy(szGameType, GetRuleName( params->m_ruleType ), sizeof(szGameType));
|
|
gos_NetSetAdvertItem(0, GAMELIST_KEY_GAME_TYPE, szGameType);
|
|
gos_NetSetAdvertItem(0, GAMELIST_KEY_MAP_TYPE, params->m_mapName);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::NetClientVehicleAccepted(void *instance, int, void*[])
|
|
{
|
|
return MWApplication::GetInstance()->localVehicelAccepted;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetVehicleRejectionReason(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
int error = INTPARM(0);
|
|
int *parameter = INTARRAYPARAM(1);
|
|
|
|
*parameter = 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
if (error >= app->lastErrorCount)
|
|
return NO_BUILDERROR;
|
|
|
|
|
|
*parameter = app->lastErrorsParameter[error];
|
|
return app->lastErrors[error];
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetVehicleRejectionReasonCount(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
return app->lastErrorCount;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotVehicleRejectionReason(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
int error = INTPARM(0);
|
|
int *parameter = INTARRAYPARAM(1);
|
|
|
|
*parameter = 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
if (error >= app->lastBotErrorCount)
|
|
return NO_BUILDERROR;
|
|
|
|
|
|
*parameter = app->lastBotErrorsParameter[error];
|
|
return app->lastBotErrors[error];
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotVehicleRejectionReasonCount(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
return app->lastBotErrorCount;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::ClearLocalRestrictions(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
|
|
params->m_allowedMech[0] = 0xffffffff;
|
|
params->m_allowedBeam[0] = 0xffffffff;
|
|
params->m_allowedMissile[0] = 0xffffffff;
|
|
params->m_allowedProjectile[0] = 0xffffffff;
|
|
params->m_allowedSubsystem[0] = 0xffffffff;
|
|
params->m_allowedMech[1] = 0xffffffff;
|
|
params->m_allowedBeam[1] = 0xffffffff;
|
|
params->m_allowedMissile[1] = 0xffffffff;
|
|
params->m_allowedProjectile[1] = 0xffffffff;
|
|
params->m_allowedSubsystem[1] = 0xffffffff;
|
|
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::CheckForLocalRestrictions(void * instance, int numParms, void **data)
|
|
{
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
int count = 0;
|
|
|
|
count += (params->m_allowedMech[0]==0xffffffff)?0:1;
|
|
count += (params->m_allowedBeam[0]==0xffffffff)?0:1;
|
|
count += (params->m_allowedMissile[0]==0xffffffff)?0:1;
|
|
count += (params->m_allowedProjectile[0]==0xffffffff)?0:1;
|
|
count += (params->m_allowedSubsystem[0]==0xffffffff)?0:1;
|
|
|
|
count += (params->m_allowedMech[1]==0xffffffff)?0:1;
|
|
count += (params->m_allowedBeam[1]==0xffffffff)?0:1;
|
|
count += (params->m_allowedMissile[1]==0xffffffff)?0:1;
|
|
count += (params->m_allowedProjectile[1]==0xffffffff)?0:1;
|
|
count += (params->m_allowedSubsystem[1]==0xffffffff)?0:1;
|
|
|
|
|
|
if (count)
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
int MW4Shell::GetClientReady(void * instance,int, void *[])
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
return app->GetClientReady();
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
int MW4Shell::SetClientReady(void * instance,int, void *[])
|
|
{
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
app->SetClientReady();
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
int MW4Shell::SetClientUnready(void * instance,int, void *[])
|
|
{
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
app->SetClientUnready();
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::RequestTeam(void * instance,int, void *data[])
|
|
{
|
|
|
|
int team = (int)*((int **)data[0]);
|
|
|
|
if (team < 0)
|
|
return 0;
|
|
|
|
if (team > 8)
|
|
return 0;
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
app->SendTeamRequest(team);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SendVehicleRequest(void * instance,int, void *[])
|
|
{
|
|
if (!CTCL_IsConsole()) {
|
|
if (Connection::Server != NULL)
|
|
{
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
app->SendVehicleRequest();
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetMechName(void * instance,int numParms,void** data)
|
|
{
|
|
int mechID = (int)*((int **)data[0]);
|
|
if (mechID >= numMechPrototypes)
|
|
return 0;
|
|
|
|
if (*((char **)data[1]))
|
|
gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(128);
|
|
strcpy(*((char **) data[1]), mechPrototypeNames[mechID]);
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SelectMech(void * instance,int numParms,void** data)
|
|
{
|
|
int vID = (int)*((int **)data[0]);
|
|
if (vID >= numMechPrototypes)
|
|
return 0;
|
|
|
|
vehicleID = vID;
|
|
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
if (vehicleID >= 0)
|
|
Instance->vehicleInstanceFile = mechPrototypeFilenames[vehicleID];
|
|
gos_PopCurrentHeap();
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
int MW4Shell::SelectSkin(void * instance,int numParms,void** data)
|
|
{
|
|
if (CTCL_IsConsole())
|
|
return 1;
|
|
|
|
int skin_id = INTPARM(0);
|
|
|
|
Check_Object(MWApplication::GetInstance()->m_skinsTable);
|
|
|
|
if (skin_id > MWApplication::GetInstance()->m_skinsTable->GetTableSize())
|
|
{
|
|
skin_id = 0;
|
|
}
|
|
|
|
|
|
MWTable::TableIterator *iterator = MWApplication::GetInstance()->m_skinsTable->MakeTableIterator();
|
|
|
|
|
|
MWTableEntry *entry = NULL;
|
|
|
|
for (int i = 0; i < skin_id; ++i)
|
|
{
|
|
iterator->Next();
|
|
}
|
|
|
|
entry = iterator->ReadAndNext();
|
|
|
|
|
|
if (entry != NULL)
|
|
{
|
|
char *prefix = entry->GetData();
|
|
MW4Shell::Instance->m_skinPrefix = *prefix;
|
|
}
|
|
else
|
|
{
|
|
MW4Shell::Instance->m_skinPrefix = DefaultSkinPrefix;
|
|
}
|
|
|
|
// if our skin doesnt match we need to tell the server
|
|
if (MWApplication::GetInstance()->servedConnectionData[Connection::Local->GetID()].pilotSkins != MW4Shell::Instance->m_skinPrefix )
|
|
{
|
|
|
|
MWApplication::GetInstance()->servedConnectionData[Connection::Local->GetID()].pilotSkins = MW4Shell::Instance->m_skinPrefix;
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
app->SendVehicleRequest();
|
|
}
|
|
|
|
delete iterator;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetSavedGameCount(void * instance, int, void *[])
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetSavedGameName(void * instance,int numParms,void** data)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::LoadSavedGame(void * instance,int numParms,void** data)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SetShellCommand(void * instance,int numParms,void** type)
|
|
{
|
|
Instance->shellCommand = int(type[0]);
|
|
|
|
//SPEWALWAYS(("jerryeds", "SHELL COMMAND : %d", Instance->shellCommand));
|
|
|
|
switch (Instance->shellCommand)
|
|
{
|
|
case ExitToWindowsShellCommand:
|
|
case StartSinglePlayerGameCommand:
|
|
case StartNetworkShellsCommand:
|
|
case StartNetworkGameCommand:
|
|
case ExitMissionCommand:
|
|
case DisconnectCommand:
|
|
case DisconnectLobbyCommand:
|
|
case ExitToMainMenuCommand:
|
|
case ResumeMissionCommand:
|
|
case SetPauseOptionResCommand:
|
|
case UnsetPauseOptionResCommand:
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::LoadQuickSave(void* instance, int, void *[])
|
|
{
|
|
Adept::ReceiverDataMessageOf<int> message(Application::LoadQuickGameMessageID,
|
|
sizeof(Adept::ReceiverDataMessageOf<int>),
|
|
0,
|
|
0,
|
|
NULL);
|
|
|
|
Application::GetInstance()->Receive(&message);
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::SaveQuickSave(void* instance, int, void *[])
|
|
{
|
|
Adept::ReceiverDataMessageOf<int> message(Application::SaveQuickGameMessageID,
|
|
sizeof(Adept::ReceiverDataMessageOf<int>),
|
|
0,
|
|
0,
|
|
NULL);
|
|
|
|
Application::GetInstance()->Receive(&message);
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SetVideoRes(void * instance, int numParms, void** data)
|
|
{
|
|
int res = int(data[0]);
|
|
|
|
switch (res)
|
|
{
|
|
case VIDEORES_600_480:
|
|
gos_SetScreenMode(640,480,Environment.bitDepth,Environment.FullScreenDevice);
|
|
break;
|
|
case VIDEORES_800_600:
|
|
gos_SetScreenMode(800,600,Environment.bitDepth,Environment.FullScreenDevice);
|
|
break;
|
|
case VIDEORES_1024_768:
|
|
gos_SetScreenMode(1024,768,Environment.bitDepth,Environment.FullScreenDevice);
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::ServerStatsScale(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int total = 0;
|
|
|
|
for (int i = 0; i < Network::NetStatCount-4; ++i)
|
|
{
|
|
total += Network::GetInstance()->netStatCollector[i].GetPublishedStatTotal();
|
|
}
|
|
|
|
if (total > ServerScale)
|
|
{
|
|
ServerScale = 1024;
|
|
while (total > ServerScale)
|
|
ServerScale = ServerScale * 2;
|
|
}
|
|
else
|
|
{
|
|
if (total < (ServerScale*0.5f))
|
|
{
|
|
if (gos_GetElapsedTime() - TimeToLowerServerScale > 3.0f)
|
|
{
|
|
ServerScale = 1024;
|
|
while (total > ServerScale)
|
|
ServerScale = ServerScale * 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TimeToLowerServerScale = gos_GetElapsedTime();
|
|
}
|
|
}
|
|
|
|
return ServerScale;
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::ClientStatsScale(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int total = 0;
|
|
for (int player_id = 0; player_id < Maximum_Players; ++player_id)
|
|
{
|
|
int sub_total = 0;
|
|
for (int stat_id = 0; stat_id < Network::NetStatCount-4; ++stat_id)
|
|
{
|
|
sub_total += Network::GetInstance()->netStatCollector[stat_id].GetPublishedStat(player_id);
|
|
}
|
|
|
|
if (sub_total > total)
|
|
{
|
|
total = sub_total;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (total > ClientScale)
|
|
{
|
|
ClientScale = 1024;
|
|
while (total > ClientScale)
|
|
ClientScale = ClientScale * 2;
|
|
}
|
|
else
|
|
{
|
|
if (total < (ClientScale*0.5f))
|
|
{
|
|
if (gos_GetElapsedTime() - TimeToLowerClientScale > 5.0f)
|
|
{
|
|
ClientScale = 1024;
|
|
while (total > ClientScale)
|
|
ClientScale = ClientScale * 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TimeToLowerClientScale = gos_GetElapsedTime();
|
|
}
|
|
}
|
|
|
|
return ClientScale;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::ServerStatsDirty(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
bool dirty = false;
|
|
for (int i = 0; i < Network::NetStatCount; ++i)
|
|
{
|
|
if (Network::GetInstance()->netStatCollector[i].IsDirty())
|
|
{
|
|
dirty = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return dirty;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::ServerCleanDirtyFlag(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
for (int i = 0; i < Network::NetStatCount; ++i)
|
|
{
|
|
Network::GetInstance()->netStatCollector[i].ClearDirty();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetCurrentGameName(void * instance,int numParms,void* data[])
|
|
{
|
|
Check_Object(Network::GetInstance());
|
|
Check_Object(Application::GetInstance());
|
|
|
|
if (*((char **)data[0])) gos_Free(*((char **)data[0]));
|
|
*((char **) data[0]) = (char *)gos_Malloc(128);
|
|
strcpy(*((char **) data[0]), Network::GetInstance()->GetGameName());
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetCurrentMissionName(void * instance,int numParms,void* data[])
|
|
{
|
|
Check_Object(Network::GetInstance());
|
|
Check_Object(Application::GetInstance());
|
|
|
|
Stuff::MString short_mission_name;
|
|
Stuff::MString mission_name = MWApplication::GetInstance()->GetMissionName();
|
|
short_mission_name = mission_name.StripDirectory().StripExtension();
|
|
|
|
|
|
if (*((char **)data[0])) gos_Free(*((char **)data[0]));
|
|
*((char **) data[0]) = (char *)gos_Malloc(128);
|
|
strcpy(*((char **) data[0]), short_mission_name);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerCount(void * instance,int numParms,void* data[])
|
|
{
|
|
Check_Object(Network::GetInstance());
|
|
|
|
return Maximum_Players;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::IsPlayerValid(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int player_number = (int)*((int **)data[0]);
|
|
|
|
if (player_number < 2)
|
|
return 0;
|
|
if (player_number >= Maximum_Players)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(player_number);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerName(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int player_number = (int)*((int **)data[0]);
|
|
if (player_number < 0)
|
|
return 0;
|
|
if (player_number >= Maximum_Players)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(player_number);
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
if (*((char **)data[1])) gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(256);
|
|
strcpy(*((char **) data[1]), connection->GetConnectionName());
|
|
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::GetStatisticsCount(void * instance,int numParms,void* data[])
|
|
{
|
|
// skip the first two from the stat trackers...
|
|
return Network::NetStatCount - 4;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetStatisticName(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int stat_number = (int)*((int **)data[0]);
|
|
|
|
if (stat_number > Network::NetStatCount)
|
|
return 0;
|
|
|
|
if (stat_number < 0)
|
|
return 0;
|
|
|
|
// all the stats are done together so we can just use one of thier
|
|
// index to find the mech...
|
|
|
|
|
|
if (*((char **)data[1])) gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(128);
|
|
strcpy(*((char **) data[1]), Network::GetInstance()->netStatCollector[stat_number].GetName());
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetStatisticbps(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
int stat_number = (int)*((int **)data[0]);
|
|
|
|
if (stat_number > Network::NetStatCount)
|
|
return 0;
|
|
|
|
if (stat_number < 0)
|
|
return 0;
|
|
|
|
|
|
int player_number = (int)*((int **)data[1]);
|
|
|
|
if (player_number > Maximum_Players)
|
|
return 0;
|
|
if (player_number < -1)
|
|
return 0;
|
|
|
|
|
|
|
|
if (player_number == -1)
|
|
{
|
|
return Network::GetInstance()->netStatCollector[stat_number].GetPublishedStatTotal();
|
|
}
|
|
|
|
return Network::GetInstance()->netStatCollector[stat_number].GetPublishedStat(player_number);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetStatisticLifeTimeTotal(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
int stat_number = (int)*((int **)data[0]);
|
|
|
|
if (stat_number > Network::NetStatCount)
|
|
return 0;
|
|
|
|
if (stat_number < -1)
|
|
return 0;
|
|
|
|
|
|
int player_number = (int)*((int **)data[1]);
|
|
|
|
if (player_number > Maximum_Players)
|
|
return 0;
|
|
if (player_number < 0)
|
|
return 0;
|
|
|
|
|
|
if (player_number == -1)
|
|
{
|
|
return Network::GetInstance()->netStatCollector[stat_number].GetLifetimeTotal();
|
|
}
|
|
|
|
return Network::GetInstance()->netStatCollector[stat_number].GetPublishedStatLifetimeTotal(player_number);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayersbps(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
int player_number = (int)*((int **)data[0]);
|
|
|
|
if (player_number > Maximum_Players)
|
|
return 0;
|
|
if (player_number < -1)
|
|
return 0;
|
|
|
|
|
|
int total = 0;
|
|
|
|
if (player_number == -1)
|
|
{
|
|
for (int i = 0; i < Network::NetStatCount-4; ++i)
|
|
{
|
|
total += Network::GetInstance()->netStatCollector[i].GetPublishedStatTotal();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < Network::NetStatCount-4; ++i)
|
|
{
|
|
total += Network::GetInstance()->netStatCollector[i].GetPublishedStat(player_number);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return total;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerPing(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
int player_number = (int)*((int **)data[0]);
|
|
|
|
|
|
if (player_number < 0)
|
|
return 0;
|
|
if (player_number >= Maximum_Players)
|
|
return 0;
|
|
|
|
|
|
return (int)MWApplication::GetInstance()->servedConnectionData[player_number].effectivePing;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayersIncommingPacketsPerSecond(void * instance,int numParms,void* data[])
|
|
{
|
|
int player_number = (int)*((int **)data[0]);
|
|
|
|
if (player_number < -1)
|
|
return 0;
|
|
if (player_number >= Maximum_Players)
|
|
return 0;
|
|
|
|
|
|
if (player_number == -1)
|
|
{
|
|
return Network::GetInstance()->netStatCollector[Network::IncomingPacketCountStat].GetPublishedStatTotal();
|
|
}
|
|
|
|
return Network::GetInstance()->netStatCollector[Network::IncomingPacketCountStat].GetPublishedStat(player_number);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayersOutgoingPacketsPerSecond(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
int player_number = (int)*((int **)data[0]);
|
|
|
|
if (player_number < -1)
|
|
return 0;
|
|
if (player_number >= Maximum_Players)
|
|
return 0;
|
|
|
|
|
|
if (player_number == -1)
|
|
{
|
|
return Network::GetInstance()->netStatCollector[Network::OutgoingPacketCountStat].GetPublishedStatTotal();
|
|
}
|
|
|
|
return Network::GetInstance()->netStatCollector[Network::OutgoingPacketCountStat].GetPublishedStat(player_number);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetGameTime(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
|
|
|
|
MWMission *mission = Cast_Object(MWMission*, MWMission::GetInstance());
|
|
Stuff::Scalar time = mission->GetEndMissionTime();
|
|
|
|
int hours = (int)(time / 3600);
|
|
time -= (hours * 3600);
|
|
|
|
int minutes = (int)(time / 60);
|
|
time -= (minutes * 60);
|
|
|
|
int seconds = (int)(time);
|
|
|
|
|
|
if (*((char **)data[0])) gos_Free(*((char **)data[0]));
|
|
*((char **) data[0]) = (char *)gos_Malloc(128);
|
|
|
|
|
|
char buffer[128];
|
|
|
|
sprintf(buffer,"%02d:%02d:%02d", hours, minutes, seconds);
|
|
|
|
strcpy(*((char **) data[0]), buffer);
|
|
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetRealTime(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
if (*((char **)data[0])) gos_Free(*((char **)data[0]));
|
|
*((char **) data[0]) = (char *)gos_Malloc(128);
|
|
|
|
|
|
strcpy(*((char **) data[0]), gos_GetFormattedTime());
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetRealDate(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
if (*((char **)data[0])) gos_Free(*((char **)data[0]));
|
|
*((char **) data[0]) = (char *)gos_Malloc(128);
|
|
|
|
|
|
strcpy(*((char **) data[0]), gos_GetFormattedDate( false));
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::Shell_CallbackHandler(void* instance, int count, void* data[])
|
|
{
|
|
Check_Pointer(Instance);
|
|
|
|
switch(CALLBACKID)
|
|
{
|
|
case ShellGetDummyData:
|
|
return Instance->GetDummyData(count, data);
|
|
case ShellDataGetMissionNames:
|
|
return Instance->GetMissionNames(count, data);
|
|
case ShellInitIAScreen:
|
|
return Instance->InitIAScreen();
|
|
case ShellInitCampaignScreen:
|
|
return Instance->InitCampaignScreen();
|
|
case ShellInitMechLabScreen:
|
|
return Instance->InitMechLabScreen();
|
|
case ShellClearMechLabScreen:
|
|
return Instance->ClearMechLab(1);
|
|
case ShellDataGetMechs:
|
|
return Instance->GetMechs(data, count);
|
|
case ShellSetMech:
|
|
return Instance->SetMech(data, count);
|
|
case ShellInitMPScreen:
|
|
return Instance->InitMPScreen();
|
|
case ShellSetTime:
|
|
return Instance->SetTime(data, count);
|
|
case ShellStartCampaignMission:
|
|
return Instance->StartCampaignMission();
|
|
case ShellCampaignGetPilotData:
|
|
return Instance->GetLancemates(data, count);
|
|
case ShellCampaignSetPilotData:
|
|
return Instance->SetLancemate(data, count);
|
|
case ShellInitCampaignMechLab:
|
|
return Instance->InitCampaignMechLab();
|
|
case ShellCampaignSelectPilot:
|
|
return Instance->SelectCurrentPilot(data, count);
|
|
case ShellCampaignVerifyLaunchData:
|
|
return Instance->VerifyLaunchData();
|
|
case ShellCampaignGetPilotMechData:
|
|
return Instance->GetPilotMechData(data, count);
|
|
case ShellCampaignGetMechs:
|
|
return Instance->GetCampaignMechs(data, count);
|
|
case ShellCampaignSetMech:
|
|
return Instance->SetCampaignMech(data, count);
|
|
case ShellCreateNewPilot:
|
|
return Instance->CreateNewPilot(data, count);
|
|
case ShellClonePilot:
|
|
return Instance->ClonePilot(data, count);
|
|
case ShellSelectPilot:
|
|
return Instance->SelectPilot(data, count);
|
|
case ShellDeletePilot:
|
|
return Instance->DeletePilot(data, count);
|
|
case ShellRenamePilot:
|
|
return Instance->RenamePilot(data, count);
|
|
case ShellGetPilotList:
|
|
return Instance->GetPilotList(data, count);
|
|
case ShellGetDifficultyLevel:
|
|
return Instance->GetDifficultyLevel(data, count);
|
|
case ShellSetDifficultyLevel:
|
|
return Instance->SetDifficultyLevel(data, count);
|
|
case ShellGetPilotName:
|
|
return Instance->GetCurrentPilotName(data, count);
|
|
case ShellCampaignGetLanceStats:
|
|
return Instance->GetLanceStats(data, count);
|
|
case ShellCampaignGetMechStats:
|
|
return Instance->GetMechStats(data, count);
|
|
case ShellCampaignGetMissionRegionCount:
|
|
return Instance->GetMissionRegionCount(data, count);
|
|
case ShellCampaignGetMissionRegionIDs:
|
|
return Instance->GetMissionRegionIDs(data, count);
|
|
case ShellCampaignGetMissionRegionData:
|
|
return Instance->GetMissionRegionData(data, count);
|
|
case ShellGetMovieFilename:
|
|
return Instance->GetMovieFilename(data, count);
|
|
case ShellAdvanceMovie:
|
|
return Instance->AdvanceMovie(data, count);
|
|
case ShellTriggerMovie:
|
|
return Instance->TriggerMovie();
|
|
case ShellCampaignSetMission:
|
|
return Instance->SetCampaignMissionName(data, count);
|
|
case ShellCampaignGetMissionNavCount:
|
|
return Instance->GetMissionNavPointCount(data, count);
|
|
case ShellCampaignGetMissionInfoCount:
|
|
return Instance->GetMissionInfoPointCount(data, count);
|
|
case ShellCampaignGetMissionDropCount:
|
|
return Instance->GetMissionDropPointCount(data, count);
|
|
case ShellCampaginGetMissionNavPoints:
|
|
return Instance->GetMissionNavPoints(data, count);
|
|
case ShellCampaginGetMissionInfoPoints:
|
|
return Instance->GetMissionInfoPoints(data, count);
|
|
case ShellCampaginGetMissionDropPoints:
|
|
return Instance->GetMissionDropPoints(data, count);
|
|
case ShellCampaignGetMissionGeneralInfoPoints:
|
|
return Instance->GetMissionGeneralInfoPoints(data, count);
|
|
case ShellCampaignGetOpData:
|
|
return Instance->GetCampaignOpData(data, count);
|
|
case ShellCampaignGetMissionData:
|
|
return Instance->GetMissionData(data, count);
|
|
case ShellOptionsGetToggleValue:
|
|
return Instance->GetOptionsToggleValue(data, count);
|
|
case ShellOptionsSetToggleValue:
|
|
return Instance->SetOptionsToggleValue(data, count);
|
|
case ShellOptionsGetSliderValue:
|
|
return Instance->GetOptionsSliderValue(data, count);
|
|
case ShellOptionsSetSliderValue:
|
|
return Instance->SetOptionsSliderValue(data, count);
|
|
case ShellSetOptionValue:
|
|
return Instance->SetOptionsValue(data, count);
|
|
case ShellGetOptionValue:
|
|
return Instance->GetOptionsValue(data, count);
|
|
case ShellCampaignGetMissionGeneralInfoCount:
|
|
return Instance->GetGeneralInfoPointCount(data, count);
|
|
case ShellSaveOptions:
|
|
return Instance->SaveOptions();
|
|
case ShellLoadDefaultOptions:
|
|
return Instance->LoadDefaultOptions();
|
|
case ShellDoesHavePilot:
|
|
return Instance->DoesHavePilotLoaded(data, count);
|
|
case ShellIASetMissionType:
|
|
return Instance->SetIAMissionType(data, count);
|
|
case ShellIASetLancemate:
|
|
return Instance->SetIALancemate(data, count);
|
|
case ShellIASetLancemateMech:
|
|
return Instance->SetIALancemateMech(data, count);
|
|
case ShellIAGetWaveMissions:
|
|
return Instance->GetWaveMissions(data, count);
|
|
case ShellIASetWaveMission:
|
|
return Instance->SetWaveMission(data, count);
|
|
case ShellIAAddMechToEnemyInWave:
|
|
return Instance->AddMechToEnemyAI(data, count);
|
|
case ShellIARemoveEnemyFromWave:
|
|
return Instance->RemoveEnemyAIFromWave(data, count);
|
|
case ShellIAGetWaveAITypes:
|
|
return Instance->GetWaveAITypes(data, count);
|
|
case ShellIASetEnemyWaveCount:
|
|
return Instance->SetEnemyWaveCount(data, count);
|
|
case ShellIASetEnemyCount:
|
|
return Instance->SetEnemyCount(data, count);
|
|
case ShellIASetWavePlayerRespawns:
|
|
return Instance->SetWavePlayerRespawns(data, count);
|
|
case ShellIAGetTrainingMissions:
|
|
return Instance->GetTrainingMissions(data, count);
|
|
case ShellIASetTrainingMission:
|
|
return Instance->SetTrainingMission(data, count);
|
|
case ShellIAGetEnemyChassis:
|
|
return Instance->GetEnemyMechChassis(data, count);
|
|
case ShellGetTimeOfDay:
|
|
return Instance->GetTimeOfDay(data, count);
|
|
case ShellSetIAMissionName:
|
|
return Instance->SetIAMissionName(data, count);
|
|
case ShellIAGetMissionMapInfo:
|
|
return Instance->ShellIAGetMapInfo(data, count);
|
|
case ShellIAGetDifficulty:
|
|
return Instance->IAGetDifficulty(data, count);
|
|
case ShellIASetDifficulty:
|
|
return Instance->IASetDifficulty(data, count);
|
|
case ShellIAGetWavePlayerRespawns:
|
|
return Instance->IAGetWavePlayerRespawns(data, count);
|
|
case ShellIAGetEnemyWaveCount:
|
|
return Instance->IAGetEnemyWaveCount(data, count);
|
|
case ShellIASetMasterTrial:
|
|
return Instance->IASetupMasterTrials(data, count);
|
|
case ShellIAGetMasterTrialMissions:
|
|
return Instance->IAGetMasterTrialMissions(data, count);
|
|
case ShellCampaignGetPlayerStatus:
|
|
return Instance->CampaignGetPlayerStatus(data, count);
|
|
case ShellCampaignGetLanceStatus:
|
|
return Instance->CampaignGetLanceStatus(data, count);
|
|
case ShellCampaignGetMechSalvage:
|
|
return Instance->CampaignGetMechSalvage(data, count);
|
|
case ShellCampaignGetWeaponSalvage:
|
|
return Instance->CampaignGetWeaponSalvage(data, count);
|
|
case ShellCampaignGetCampaignResults:
|
|
return Instance->CampaignGetResults(data, count);
|
|
case ShellExitDedicatedServer:
|
|
return Instance->ExitDedicatedServer(data, count);
|
|
case ShellDisconnectDedicatedServer:
|
|
return Instance->DisconnectDedicatedServer(data, count);
|
|
case ShellCampaignGetGames:
|
|
return Instance->CampaignGetSavedGames(data, count);
|
|
case ShellCampaignLoadGame:
|
|
return Instance->CampaignLoadGame(data, count);
|
|
case ShellControlSetDefault:
|
|
return Instance->ControlSetDefault(data, count);
|
|
case ShellControlAssignValue:
|
|
return Instance->ControlAssignValue(data, count);
|
|
case ShellControlAcceptChanges:
|
|
return Instance->ControlAcceptChanges(data, count);
|
|
case ShellControlCancelChanges:
|
|
return Instance->ControlCancelChanges(data, count);
|
|
case ShellControlGetMapping:
|
|
return Instance->ControlGetMapping(data, count);
|
|
case ShellControlGetValue:
|
|
return Instance->ControlGetValue(data, count);
|
|
case ShellControlScanKeyboard:
|
|
return Instance->ControlScanKeyboard(data, count);
|
|
case ShellIAGetResults:
|
|
return Instance->IAGetResults(data, count);
|
|
case ShellLoadMissionName:
|
|
return Instance->GetLoadMissionName(data, count);
|
|
case ShellIAGetMissionRegionData:
|
|
return Instance->GetIAMissionRegionData(data, count);
|
|
case ShellCampaignPlayIntro:
|
|
return Instance->CampaignPlayIntro(data, count);
|
|
case ShellCampaignPlayEnd:
|
|
return Instance->CampaignPlayEnd(data, count);
|
|
case ShellCampaignGetMechBars:
|
|
return Instance->CampaignGetMechBars(data, count);
|
|
case ShellIAGetStockMechs:
|
|
return Instance->IAGetStockMechs(data, count);
|
|
case ShellIAGetMechsWithEmpty:
|
|
return Instance->IAGetMechsWithSpace(data, count);
|
|
case ShellIAGetMechBars:
|
|
return Instance->IAGetMechBars(data, count);
|
|
#if !defined(NO_MR)
|
|
case MissionReviewSpeedUp: // these take no data
|
|
return NMissionReview::SpeedUp ();
|
|
case MissionReviewSlowDown:
|
|
return NMissionReview::SlowDown ();
|
|
case MissionReviewRewind:
|
|
return NMissionReview::Rewind ();
|
|
case MissionReviewPause:
|
|
return NMissionReview::Pause ();
|
|
case MissionReviewCenterOn:
|
|
return NMissionReview::CenterOn (data,count);
|
|
#endif // !defined(NO_MR)
|
|
case ShellIAMasterSetPlayerMech:
|
|
return Instance->SetMasterTrialPlayerMech(data, count);
|
|
case GetJoyStickNames:
|
|
return Instance->ControlGetJoyStickNames(data, count);
|
|
case GetJoyStickInvert:
|
|
return Instance->ControlGetJoyStickInvert(data, count);
|
|
case GetMouseInvert:
|
|
return Instance->ControlGetMouseInvert(data, count);
|
|
case GetJoyStick:
|
|
return Instance->ControlGetJoyStick(data, count);
|
|
case GetMouse:
|
|
return Instance->ControlGetMouse(data, count);
|
|
case GetJoyStickShift:
|
|
return Instance->ControlGetJoyStickShift(data, count);
|
|
case GetJoyListSelected:
|
|
return Instance->ControlGetJoyListSelected(data, count);
|
|
case SetJoyListSelected:
|
|
return Instance->ControlSetJoyListSelected(data, count);
|
|
case GetForce:
|
|
return Instance->ControlGetForce(data, count);
|
|
case SetForce:
|
|
return Instance->ControlSetForce(data, count);
|
|
case SetJoyStickInvert:
|
|
return Instance->ControlSetJoyStickInvert(data, count);
|
|
case SetMouseInvert:
|
|
return Instance->ControlSetMouseInvert(data, count);
|
|
case SetJoyStickShift:
|
|
return Instance->ControlSetJoyStickShift(data, count);
|
|
case SetJoyStick:
|
|
return Instance->ControlSetJoyStick(data, count);
|
|
case SetMouse:
|
|
return Instance->ControlSetMouse(data, count);
|
|
case SetJoyShiftValue:
|
|
return Instance->ControlSetJoyShiftValue(data, count);
|
|
case GetJoyShiftValue:
|
|
return Instance->ControlGetJoyShiftValue(data, count);
|
|
case GetMouseSensitivity:
|
|
return Instance->ControlGetMouseSensitivity(data, count);
|
|
case SetMouseSensitivity:
|
|
return Instance->ControlSetMouseSensitivity(data, count);
|
|
case SaveSettings:
|
|
return Instance->ControlSaveSettings(data, count);
|
|
case RestoreSetting:
|
|
return Instance->ControlRestoreSettings(data, count);
|
|
case GetJoyXAxis:
|
|
return Instance->ControlGetJoyXAxis(data, count);
|
|
case GetJoyRudderAxis:
|
|
return Instance->ControlGetJoyRudderAxis(data, count);
|
|
case GetMouseXAxis:
|
|
return Instance->ControlGetMouseXAxis(data, count);
|
|
case SetJoyXAxis:
|
|
return Instance->ControlSetJoyXAxis(data, count);
|
|
case SetJoyRudderAxis:
|
|
return Instance->ControlSetJoyRudderAxis(data, count);
|
|
case SetMouseXAxis:
|
|
return Instance->ControlSetMouseXAxis(data, count);
|
|
case ShellIATrainingSetPlayerMech:
|
|
return Instance->SetTrainingPlayerMech();
|
|
case ShellGetTrainingMechBars:
|
|
return Instance->GetTrainingMechBars(data, count);
|
|
case ShellGetMasterMechBars:
|
|
return Instance->GetMasterMechBars(data, count);
|
|
case ShellGetClosingCinema:
|
|
return Instance->GetClosingCinema(data, count);
|
|
case ShellGetLastPlayerMech:
|
|
return Instance->GetLastPlayerMech(data, count);
|
|
case ShellSetMasterTrialsDifficulty:
|
|
return Instance->SetMasterTrialDifficutly(data, count);
|
|
case ShellLaunchTrainingMission:
|
|
return Instance->LaunchTrainingMission();
|
|
case ShellGetSupportedResolutions:
|
|
return Instance->GetSupportedRes(data, count);
|
|
case ShellGetIsResourceEnglish:
|
|
return Instance->GetIsResourceEnglish(data, count);
|
|
case SetJoyStickThrottle:
|
|
return Instance->ControlSetJoyStickThrottle(data, count);
|
|
case GetJoyStickThrottle:
|
|
return Instance->ControlGetJoyStickThrottle(data, count);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int MW4Shell::GetIsResourceEnglish(void* data[], int count)
|
|
{
|
|
extern DWORD gLanguageDLL;
|
|
|
|
if (stricmp(gos_GetResourceString(gLanguageDLL, 0), "English") == 0)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int MW4Shell::ExitDedicatedServer(void* data[], int count)
|
|
{
|
|
Instance->shellCommand = ExitMissionCommand;
|
|
Instance->currentShellRunning = StatShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
int MW4Shell::DisconnectDedicatedServer(void* data[], int count)
|
|
{
|
|
Instance->shellCommand = DisconnectCommand;
|
|
Instance->currentShellRunning = StatShellRunning;
|
|
Environment.DoGameLogic = &MWApplication::DoShellLogic;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionNames(int count, void* data[])
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWCampaign::Instance);
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *num_missions = INTARRAYPARAM(2);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::Instance->m_missions);
|
|
// Verify(m_iaMissionCount == iterator.GetSize());
|
|
|
|
CampaignMissionPlug * mission;
|
|
int i = 0;
|
|
while(((mission = iterator.ReadAndNext()) != NULL) && (i < MAX_MISSIONS))
|
|
{
|
|
if(mission->m_status > 0)
|
|
{
|
|
Check_Object(mission);
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(128);
|
|
MString mission_name;
|
|
mission_name = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
mission_name.StripDirectory().StripExtension();
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mission_name,
|
|
mission_name.GetLength() + 1
|
|
);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
Stuff::MString missions_path = "Resource\\UserMissions\\*.mw4";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
int mission_exists = false;
|
|
while(((file_name = resource_directory->GetCurrentFileName()) != NULL) &&
|
|
(i < MAX_MISSIONS))
|
|
{
|
|
mission_exists = false;
|
|
|
|
MString nfo_name = file_name;
|
|
nfo_name.StripExtension();
|
|
nfo_name = "Resource\\UserMissions\\" + nfo_name + ".nfo";
|
|
if (gos_DoesFileExist(nfo_name))
|
|
{
|
|
NotationFile notefile(nfo_name);
|
|
|
|
Page *page = notefile.FindPage("ruleset");
|
|
if (page != NULL)
|
|
{
|
|
ChainIteratorOf<Note*> *note_iterator = page->MakeNoteIterator();
|
|
|
|
Note *note;
|
|
while ((note = note_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
if (_stricmp(note->GetName(), "type") == 0)
|
|
{
|
|
int rule_set;
|
|
note->GetEntry(&rule_set);
|
|
if (rule_set == SinglePlayer)
|
|
{
|
|
mission_exists = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
delete note_iterator;
|
|
}
|
|
}
|
|
else
|
|
mission_exists = true;
|
|
|
|
if (mission_exists)
|
|
{
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(128);
|
|
MString mission_name;
|
|
mission_name = file_name;
|
|
mission_name.StripDirectory().StripExtension();
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mission_name,
|
|
mission_name.GetLength() + 1
|
|
);
|
|
i++;
|
|
}
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
*num_missions = i;
|
|
gos_PopCurrentHeap();
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::InitIAScreen()
|
|
{
|
|
Check_Object(m_optionsObject);
|
|
|
|
NetMissionParameters::MWNetMissionParameters *params = MWApplication::GetInstance()->GetLocalNetParams();
|
|
params->ResetParameters();
|
|
|
|
MWApplication::GetInstance()->InitializeOptions(m_optionsObject);
|
|
|
|
MWApplication::GetInstance()->m_currentMissionStatus = 0;
|
|
MWApplication::GetInstance()->m_iaDisplayGameType = 0;
|
|
|
|
if(MWGame::GetInstance())
|
|
{
|
|
delete MWGame::GetInstance();
|
|
GlobalPointers::ClearPointer(MWGameGlobalPointerIndex);
|
|
}
|
|
if(MWCampaign::Instance)
|
|
{
|
|
delete MWCampaign::Instance;
|
|
MWCampaign::Instance = NULL;
|
|
}
|
|
if(SalvageManager::GetInstance())
|
|
{
|
|
delete SalvageManager::GetInstance();
|
|
GlobalPointers::ClearPointer(SalvageManagerGlobalPointerIndex);
|
|
}
|
|
|
|
if(MWCampaign::TrainingInstance)
|
|
{
|
|
delete MWCampaign::TrainingInstance;
|
|
MWCampaign::TrainingInstance = NULL;
|
|
}
|
|
|
|
if(MWCampaign::WaveInstance)
|
|
{
|
|
delete MWCampaign::WaveInstance;
|
|
MWCampaign::WaveInstance = NULL;
|
|
}
|
|
|
|
if(MWCampaign::MasterTrialsInstance)
|
|
{
|
|
delete MWCampaign::MasterTrialsInstance;
|
|
MWCampaign::MasterTrialsInstance = NULL;
|
|
}
|
|
|
|
Verify(!MWCampaign::Instance);
|
|
MWCampaign::Instance = MWCampaign::MakeNewCampaign("Content\\Campaigns\\InstantAction.campaign");
|
|
Check_Pointer(MWCampaign::Instance);
|
|
Verify(!MWCampaign::TrainingInstance);
|
|
MWCampaign::TrainingInstance = MWCampaign::MakeNewCampaign("Content\\Campaigns\\Training.campaign");
|
|
Check_Pointer(MWCampaign::TrainingInstance);
|
|
Verify(!MWCampaign::WaveInstance);
|
|
MWCampaign::WaveInstance = MWCampaign::MakeNewCampaign("Content\\Campaigns\\Wave.campaign");
|
|
Check_Pointer(MWCampaign::WaveInstance);
|
|
Verify(!MWCampaign::MasterTrialsInstance);
|
|
MWCampaign::MasterTrialsInstance = MWCampaign::MakeNewCampaign("Content\\Campaigns\\MasterTrials.campaign");
|
|
Check_Pointer(MWCampaign::MasterTrialsInstance);
|
|
GlobalPointers::AddGlobalPointer(SalvageManager::MakeNewSalvageManager(ResourceID::Null), SalvageManagerGlobalPointerIndex);
|
|
Check_Pointer(SalvageManager::GetInstance());
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::Instance->m_missions);
|
|
m_iaMissionCount = GetNumberOfMissionsInMissionPlay();
|
|
|
|
m_mechCount = GetMechCount();
|
|
|
|
m_waves = 1;
|
|
m_botsPerWave = 0;
|
|
m_lancePerWave = 0;
|
|
m_playerLives = 1;
|
|
|
|
//You can default to this since we don't store what was going on before.
|
|
ia_gameType = IA_MISSIONSELECTION;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::InitCampaignScreen()
|
|
{
|
|
|
|
Check_Object(MWApplication::GetInstance());
|
|
Check_Object(m_optionsObject);
|
|
ResetMovieList();
|
|
|
|
MWApplication::GetInstance()->InitializeCampaignGame();
|
|
|
|
Check_Object(MWCampaign::Instance);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::Instance->m_missions);
|
|
m_iaMissionCount = iterator.GetSize();
|
|
|
|
ia_gameType = IA_MISSIONSELECTION;
|
|
//This will eventually only list the mechs that came from mech lab construction
|
|
//I.E will get this count from MWGame::Instance
|
|
m_mechCount = GetCampaignMechCount();
|
|
|
|
MWApplication::GetInstance()->m_isNight = false;
|
|
MWApplication::GetInstance()->InitializeOptions(m_optionsObject);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::InitMPScreen()
|
|
{
|
|
MWApplication::GetInstance()->InitializeOptions(m_optionsObject);
|
|
m_mechCount = GetMechCount();
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::InitMechLabScreen()
|
|
{
|
|
if (Network::GetInstance() == NULL)
|
|
{
|
|
Verify(!Network::GetInstance());
|
|
GlobalPointers::AddGlobalPointer(new Network, NetworkGlobalPointerIndex);
|
|
Register_Object(Network::GetInstance());
|
|
}
|
|
|
|
if(MechLab::Instance)
|
|
{
|
|
delete MechLab::Instance;
|
|
MechLab::Instance = NULL;
|
|
}
|
|
|
|
MechLab::Instance = new MechLab;
|
|
MechLab::Instance->StartUp();
|
|
Environment.UpdateRenderers = &MechLab::UpdateDisplay;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::InitCampaignMechLab()
|
|
{
|
|
if (Network::GetInstance() == NULL)
|
|
{
|
|
Verify(!Network::GetInstance());
|
|
GlobalPointers::AddGlobalPointer(new Network, NetworkGlobalPointerIndex);
|
|
Register_Object(Network::GetInstance());
|
|
}
|
|
|
|
if(MechLab::Instance)
|
|
{
|
|
delete MechLab::Instance;
|
|
MechLab::Instance = NULL;
|
|
}
|
|
|
|
CampaignMechLab *camp_lab = new CampaignMechLab;
|
|
MechLab::Instance = camp_lab;
|
|
MechLab::Instance->StartUp();
|
|
Environment.UpdateRenderers = &MechLab::UpdateDisplay;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::ClearMechLab(int nMode/* = 0*/)
|
|
{
|
|
// nMode: -1 = stop loading, 0 - stop game, 1 - from script, 2 - start game
|
|
Check_Pointer(this);
|
|
|
|
if(MechLab::Instance)
|
|
{
|
|
Check_Object(EntityManager::GetInstance());
|
|
|
|
if (!CTCL_IsConsole()) {// jcem
|
|
if (nMode != -1) {
|
|
if (MWApplication::GetInstance()->networkingFlag)
|
|
{
|
|
Connection::Local->DeleteChildren();
|
|
}
|
|
} else {
|
|
MechLab::Instance->Exit();
|
|
MechLab::Instance->FreeReplicators();
|
|
}
|
|
if(Network::GetInstance() != NULL && !MWApplication::GetInstance()->networkingFlag)
|
|
{
|
|
delete Network::GetInstance();
|
|
GlobalPointers::ClearPointer(NetworkGlobalPointerIndex);
|
|
}
|
|
}
|
|
|
|
if (nMode != -1) {
|
|
delete MechLab::Instance;
|
|
MechLab::Instance = NULL;
|
|
} else {
|
|
MidLevelRenderer::MLRTexturePool* pOld = MidLevelRenderer::MLRTexturePool::Instance;
|
|
MidLevelRenderer::MLRTexturePool::Instance = NULL;
|
|
delete MechLab::Instance;
|
|
MechLab::Instance = NULL;
|
|
MidLevelRenderer::MLRTexturePool::Instance = pOld;
|
|
}
|
|
|
|
Environment.UpdateRenderers = &MWApplication::UpdateDisplay;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
MString MW4Shell::GetMissionInstanceFilename()
|
|
{
|
|
MString return_name;
|
|
if(!strstr(m_iaMissionName, "UserMissions"))
|
|
{
|
|
return_name = "Missions\\";
|
|
return_name += m_iaMissionName;
|
|
return_name += "\\";
|
|
return_name += m_iaMissionName;
|
|
return_name += ".instance";
|
|
}
|
|
else
|
|
{
|
|
//Will already have the UserMissions on the front of this.
|
|
return_name = m_iaMissionName;
|
|
return_name += "\\";
|
|
return_name += ".instance";
|
|
}
|
|
|
|
return return_name;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetNumberOfMissionsInMissionPlay()
|
|
{
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::Instance->m_missions);
|
|
|
|
CampaignMissionPlug * mission;
|
|
int i = 0;
|
|
while((mission = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
if(mission->m_status > 0)
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
|
|
Stuff::MString missions_path = "Resource\\UserMissions\\*.mw4";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
i += resource_directory->fileEntries.GetSize();
|
|
delete resource_directory;
|
|
|
|
return i;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetLastPlayerMech(void *data[], int count)
|
|
{
|
|
gosASSERT(!CTCL_IsConsole());
|
|
int *selected_mech_index = INTARRAYPARAM(1);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
Check_Object(app);
|
|
|
|
int index = app->m_lastMechID;
|
|
|
|
//THIS FUNCTION WILL NOT PERSERVE A CAMERA SHIP SELECTION
|
|
if ((m_didSetMPMech) && (app->networkingFlag) && (index == 0))
|
|
{
|
|
index = 1;
|
|
}
|
|
|
|
// if coming from instant action to networking, increase the index count by 1
|
|
if ((!m_didSetMPMech) && (app->networkingFlag))
|
|
{
|
|
if (index > -1)
|
|
index++;
|
|
m_didSetMPMech = true;
|
|
}
|
|
|
|
// if coming from networking to instant action, decrease the index count by 1
|
|
if((m_didSetMPMech) && (!app->networkingFlag))
|
|
{
|
|
if (index > 0)
|
|
index--;
|
|
m_didSetMPMech = false;
|
|
}
|
|
|
|
// This section to handle -1 index value(coming from mechlab) or out-of-range values
|
|
if ((index < 0) || (index >= m_mechCount))
|
|
{
|
|
// reset the index first
|
|
if (app->networkingFlag)
|
|
index = 1;
|
|
else
|
|
index = 0;
|
|
|
|
//This means we have to used the mech name and find the index!
|
|
for (int count = index; count < m_mechCount; count++)
|
|
{
|
|
MString alpha_name = alphaMechNamesWithMCSorted[count];
|
|
if(alpha_name == app->m_lastMechName)
|
|
{
|
|
index = count;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
*selected_mech_index = index;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMechs(void* data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *stock_array = INTARRAYPARAM(2);
|
|
|
|
alphaMechNames.DeletePlugs();
|
|
|
|
if (alphaMechNamesWithMCSorted)
|
|
delete [] alphaMechNamesWithMCSorted;
|
|
alphaMechNamesWithMCSorted = new MString[m_mechCount];
|
|
|
|
if(m_mechIDs)
|
|
{
|
|
gos_Free(m_mechIDs);
|
|
m_mechIDs = NULL;
|
|
}
|
|
m_mechIDs = (ResourceID *)gos_Malloc(m_mechCount * sizeof(ResourceID));
|
|
|
|
if (CTCL_IsConsole()) {// jcem
|
|
if (g_CameraResID == ResourceID::Null) {
|
|
MString mech_name;
|
|
mech_name = "vehicles\\ObservationVehicle\\ObservationVehicle.instance";
|
|
Resource obs_resource(mech_name);
|
|
g_CameraResID = obs_resource.GetResourceID();
|
|
}
|
|
} else {
|
|
if (MWApplication::GetInstance()->networkingFlag)
|
|
{
|
|
FREEANDNULL(name_array[0]);
|
|
name_array[0] = (char *)gos_Malloc(128);
|
|
|
|
MString mech_name;
|
|
mech_name = "vehicles\\ObservationVehicle\\ObservationVehicle.instance";
|
|
Resource obs_resource(mech_name);
|
|
mech_name = g_szCameraShip;
|
|
Str_Copy(
|
|
name_array[0],
|
|
(const char *)mech_name,
|
|
mech_name.GetLength() + 1
|
|
);
|
|
alphaMechNamesWithMCSorted[0] = mech_name;
|
|
|
|
m_mechIDs[0] = obs_resource.GetResourceID();
|
|
stock_array[0] = 1;
|
|
}
|
|
}
|
|
|
|
MWTable::TableIterator *mech_iterator;
|
|
Check_Object(MWApplication::GetInstance()->m_mechTable);
|
|
|
|
mech_iterator = MWApplication::GetInstance()->m_mechTable->MakeTableIterator();
|
|
MWTableEntry *mech_entry;
|
|
while((mech_entry = mech_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mech_entry);
|
|
PlugOf<MString> *name_plug = new PlugOf<MString>(mech_entry->GetEntryName());
|
|
alphaMechNames.AddValue(name_plug, mech_entry->GetEntryName());
|
|
}
|
|
|
|
delete mech_iterator;
|
|
|
|
Stuff::MString mechs_path = "Resource\\Variants\\*.mw4";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(mechs_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
MString mech_name;
|
|
mech_name = file_name;
|
|
mech_name.StripDirectory().StripExtension();
|
|
|
|
PlugOf<MString> *name_plug = new PlugOf<MString>(mech_name);
|
|
alphaMechNames.AddValue(name_plug, mech_name);
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
|
|
|
|
// Sort Mad Cat correctly
|
|
SortedChainIteratorOf<PlugOf<MString> *, MString> mech_name_iterator(&alphaMechNames);
|
|
PlugOf<MString> *mstring_plug;
|
|
int mech_index = 0;
|
|
if (!CTCL_IsConsole()) {// jcem
|
|
if (MWApplication::GetInstance()->networkingFlag)
|
|
mech_index = 1;
|
|
}
|
|
while((mstring_plug = mech_name_iterator.ReadAndNext()) != NULL)
|
|
{
|
|
if (mech_index == m_mechCount)
|
|
break; // Boundary Check
|
|
|
|
alphaMechNamesWithMCSorted[mech_index] = mstring_plug->GetItem();
|
|
mech_index ++;
|
|
}
|
|
int mc2_start = 0;
|
|
while (_strnicmp(alphaMechNamesWithMCSorted[mc2_start], "Mad Cat MKII", 12) != 0)
|
|
{
|
|
mc2_start++;
|
|
}
|
|
int mc2_end = mc2_start;
|
|
while (_strnicmp(alphaMechNamesWithMCSorted[mc2_end], "Mad Cat MKII", 12) == 0)
|
|
{
|
|
mc2_end++;
|
|
}
|
|
int mc_end = mc2_end;
|
|
while (_strnicmp(alphaMechNamesWithMCSorted[mc_end], "Mad Cat", 7) == 0)
|
|
{
|
|
mc_end++;
|
|
}
|
|
int mc2_i = mc2_end - mc2_start;
|
|
int mc_i = mc_end - mc2_end;
|
|
MString* mc2_string = new MString[mc2_i];
|
|
for (int i = 0; i < mc2_i; i++)
|
|
mc2_string[i] = alphaMechNamesWithMCSorted[mc2_start + i];
|
|
for (i = 0; i < mc_i; i++)
|
|
alphaMechNamesWithMCSorted[mc2_start + i] = alphaMechNamesWithMCSorted[mc2_end + i];
|
|
for (i = 0; i < mc2_i; i++)
|
|
alphaMechNamesWithMCSorted[mc2_start + mc_i + i] = mc2_string[i];
|
|
delete [] mc2_string;
|
|
|
|
// now return the sorted strings
|
|
mech_index = 0;
|
|
if (!CTCL_IsConsole()) {// jcem
|
|
if (MWApplication::GetInstance()->networkingFlag)
|
|
mech_index = 1;
|
|
}
|
|
while (mech_index < m_mechCount)
|
|
{
|
|
MString alpha_names = alphaMechNamesWithMCSorted[mech_index];
|
|
FREEANDNULL(name_array[mech_index]);
|
|
name_array[mech_index] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
name_array[mech_index],
|
|
(const char *)alpha_names,
|
|
alpha_names.GetLength() + 1
|
|
);
|
|
|
|
MWTableEntry *mech_table_entry = MWApplication::GetInstance()->m_mechTable->FindEntry(alpha_names);
|
|
if(mech_table_entry)
|
|
{
|
|
m_mechIDs[mech_index] = mech_table_entry->GetEntryResourceID();
|
|
stock_array[mech_index] = 1;
|
|
}
|
|
else
|
|
{
|
|
m_mechIDs[mech_index] = ResourceID::Null;
|
|
stock_array[mech_index] = 0;
|
|
}
|
|
mech_index ++;
|
|
}
|
|
|
|
delete resource_directory;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetStockMechs(void* data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *num_mechs = INTARRAYPARAM(2);
|
|
|
|
if(m_stockMechIDs)
|
|
{
|
|
gos_Free(m_stockMechIDs);
|
|
m_stockMechIDs = NULL;
|
|
}
|
|
m_stockMechIDs = (ResourceID *)gos_Malloc((LastMechID + 1) * sizeof(ResourceID));
|
|
|
|
int i = 0;
|
|
|
|
MWTable::TableIterator *mech_iterator;
|
|
Check_Object(MWApplication::GetInstance()->m_mechTable);
|
|
|
|
mech_iterator = MWApplication::GetInstance()->m_mechTable->MakeTableIterator();
|
|
MWTableEntry *mech_entry;
|
|
while((mech_entry = mech_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mech_entry);
|
|
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mech_entry->GetEntryName(),
|
|
mech_entry->GetEntryName().GetLength() + 1
|
|
);
|
|
|
|
m_stockMechIDs[i] = mech_entry->GetEntryResourceID();
|
|
i++;
|
|
}
|
|
|
|
*num_mechs = i;
|
|
delete mech_iterator;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetCampaignMechs(void* data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
int *lance_id = INTARRAYPARAM(1); //What lance we need a list for
|
|
char **mech_names = STRARRAYPARAM(2); //The list of names
|
|
int *status_array = INTARRAYPARAM(3);
|
|
int *selected_name = INTARRAYPARAM(4); //What name is currently selected
|
|
int *mech_id = INTARRAYPARAM(5);
|
|
int *num_names = INTARRAYPARAM(6);
|
|
|
|
// #if defined(_ARMOR)
|
|
// int array_size = VALUEPARM(6);
|
|
// #endif
|
|
|
|
if(m_mechCount > 0)
|
|
{
|
|
if(m_mechIDs)
|
|
{
|
|
gos_Free(m_mechIDs);
|
|
m_mechIDs = NULL;
|
|
}
|
|
m_mechIDs = (ResourceID *)gos_Malloc(m_mechCount * sizeof(ResourceID));
|
|
}
|
|
|
|
SortedChainIteratorOf<MechTablePlug*, MString> iterator(&MWGame::GetInstance()->m_mechTable);
|
|
MechTablePlug *mech_plug;
|
|
PilotPlug *pilot_plug = MWGame::GetInstance()->GetPilot(*lance_id);
|
|
Check_Object(pilot_plug);
|
|
MString current_mech_name;
|
|
|
|
*selected_name = 0;
|
|
*mech_id = NoMechID;
|
|
if(pilot_plug->GetMechPlug())
|
|
{
|
|
//we have a pilot plug and we need to get what we are set to
|
|
current_mech_name = pilot_plug->GetMechPlug()->GetMechName();
|
|
*mech_id = pilot_plug->GetMechPlug()->GetMechID();
|
|
}
|
|
|
|
//Set the first entry to "";
|
|
|
|
FREEANDNULL(mech_names[0]);
|
|
mech_names[0] = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
mech_names[0],
|
|
"",
|
|
1
|
|
);
|
|
|
|
int i=1;
|
|
while((mech_plug = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
if(mech_plug->GetStatus() != MechTablePlug::DestroyedStatus)
|
|
{
|
|
FREEANDNULL(mech_names[i]);
|
|
mech_names[i] = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
mech_names[i],
|
|
(const char *)mech_plug->GetMechName(),
|
|
mech_plug->GetMechName().GetLength() + 1
|
|
);
|
|
status_array[i] = mech_plug->GetStatus();
|
|
m_mechIDs[i] = mech_plug->GetMechResourceID();
|
|
if(current_mech_name)
|
|
{
|
|
if(current_mech_name == mech_plug->GetMechName())
|
|
*selected_name = i;
|
|
}
|
|
|
|
i ++;
|
|
}
|
|
// Verify(i<array_size);
|
|
}
|
|
|
|
*num_names = i;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMechCount()
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
int i = 0;
|
|
|
|
Check_Object(MWApplication::GetInstance()->m_mechTable);
|
|
i += MWApplication::GetInstance()->m_mechTable->GetTableSize();
|
|
|
|
Stuff::MString mechs_path = "Resource\\Variants\\*.mw4";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(mechs_path, true);
|
|
Check_Object(resource_directory);
|
|
i += resource_directory->fileWalker->GetSize();
|
|
delete resource_directory;
|
|
|
|
if (!CTCL_IsConsole()) {// jcem
|
|
if (MWApplication::GetInstance()->networkingFlag)
|
|
{
|
|
++i;
|
|
}
|
|
}
|
|
|
|
//Max_Clamp(i, MAX_MECHS);
|
|
return i;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetCampaignMechCount()
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
return MWGame::GetInstance()->m_mechTable.GetSize() + 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetCampaignMech(void* data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
int *lance_id = INTARRAYPARAM(1);
|
|
const char *mech_name = STRPARM(2);
|
|
|
|
MWGame::GetInstance()->SetLancemateMech(*lance_id, (char *)mech_name);
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetTime(void *data[], int count)
|
|
{
|
|
Check_Object(MWApplication::GetInstance());
|
|
|
|
int *time_of_day = INTARRAYPARAM(1);
|
|
switch(*time_of_day)
|
|
{
|
|
case 0:
|
|
MWApplication::GetInstance()->m_isNight = false;
|
|
break;
|
|
default:
|
|
MWApplication::GetInstance()->m_isNight = true;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetTimeOfDay(void *data[], int count)
|
|
{
|
|
Check_Object(MWApplication::GetInstance());
|
|
|
|
int *time_of_day = INTARRAYPARAM(1);
|
|
|
|
*time_of_day = MWApplication::GetInstance()->m_isNight;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetMech(void *data[], int count)
|
|
{
|
|
//For right now we are going to just create a known mech
|
|
|
|
int mech_index = INTPARM(1);
|
|
m_mechID = m_mechIDs[mech_index];
|
|
const char *mech_name = STRPARM(2);
|
|
m_mechShortResFile = mech_name; // jcem
|
|
//const char *skin_name = STRPARM(3);
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
app->m_lastMechID = mech_index;
|
|
app->m_lastMechName = "";
|
|
|
|
if(m_mechID == ResourceID::Null)
|
|
{
|
|
//
|
|
//-----------------------------------------------------------------
|
|
//This means that we have a user made mech in its own resource file
|
|
//-----------------------------------------------------------------
|
|
//
|
|
m_mechResourceFile = "Resource\\Variants\\";
|
|
m_mechResourceFile += mech_name;
|
|
m_mechResourceFile += ".mw4";
|
|
}
|
|
else
|
|
{
|
|
|
|
#if 0
|
|
//
|
|
//------------------------------------------------------------
|
|
//This is for E3 we are going to look for the resource by name
|
|
//------------------------------------------------------------
|
|
//
|
|
if(_stricmp("ops", skin_name))
|
|
{
|
|
m_mechResourceFile = mech_name;
|
|
MString mech_file = "Mechs\\";
|
|
mech_file += mech_name;
|
|
mech_file += "\\";
|
|
mech_file += skin_name;
|
|
mech_file += "_";
|
|
mech_file += mech_name;
|
|
mech_file += ".instance";
|
|
|
|
Resource mech_resource(mech_file);
|
|
Verify(mech_resource.DoesResourceExist());
|
|
m_mechID = mech_resource.GetResourceID();
|
|
}
|
|
#endif
|
|
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetTrainingPlayerMech()
|
|
{
|
|
MWTableEntry *mech_table_entry = MWApplication::GetInstance()->m_mechTable->FindEntry("shadow cat");
|
|
Check_Object(mech_table_entry);
|
|
|
|
m_mechID = mech_table_entry->GetEntryResourceID();
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::AddChat(BYTE from, BYTE type, BYTE players_sent_to, char *message)
|
|
{
|
|
|
|
if (m_currentChatCount > m_maxChatCount)
|
|
{
|
|
RemoveChat();
|
|
}
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(from);
|
|
|
|
if (connection != NULL)
|
|
{
|
|
m_chatArray[m_currentChatCount] = new char[256];
|
|
m_chatFrom[m_currentChatCount] = new char[256];
|
|
|
|
|
|
if (type != MWApplication::SystemBroadcast)
|
|
{
|
|
if (type == MWApplication::LobbyTeamBroadcast)
|
|
{
|
|
char* team_chat_id_str = Application::GetInstance()->GetLocString(IDS_MP_TEAMCHAT);
|
|
int team_chat_str_len = strlen(team_chat_id_str) + 1;
|
|
|
|
Str_Copy(m_chatArray[m_currentChatCount], &(message[team_chat_str_len]), 256);
|
|
|
|
char teamChatFrom[256];
|
|
char* team_str = Application::GetInstance()->GetLocString(IDS_TEAMCHAT);
|
|
Str_Copy(teamChatFrom, team_str, strlen(team_str) + 1);
|
|
Str_Cat(teamChatFrom, connection->GetConnectionName(), 256);
|
|
Str_Copy(m_chatFrom[m_currentChatCount], teamChatFrom, 256);
|
|
}
|
|
else
|
|
{
|
|
Str_Copy(m_chatArray[m_currentChatCount], message, 256);
|
|
Str_Copy(m_chatFrom[m_currentChatCount], connection->GetConnectionName(), 256);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Str_Copy(m_chatArray[m_currentChatCount], message, 256);
|
|
Str_Copy(m_chatFrom[m_currentChatCount], "", 256);
|
|
}
|
|
|
|
++m_currentChatCount;
|
|
}
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::RemoveChat()
|
|
{
|
|
|
|
delete m_chatArray[0];
|
|
delete m_chatFrom[0];
|
|
|
|
for (int i=1; i < m_currentChatCount; ++i)
|
|
{
|
|
m_chatArray[i-1] = m_chatArray[i];
|
|
m_chatFrom[i-1] = m_chatFrom[i];
|
|
}
|
|
|
|
m_chatArray[m_currentChatCount-1] = NULL;
|
|
m_chatArray[m_currentChatCount-1] = NULL;
|
|
|
|
m_currentChatCount--;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::ClearChat()
|
|
{
|
|
|
|
for (int i = 0; i < 50; i++)
|
|
{
|
|
if (m_chatArray[i] != NULL)
|
|
{
|
|
delete m_chatArray[i];
|
|
m_chatArray[i] = NULL;
|
|
}
|
|
|
|
if (m_chatFrom != NULL){
|
|
delete m_chatFrom[i];
|
|
m_chatFrom[i] = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
m_currentChatCount = 0;
|
|
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::RemoveOneChat(void * instance,int numParms,void* data[])
|
|
{
|
|
MW4Shell::Instance->RemoveChat();
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
void MW4Shell::SetMapInfo(const char *info, const char *author, const char *link)
|
|
{
|
|
if (m_mapInfo)
|
|
{
|
|
delete m_mapInfo;
|
|
m_mapInfo = NULL;
|
|
}
|
|
|
|
|
|
if (m_mapAuthor)
|
|
{
|
|
delete m_mapAuthor;
|
|
m_mapAuthor = NULL;
|
|
}
|
|
|
|
if (m_mapLink)
|
|
{
|
|
delete m_mapLink;
|
|
m_mapLink = NULL;
|
|
}
|
|
m_mapLinkAvailable = 0;
|
|
|
|
if (author != NULL)
|
|
{
|
|
m_mapInfo = new char [strlen(author)+1];
|
|
strcpy(m_mapInfo, author);
|
|
}
|
|
|
|
if (info != NULL)
|
|
{
|
|
m_mapAuthor = new char [strlen(info)+1];
|
|
strcpy(m_mapAuthor, info);
|
|
}
|
|
|
|
if (link != NULL)
|
|
{
|
|
m_mapLink = new char [strlen(link)+1];
|
|
strcpy(m_mapLink, link);
|
|
m_mapLinkAvailable = 1;
|
|
}
|
|
else
|
|
{
|
|
m_mapLinkAvailable = -1;
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::NetHaveMap(void * instance, int, void *[])
|
|
{
|
|
return MWApplication::GetInstance()->haveNetworkMap;
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::NetLaunchBrowserMapLink(void * instance, int, void *[])
|
|
{
|
|
if (MW4Shell::Instance->m_mapLink != NULL)
|
|
{
|
|
gos_EnableSetting(gos_Set_TriggerBrowser, (unsigned long)MW4Shell::Instance->m_mapLink);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SendChat(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
if (MW4Shell::Instance->m_outgoingChat == NULL)
|
|
return -1;
|
|
|
|
if (MW4Shell::Instance->m_outgoingChatToPlayerCount <= 0)
|
|
return -1;
|
|
|
|
|
|
Verify(MW4Shell::Instance->m_outgoingChatToPlayerCount < 32);
|
|
|
|
BYTE chat_to[32];
|
|
BYTE adjusted_count = 0;
|
|
|
|
for (int i = 0; i < MW4Shell::Instance->m_outgoingChatToPlayerCount; ++i )
|
|
{
|
|
int connection_number = MW4Shell::Instance->m_outgiongChatToPlayer[i];
|
|
|
|
Connection *connection = NULL;
|
|
|
|
if (connection_number != -1)
|
|
connection = Network::GetInstance()->GetConnection(connection_number);
|
|
|
|
if (connection != NULL)
|
|
{
|
|
chat_to[adjusted_count] = connection->GetID();
|
|
adjusted_count++;
|
|
}
|
|
|
|
}
|
|
|
|
char* team_chat_id_str = Application::GetInstance()->GetLocString(IDS_MP_TEAMCHAT);
|
|
int team_chat_str_len = strlen(team_chat_id_str);
|
|
|
|
if ((_mbsnicmp((unsigned char*) MW4Shell::Instance->m_outgoingChat, (unsigned char*)team_chat_id_str, team_chat_str_len) == 0) && (MW4Shell::Instance->m_outgoingChat[team_chat_str_len] == ' '))
|
|
{
|
|
MWApplication::GetInstance()->SendChat(
|
|
Connection::Local->GetID(),
|
|
MWApplication::LobbyTeamBroadcast,
|
|
0,
|
|
MW4Shell::Instance->m_outgoingChat);
|
|
}
|
|
else
|
|
{
|
|
MWApplication::GetInstance()->SendChat(
|
|
Connection::Local->GetID(),
|
|
MWApplication::LobbyBroadcast,
|
|
0,
|
|
MW4Shell::Instance->m_outgoingChat);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SendBroadcastChat(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
if (MW4Shell::Instance->m_outgoingChat == NULL)
|
|
return -1;
|
|
|
|
if (MW4Shell::Instance->m_outgoingChatToPlayerCount <= 0)
|
|
return -1;
|
|
|
|
|
|
Verify(MW4Shell::Instance->m_outgoingChatToPlayerCount < 32);
|
|
|
|
BYTE chat_to[32];
|
|
BYTE adjusted_count = 0;
|
|
|
|
for (int i = 0; i < MW4Shell::Instance->m_outgoingChatToPlayerCount; ++i )
|
|
{
|
|
int connection_number = MW4Shell::Instance->m_outgiongChatToPlayer[i];
|
|
|
|
Connection *connection = NULL;
|
|
|
|
if (connection_number != -1)
|
|
connection = Network::GetInstance()->GetConnection(connection_number);
|
|
|
|
if (connection != NULL)
|
|
{
|
|
chat_to[adjusted_count] = connection->GetID();
|
|
adjusted_count++;
|
|
}
|
|
|
|
}
|
|
|
|
MWApplication::GetInstance()->SendChat(
|
|
Connection::Local->GetID(),
|
|
MWApplication::SystemBroadcast,
|
|
0,
|
|
MW4Shell::Instance->m_outgoingChat);
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetDummyData(int count, void *data[])
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int array_size = VALUEPARM(2);
|
|
|
|
for(int i=0; i<array_size; i++)
|
|
{
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(128);
|
|
MString mech_name = "I Love Mech 4";
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mech_name,
|
|
mech_name.GetLength() + 1
|
|
);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::InitNetworkScenarios(void *instance, int, void *[])
|
|
{
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
if (params->m_useMapCycle)
|
|
{
|
|
|
|
MW4Shell::Instance->LoadMapCycle();
|
|
|
|
|
|
|
|
if (MW4Shell::Instance->totalCycleEntries > 0)
|
|
{
|
|
|
|
if (MW4Shell::Instance->currentCycleNumber >= MW4Shell::Instance->totalCycleEntries)
|
|
{
|
|
MW4Shell::Instance->currentCycleNumber = 0;
|
|
}
|
|
|
|
// go to the next cycle map...
|
|
MW4Shell::Instance->networkScenarioCount = 1;
|
|
MW4Shell::Instance->maxNetworkScenarioCount = 1;
|
|
strncpy(MW4Shell::Instance->scenarios[0].missionName, MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].missionName, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[0].longMissionName, MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].longMissionName, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[0].scenarioName, MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].longMissionName, 127);
|
|
strncat(MW4Shell::Instance->scenarios[0].scenarioName, " - ", 127);
|
|
strncat(MW4Shell::Instance->scenarios[0].scenarioName, MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].scenarioName, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[0].scenarioTag, MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].scenarioTag, 127);
|
|
MW4Shell::Instance->scenarios[0].usermissions = MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].usermissions;
|
|
|
|
params->m_ruleType = MW4Shell::Instance->cycleList[MW4Shell::Instance->currentCycleNumber].ruleType;
|
|
params->m_mapID = 0;
|
|
|
|
MW4Shell::Instance->selectedScenario = -1;
|
|
|
|
SelectNetworkScenarioDirect(0);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
params->m_useMapCycle = false;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
if (params->m_ruleType == MW4Shell::Instance->lastRuleType)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
MW4Shell::Instance->lastRuleType = params->m_ruleType;
|
|
MW4Shell::Instance->networkScenarioCount = 0;
|
|
MW4Shell::Instance->maxNetworkScenarioCount = 0;
|
|
|
|
|
|
{
|
|
Stuff::MString missions_path = "Resource\\Missions\\*.nfo";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Resource\\Missions\\";
|
|
full_name += file_name;
|
|
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
|
|
Page *info_page = notefile.FindPage("info");
|
|
|
|
if (info_page != NULL)
|
|
{
|
|
const char *long_mission_name;
|
|
if (info_page->GetEntry("longname",&long_mission_name))
|
|
{
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
if (page != NULL)
|
|
{
|
|
ChainIteratorOf<Note*> *note_iterator = page->MakeNoteIterator();
|
|
|
|
Note *note;
|
|
while ((note = note_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
|
|
NotationFile scenario_file;
|
|
note->GetEntry(&scenario_file);
|
|
|
|
|
|
Page *server_page = scenario_file.FindPage("server");
|
|
if (server_page)
|
|
{
|
|
int rule_set;
|
|
const char *scenario_read_name = NULL;
|
|
|
|
if (server_page->GetEntry("ruleset",&rule_set) && server_page->GetEntry("name",&scenario_read_name))
|
|
{
|
|
if (rule_set == params->m_ruleType)
|
|
{
|
|
|
|
|
|
MString mission_name = file_name;
|
|
MString scenario_name = note->GetName();
|
|
|
|
mission_name.StripDirectory().StripExtension();
|
|
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].missionName, mission_name, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].longMissionName, long_mission_name, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioName, long_mission_name, 127);
|
|
strncat(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioName, " - ", 127);
|
|
strncat(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioName, scenario_read_name, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioTag, scenario_name, 127);
|
|
MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].usermissions = false;
|
|
|
|
++MW4Shell::Instance->networkScenarioCount;
|
|
|
|
}
|
|
|
|
++MW4Shell::Instance->maxNetworkScenarioCount;
|
|
}
|
|
}
|
|
}
|
|
delete note_iterator;
|
|
}
|
|
}
|
|
}
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
}
|
|
|
|
|
|
{
|
|
Stuff::MString missions_path = "Resource\\UserMissions\\*.nfo";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Resource\\UserMissions\\";
|
|
full_name += file_name;
|
|
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
|
|
Page *info_page = notefile.FindPage("info");
|
|
|
|
if (info_page != NULL)
|
|
{
|
|
const char *long_mission_name;
|
|
if (info_page->GetEntry("longname",&long_mission_name))
|
|
{
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
if (page != NULL)
|
|
{
|
|
ChainIteratorOf<Note*> *note_iterator = page->MakeNoteIterator();
|
|
|
|
Note *note;
|
|
while ((note = note_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
|
|
NotationFile scenario_file;
|
|
note->GetEntry(&scenario_file);
|
|
|
|
|
|
Page *server_page = scenario_file.FindPage("server");
|
|
if (server_page)
|
|
{
|
|
int rule_set;
|
|
const char *scenario_read_name = NULL;
|
|
|
|
if (server_page->GetEntry("ruleset",&rule_set) && server_page->GetEntry("name",&scenario_read_name))
|
|
{
|
|
if (rule_set == params->m_ruleType)
|
|
{
|
|
|
|
|
|
MString mission_name = file_name;
|
|
MString scenario_name = note->GetName();
|
|
|
|
mission_name.StripDirectory().StripExtension();
|
|
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].missionName, mission_name, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].longMissionName, long_mission_name, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioName, long_mission_name, 127);
|
|
strncat(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioName, " - ", 127);
|
|
strncat(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioName, scenario_read_name, 127);
|
|
strncpy(MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].scenarioTag, scenario_name, 127);
|
|
MW4Shell::Instance->scenarios[MW4Shell::Instance->networkScenarioCount].usermissions = true;
|
|
|
|
++MW4Shell::Instance->networkScenarioCount;
|
|
}
|
|
|
|
++MW4Shell::Instance->maxNetworkScenarioCount;
|
|
}
|
|
}
|
|
}
|
|
delete note_iterator;
|
|
}
|
|
}
|
|
}
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
}
|
|
|
|
MW4Shell::SelectNetworkScenarioDirect(0);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::LoadMapCycle()
|
|
{
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
params->m_pureMapCycle = true;
|
|
|
|
totalCycleEntries = 0;
|
|
|
|
//this is messed up all to hell!!!!
|
|
|
|
if (gos_DoesFileExist("servercycle.txt"))
|
|
{
|
|
NotationFile notefile("servercycle.txt");
|
|
|
|
|
|
Page *cycle_page = notefile.FindPage("cycle");
|
|
if (cycle_page)
|
|
{
|
|
|
|
Page::NoteIterator *notes = cycle_page->MakeNoteIterator();
|
|
Check_Object(notes);
|
|
|
|
Note *note;
|
|
while ((note = notes->ReadAndNext()) != NULL)
|
|
{
|
|
MString current_name = note->GetName();
|
|
if (current_name == "map")
|
|
{
|
|
const char *temp;
|
|
note->GetEntry(&temp);
|
|
|
|
MString nfo_text = temp;
|
|
MString scenario_text;
|
|
|
|
char *pointer = strstr((char*)nfo_text, "::" );
|
|
if (pointer && pointer != (char*)nfo_text)
|
|
{
|
|
*pointer = '\0';
|
|
pointer += 2;
|
|
|
|
if (pointer != NULL && *pointer != '\0')
|
|
{
|
|
scenario_text = pointer;
|
|
|
|
Stuff::MString info_file_name;
|
|
info_file_name = "Resource\\Missions\\";
|
|
info_file_name += nfo_text;
|
|
|
|
if (gos_DoesFileExist(info_file_name))
|
|
{
|
|
NotationFile nfo_file(info_file_name);
|
|
|
|
|
|
Page *info_page = nfo_file.FindPage("info");
|
|
if (info_page != NULL)
|
|
{
|
|
|
|
const char *long_mission_name;
|
|
if (info_page->GetEntry("longname",&long_mission_name))
|
|
{
|
|
|
|
Page *scenario_page = nfo_file.FindPage("scenarios");
|
|
|
|
if (scenario_page)
|
|
{
|
|
NotationFile scenario_file;
|
|
if (scenario_page->GetEntry(scenario_text,&scenario_file))
|
|
{
|
|
|
|
Page *server_page = scenario_file.FindPage("server");
|
|
if (server_page)
|
|
{
|
|
//we have an info file with the scenario...
|
|
int rule;
|
|
const char *scenario_read_text;
|
|
if (server_page->GetEntry("ruleset", &rule) && server_page->GetEntry("name", &scenario_read_text))
|
|
{
|
|
|
|
nfo_text.StripExtension();
|
|
strncpy(cycleList[totalCycleEntries].missionName, (char*)nfo_text, 127);
|
|
strncpy(cycleList[totalCycleEntries].longMissionName, (char*)long_mission_name, 127);
|
|
strncpy(cycleList[totalCycleEntries].scenarioTag, (char*)scenario_text, 127);
|
|
strncpy(cycleList[totalCycleEntries].scenarioName, (char*)scenario_read_text, 127);
|
|
cycleList[totalCycleEntries].usermissions = false;
|
|
|
|
cycleList[totalCycleEntries].ruleType = rule;
|
|
|
|
totalCycleEntries++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
info_file_name = "Resource\\UserMissions\\";
|
|
info_file_name += nfo_text;
|
|
|
|
if (gos_DoesFileExist(info_file_name))
|
|
{
|
|
NotationFile nfo_file(info_file_name);
|
|
|
|
|
|
Page *info_page = nfo_file.FindPage("info");
|
|
if (info_page != NULL)
|
|
{
|
|
|
|
const char *long_mission_name;
|
|
if (info_page->GetEntry("longname",&long_mission_name))
|
|
{
|
|
|
|
Page *scenario_page = nfo_file.FindPage("scenarios");
|
|
|
|
if (scenario_page)
|
|
{
|
|
NotationFile scenario_file;
|
|
if (scenario_page->GetEntry(scenario_text,&scenario_file))
|
|
{
|
|
|
|
Page *server_page = scenario_file.FindPage("server");
|
|
if (server_page)
|
|
{
|
|
//we have an info file with the scenario...
|
|
int rule;
|
|
const char *scenario_read_text;
|
|
if (server_page->GetEntry("ruleset", &rule) && server_page->GetEntry("name", &scenario_read_text))
|
|
{
|
|
|
|
nfo_text.StripExtension();
|
|
strncpy(cycleList[totalCycleEntries].missionName, (char*)nfo_text, 127);
|
|
strncpy(cycleList[totalCycleEntries].longMissionName, (char*)long_mission_name, 127);
|
|
strncpy(cycleList[totalCycleEntries].scenarioTag, (char*)scenario_text, 127);
|
|
strncpy(cycleList[totalCycleEntries].scenarioName, (char*)scenario_read_text, 127);
|
|
cycleList[totalCycleEntries].usermissions = true;
|
|
|
|
cycleList[totalCycleEntries].ruleType = rule;
|
|
|
|
totalCycleEntries++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
delete notes;
|
|
}
|
|
|
|
// figure out if they all use the same rules...
|
|
int rule=-1;
|
|
for (int i = 0; i < totalCycleEntries; ++i)
|
|
{
|
|
if (cycleList[i].ruleType == -1)
|
|
{
|
|
rule = cycleList[i].ruleType;
|
|
}
|
|
else
|
|
{
|
|
if (rule != cycleList[i].ruleType)
|
|
{
|
|
params->m_pureMapCycle = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetNetworkScenarios(void *instance, int, void *data[])
|
|
{
|
|
|
|
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
char **name_array = STRARRAYPARAM(0);
|
|
|
|
for (int i = 0; i < MW4Shell::Instance->networkScenarioCount; ++i)
|
|
{
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(128);
|
|
MString scenario_name;
|
|
//scenario_name = MW4Shell::Instance->scenarios[i].missionName;
|
|
//scenario_name += " : ";
|
|
//scenario_name += MW4Shell::Instance->scenarios[i].scenarioName;
|
|
scenario_name = MW4Shell::Instance->scenarios[i].scenarioName;
|
|
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)scenario_name,
|
|
scenario_name.GetLength() + 1
|
|
);
|
|
}
|
|
|
|
|
|
|
|
gos_PopCurrentHeap();
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SelectNetworkScenario(void *instance, int, void *data[])
|
|
{
|
|
// set the map name...
|
|
int number = INTPARM(0);
|
|
|
|
SelectNetworkScenarioDirect(number);
|
|
|
|
int* intParam[1];
|
|
int temp = RULE_TYPE_PARAMETER;
|
|
intParam[0] = &temp;
|
|
int gameType = MW4Shell::GetLocalNetworkMissionParamater(NULL, 1, (void**)intParam);
|
|
if (CTCL_IsNone() || CTCL_IsCOOP()) {
|
|
int* botIds = INTARRAYPARAM(1);
|
|
int* mechIds = INTARRAYPARAM(2);
|
|
|
|
if ((gameType>=0 && gameType<=3) || gameType>=13)
|
|
return AddBots(number, botIds, mechIds);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SelectNetworkScenarioDirect(int number)
|
|
{
|
|
|
|
if (number > MW4Shell::Instance->networkScenarioCount && number < 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
if (MW4Shell::Instance->selectedScenario != number)
|
|
{
|
|
MW4Shell::Instance->selectedScenario = number;
|
|
|
|
// load that maps options...
|
|
Stuff::MString full_name;
|
|
full_name = "Resource\\Missions\\";
|
|
full_name += MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].missionName;
|
|
full_name += ".nfo";
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
|
|
if (page != NULL)
|
|
{
|
|
NotationFile scenario_file;
|
|
MString scenario_name;
|
|
page->GetEntry(MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].scenarioTag,&scenario_file);
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
int rule_type = params->m_ruleType;
|
|
|
|
app->LoadServerOptions();
|
|
params->LoadOverideParameters(&scenario_file);
|
|
|
|
params->m_ruleType = rule_type;
|
|
}
|
|
else
|
|
{
|
|
full_name = "Resource\\UserMissions\\";
|
|
full_name += MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].missionName;
|
|
full_name += ".nfo";
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
|
|
if (page != NULL)
|
|
{
|
|
NotationFile scenario_file;
|
|
MString scenario_name;
|
|
page->GetEntry(MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].scenarioTag,&scenario_file);
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
int rule_type = params->m_ruleType;
|
|
|
|
app->LoadServerOptions();
|
|
params->LoadOverideParameters(&scenario_file);
|
|
|
|
params->m_ruleType = rule_type;
|
|
}
|
|
}
|
|
|
|
FREEANDNULL(MW4Shell::Instance->m_iaMissionName);
|
|
|
|
|
|
MW4Shell::Instance->m_iaMissionName = (char *)gos_Malloc(256);
|
|
Str_Copy(MW4Shell::Instance->m_iaMissionName, MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].longMissionName, 256);
|
|
MWApplication::GetInstance()->m_currentMissionName = MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].scenarioName;
|
|
|
|
if (!CTCL_IsConsole()) {
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
app->VerifyAllPlayerVehicles();
|
|
app->UnreadyPlayers();
|
|
app->RemovePlayersFromTeam();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
FREEANDNULL(MW4Shell::Instance->m_iaMissionName);
|
|
MW4Shell::Instance->m_iaMissionName = (char *)gos_Malloc(256);
|
|
Str_Copy(MW4Shell::Instance->m_iaMissionName, MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].longMissionName, 256);
|
|
MWApplication::GetInstance()->m_currentMissionName = MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].scenarioName;
|
|
}
|
|
|
|
if (true)
|
|
{
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
|
|
if (true)
|
|
{
|
|
char szGameType[256];
|
|
// mdm - advertise the current game type
|
|
mbs_strncpy(szGameType, GetRuleName( params->m_ruleType ), sizeof(szGameType));
|
|
gos_NetSetAdvertItem(0, GAMELIST_KEY_GAME_TYPE, szGameType);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetDecalCount(void *instance,int numParms,void* data[])
|
|
{
|
|
|
|
#if 0
|
|
Stuff::MString missions_path = "Content\\Textures\\stockdecals\\*.tga";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
|
|
int count = 0;
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
|
|
++count;
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
#endif
|
|
|
|
int count = 64;
|
|
|
|
|
|
Stuff::MString missions_path = "Content\\Textures\\customdecals\\*.tga";
|
|
Stuff::Directory *resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Content\\Textures\\customdecals\\";
|
|
full_name += file_name;
|
|
|
|
|
|
if (gos_FileSize(full_name) < MWApplication::MaxDecalSize)
|
|
{
|
|
Stuff::FileStream test(full_name);
|
|
|
|
if (gos_CheckValidTGA((unsigned char *)test.GetPointer(), test.GetSize()))
|
|
{
|
|
|
|
++count;
|
|
}
|
|
}
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
|
|
Max_Clamp(count, MAX_DECALS);
|
|
|
|
|
|
return count;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::GetDecalNames(void *instance,int numParms,void* data[])
|
|
{
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
char **name_array = STRARRAYPARAM(0);
|
|
char **full_name_array = STRARRAYPARAM(1);
|
|
|
|
#if 0
|
|
Stuff::MString missions_path = "Content\\Textures\\stockdecals\\*.tga";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
|
|
int count = 0;
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
FREEANDNULL(name_array[count]);
|
|
name_array[count] = (char *)gos_Malloc(256);
|
|
|
|
MString short_file_name = file_name;
|
|
short_file_name.StripExtension();
|
|
|
|
Str_Copy(
|
|
name_array[count],
|
|
(char*)short_file_name,
|
|
strlen((char*)short_file_name) + 1
|
|
);
|
|
|
|
FREEANDNULL(full_name_array[count]);
|
|
full_name_array[count] = (char *)gos_Malloc(512);
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Content\\Textures\\stockdecals\\";
|
|
full_name += file_name;
|
|
|
|
Str_Copy(
|
|
full_name_array[count],
|
|
(char*)full_name,
|
|
strlen((char*)full_name) + 1
|
|
);
|
|
|
|
++count;
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
#endif
|
|
|
|
int count = 0;
|
|
|
|
|
|
for (int i = 0; i < 64; ++i)
|
|
{
|
|
char decal_name[256];
|
|
sprintf(&decal_name[0],"decal_%02d.tga",i);
|
|
|
|
|
|
FREEANDNULL(name_array[count]);
|
|
name_array[count] = (char *)gos_Malloc(256);
|
|
|
|
MString short_file_name = decal_name;
|
|
short_file_name.StripExtension();
|
|
|
|
Str_Copy(
|
|
name_array[count],
|
|
(char*)short_file_name,
|
|
strlen((char*)short_file_name) + 1
|
|
);
|
|
|
|
FREEANDNULL(full_name_array[count]);
|
|
full_name_array[count] = (char *)gos_Malloc(512);
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Content\\Textures\\stockdecals\\";
|
|
full_name += decal_name;
|
|
|
|
Str_Copy(
|
|
full_name_array[count],
|
|
(char*)full_name,
|
|
strlen((char*)full_name) + 1
|
|
);
|
|
|
|
++count;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Stuff::MString missions_path = "Content\\Textures\\customdecals\\*.tga";
|
|
Stuff::Directory *resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
Stuff::MString full_name;
|
|
full_name = "Content\\Textures\\customdecals\\";
|
|
full_name += file_name;
|
|
|
|
if (gos_FileSize(full_name) < MWApplication::MaxDecalSize)
|
|
{
|
|
Stuff::FileStream test(full_name);
|
|
|
|
if (gos_CheckValidTGA((unsigned char *)test.GetPointer(), test.GetSize()))
|
|
{
|
|
CalculateCustomPNGCRC(const_cast<char*>(file_name));
|
|
}
|
|
}
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
Stuff::MString full_name;
|
|
full_name = "Content\\Textures\\customdecals\\";
|
|
full_name += file_name;
|
|
|
|
if (gos_FileSize(full_name) < MWApplication::MaxDecalSize)
|
|
{
|
|
Stuff::FileStream test(full_name);
|
|
|
|
if (gos_CheckValidTGA((unsigned char *)test.GetPointer(), test.GetSize()))
|
|
{
|
|
|
|
FREEANDNULL(name_array[count]);
|
|
name_array[count] = (char *)gos_Malloc(256);
|
|
|
|
MString short_file_name = file_name;
|
|
GetShortFileName(short_file_name);
|
|
|
|
Str_Copy(
|
|
name_array[count],
|
|
(char*)short_file_name,
|
|
strlen((char*)short_file_name) + 1
|
|
);
|
|
|
|
FREEANDNULL(full_name_array[count]);
|
|
full_name_array[count] = (char *)gos_Malloc(512);
|
|
|
|
|
|
|
|
Str_Copy(
|
|
full_name_array[count],
|
|
(char*)full_name,
|
|
strlen((char*)full_name) + 1
|
|
);
|
|
|
|
++count;
|
|
|
|
if (count == MAX_DECALS)
|
|
break;
|
|
}
|
|
}
|
|
resource_directory->AdvanceCurrentFile();
|
|
|
|
}
|
|
delete resource_directory;
|
|
|
|
|
|
|
|
gos_PopCurrentHeap();
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::CalculateCustomPNGCRC(char *file_name)
|
|
{
|
|
//bool __stdcall gos_RenameFile( const char* FileNameFrom, const char* FileNameTo );
|
|
|
|
MString temp_file_name = file_name;
|
|
temp_file_name.StripExtension();
|
|
|
|
char *sub_pointer = strstr((char*)temp_file_name, "_##");
|
|
if (sub_pointer)
|
|
{
|
|
// verify it is _## + 8 leters
|
|
if (strlen(sub_pointer) == 11)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// else we just null out the old one
|
|
|
|
*sub_pointer = '\0';
|
|
}
|
|
|
|
unsigned int crc = 0;
|
|
|
|
MString full_file_name;
|
|
full_file_name = "Content\\Textures\\customdecals\\";
|
|
full_file_name += file_name;
|
|
|
|
|
|
{
|
|
|
|
Stuff::FileStream file_stream(full_file_name);
|
|
|
|
|
|
while (file_stream.GetBytesRemaining())
|
|
{
|
|
unsigned short byte = 0;
|
|
file_stream.ReadBytes(&byte, 1);
|
|
|
|
crc = crc + byte;
|
|
}
|
|
|
|
}
|
|
|
|
MString new_file_name = temp_file_name;
|
|
new_file_name += "_##";
|
|
|
|
char text_buffer[16];
|
|
sprintf(text_buffer, "%08x.tga",crc);
|
|
|
|
new_file_name += text_buffer;
|
|
|
|
//SPEW(("jerryeds", "decal '%s'", (char*)new_file_name));
|
|
|
|
MString new_full_file_name;
|
|
new_full_file_name = "Content\\Textures\\customdecals\\";
|
|
new_full_file_name += new_file_name;
|
|
|
|
|
|
//SPEW(("jerryeds", "fulldecal '%s'", (char*)new_full_file_name));
|
|
|
|
|
|
gos_RenameFile( full_file_name, new_full_file_name);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::GetShortFileName(MString &string)
|
|
{
|
|
|
|
//remove number and extension
|
|
char *sub_pointer = strstr((char*)string, "_##");
|
|
if (sub_pointer)
|
|
{
|
|
*sub_pointer = '\0';
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SetTeamDecal(void *instance,int numParms,void* data[])
|
|
{
|
|
const char *text = STRPARM(0);
|
|
if (text != NULL)
|
|
{
|
|
MW4Shell::Instance->m_teamDecal = text;
|
|
}
|
|
else
|
|
{
|
|
MW4Shell::Instance->m_teamDecal = "\0";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::SetPilotDecal(void *instance,int numParms,void* data[])
|
|
{
|
|
const char *text = STRPARM(0);
|
|
|
|
if (text != NULL)
|
|
{
|
|
MW4Shell::Instance->m_pilotDecal = text;
|
|
}
|
|
else
|
|
{
|
|
MW4Shell::Instance->m_teamDecal = "\0";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::StartCampaignMission()
|
|
{
|
|
//We need to tell the game that we are starting and what mission we are going
|
|
//to play. This will cause our save (overwriting the last save game we had)
|
|
//and will set up the stuff in the campaign!
|
|
Check_Object(MWGame::GetInstance());
|
|
MWGame::GetInstance()->StartMission(m_iaMissionName);
|
|
|
|
MWApplication::GetInstance()->m_currentMissionName =
|
|
MWApplication::GetInstance()->GetLocString(
|
|
MWGame::GetInstance()->m_campaign->m_currentMissionPlug->m_displayNameIndex);
|
|
|
|
ClearMechLab(2);
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
int MW4Shell::GetMovieFilename(void* data[], int count)
|
|
{
|
|
if(m_movieCount > 0)
|
|
{
|
|
Verify(m_movieCount > 0);
|
|
Verify(m_currentMovieIndex < m_movieCount);
|
|
Verify(count == 3);
|
|
|
|
Verify(m_movieList[m_currentMovieIndex] != NULL);
|
|
INTPARM(2) = m_currentMovieIndex;
|
|
char** ppString = &STRPARM(1);
|
|
FREEANDNULL(*ppString);
|
|
*ppString = (char*) gos_Malloc(strlen(m_movieList[m_currentMovieIndex]) + 1);
|
|
|
|
strcpy(*ppString, m_movieList[m_currentMovieIndex]);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int MW4Shell::AdvanceMovie(void* data[], int count)
|
|
{
|
|
if(m_movieCount > 0)
|
|
{
|
|
Verify(m_currentMovieIndex < m_movieCount);
|
|
Verify(count == 2);
|
|
|
|
int nWay = INTPARM(1);
|
|
if (nWay == ADVANCE_MOVIE_FORWARD)
|
|
{
|
|
if (m_currentMovieIndex + 1 < m_movieCount)
|
|
++m_currentMovieIndex;
|
|
}
|
|
else if (nWay == ADVANCE_MOVIE_REVERSE)
|
|
{
|
|
if (m_currentMovieIndex)
|
|
--m_currentMovieIndex;
|
|
}
|
|
else if (nWay == ADVANCE_MOVIE_END)
|
|
{
|
|
m_currentMovieIndex = m_movieCount - 1;
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
// holo.avi
|
|
// skiing.avi
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void MW4Shell::AddNewMovie(const char* szFileName)
|
|
{
|
|
Check_Pointer(szFileName);
|
|
Verify(m_movieCount <= MAX_MOVIES_IN_MISSION);
|
|
|
|
m_currentMovieIndex = m_movieCount++;
|
|
m_movieList[m_currentMovieIndex] = new char[strlen(szFileName) + 1];
|
|
strcpy(m_movieList[m_currentMovieIndex], szFileName);
|
|
|
|
// Mail a message to gosScript indicating they should begin to play this
|
|
HGOSSCRIPT hMovie = gosScript_GetScriptHandle("CampaignScreen", 0);
|
|
if (hMovie)
|
|
{
|
|
int nMsg = nMSG_PLAYMOVIE;
|
|
//Mail message to main
|
|
gosScript_Command(hMovie, "@CampaignScreen@Screen", gosScript_Cmd_MAILBOX, &nMsg); // processed this instant!
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
int MW4Shell::TriggerMovie()
|
|
{
|
|
static int count = 0;
|
|
|
|
#if 0
|
|
count++;
|
|
if (count & 1)
|
|
{
|
|
AddNewMovie("RathBurneTest.avi");
|
|
}
|
|
else
|
|
{
|
|
AddNewMovie("karl4.avi");
|
|
}
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
void MW4Shell::InitMovieList()
|
|
{
|
|
for (int i = 0; i < MAX_MOVIES_IN_MISSION; ++i)
|
|
{
|
|
m_movieList[i] = NULL;
|
|
}
|
|
m_movieCount = 0;
|
|
m_currentMovieIndex = 0;
|
|
m_moviePlaying = 0;
|
|
m_moviesStopped = 0;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
void MW4Shell::ResetMovieList()
|
|
{
|
|
for (int i = 0; i < m_movieCount; ++i)
|
|
{
|
|
delete[] m_movieList[i];
|
|
m_movieList[i] = NULL;
|
|
}
|
|
m_movieCount = 0;
|
|
m_currentMovieIndex = 0;
|
|
m_moviePlaying = 0;
|
|
m_moviesStopped = 0;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::MyPlayerId(void * instance, int numParms, void*data[])
|
|
{
|
|
|
|
if (Connection::Local == NULL)
|
|
return 0;
|
|
|
|
Verify(Connection::Local);
|
|
return Connection::Local->GetID();
|
|
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
int _stdcall MW4Shell::IsPlayerConnectionValid(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_id = (int)*((int **)data[0]);
|
|
if (connection_id > 255)
|
|
return 0;
|
|
if (connection_id < 1)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_id);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionName(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_number = (int)*((int **)data[0]);
|
|
if (connection_number > 255)
|
|
return 0;
|
|
if (connection_number < 0)
|
|
return 0;
|
|
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_number);
|
|
|
|
if (*((char **)data[1])) gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(256);
|
|
strcpy(*((char **) data[1]), connection->GetConnectionName());
|
|
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionClan(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int player_number = (int)*((int **)data[0]);
|
|
if (player_number < 0)
|
|
return 0;
|
|
if (player_number >= Maximum_Players)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(player_number);
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
if (app->servedConnectionData[player_number].clanName == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (*((char **)data[1])) gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(128);
|
|
strcpy(*((char **) data[1]), app->servedConnectionData[player_number].clanName);
|
|
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionReady(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_number = (int)*((int **)data[0]);
|
|
if (connection_number > 255)
|
|
return 0;
|
|
if (connection_number < 0)
|
|
return 0;
|
|
|
|
if (!MWApplication::GetInstance()->servedConnectionData[connection_number].clientConnected)
|
|
return 0;
|
|
|
|
|
|
return MWApplication::GetInstance()->servedConnectionData[connection_number].clientReady;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionLaunched(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_number = (int)*((int **)data[0]);
|
|
if (connection_number > 255)
|
|
return 0;
|
|
if (connection_number < 0)
|
|
return 0;
|
|
|
|
if (!MWApplication::GetInstance()->servedConnectionData[connection_number].clientConnected)
|
|
return 0;
|
|
|
|
|
|
return MWApplication::GetInstance()->servedConnectionData[connection_number].clientLaunched;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionChasis(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_number = (int)*((int **)data[0]);
|
|
if (connection_number > 255)
|
|
return M_CameraShip;
|
|
if (connection_number < 0)
|
|
return M_CameraShip;
|
|
|
|
if (!MWApplication::GetInstance()->servedConnectionData[connection_number].clientConnected)
|
|
return M_CameraShip;
|
|
|
|
if (MWApplication::GetInstance()->servedConnectionData[connection_number].mechChasisID == EmptyMechID)
|
|
return M_CameraShip;
|
|
|
|
|
|
return MWApplication::GetInstance()->servedConnectionData[connection_number].mechChasisID;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionTeam(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_number = (int)*((int **)data[0]);
|
|
if (connection_number > 255)
|
|
return 0;
|
|
if (connection_number < 0)
|
|
return 0;
|
|
|
|
if (!MWApplication::GetInstance()->servedConnectionData[connection_number].clientConnected)
|
|
return MWApplication::No_Team;
|
|
|
|
return MWApplication::GetInstance()->servedConnectionData[connection_number].pilotTeam;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetPlayerConnectionSkin(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_number = (int)*((int **)data[0]);
|
|
if (connection_number > 255)
|
|
return 0;
|
|
if (connection_number < 0)
|
|
return 0;
|
|
|
|
if (!MWApplication::GetInstance()->servedConnectionData[connection_number].clientConnected)
|
|
return 0;
|
|
|
|
|
|
int skin_id = 0;
|
|
|
|
Check_Object(MWApplication::GetInstance()->m_skinsTable);
|
|
|
|
|
|
MWTable::TableIterator *iterator = MWApplication::GetInstance()->m_skinsTable->MakeTableIterator();
|
|
MWTableEntry *entry = NULL;
|
|
|
|
while ((entry = iterator->ReadAndNext()) != NULL)
|
|
{
|
|
|
|
char *prefix = entry->GetData();
|
|
|
|
if (MWApplication::GetInstance()->servedConnectionData[connection_number].pilotSkins == *prefix)
|
|
{
|
|
delete iterator;
|
|
return skin_id;
|
|
}
|
|
++skin_id;
|
|
|
|
}
|
|
|
|
delete iterator;
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetLancemates(void* data[], int count)
|
|
{
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
int *lance_id = INTARRAYPARAM(1); //What lance we need a list for
|
|
char **lance_names = STRARRAYPARAM(2); //The list of names
|
|
int *selected_name = INTARRAYPARAM(3); //What name is currently selected
|
|
int *num_names = INTARRAYPARAM(4);
|
|
int *lance_icon = INTARRAYPARAM(5);
|
|
|
|
#if defined(_ARMOR)
|
|
int array_size = VALUEPARM(5);
|
|
#endif
|
|
|
|
ChainIteratorOf<LancematePlug*> iterator(&MWGame::GetInstance()->m_lancemates->m_lancemates);
|
|
LancematePlug *lance_plug;
|
|
PilotPlug *pilot_plug = MWGame::GetInstance()->GetPilot(*lance_id);
|
|
Check_Object(pilot_plug);
|
|
MString current_pilot_name;
|
|
|
|
*selected_name = 0;
|
|
*lance_icon = -1;
|
|
if(pilot_plug->GetPilot())
|
|
{
|
|
//Check to make sure that this guy is still with us and not dead.
|
|
if((pilot_plug->GetPilot()->State() == LancematePlug::OK) &&
|
|
(pilot_plug->GetPilot()->Joined()))
|
|
{
|
|
if(pilot_plug->GetMechPlug())
|
|
{
|
|
if(pilot_plug->GetMechPlug()->GetStatus() == MechTablePlug::DestroyedStatus)
|
|
{
|
|
pilot_plug->SetMech(NULL);
|
|
}
|
|
}
|
|
//we have a pilot plug and we need to get what we are set to
|
|
current_pilot_name = pilot_plug->GetPilot()->m_lancemateName;
|
|
*lance_icon = pilot_plug->GetPilot()->GetLanceIDBasedOnSuffix();
|
|
}
|
|
//If he is dead...take away his mech.
|
|
else
|
|
{
|
|
pilot_plug->SetMech(NULL);
|
|
pilot_plug->SetLancePlug(NULL);
|
|
}
|
|
}
|
|
|
|
//Set the first entry to "";
|
|
|
|
FREEANDNULL(lance_names[0]);
|
|
lance_names[0] = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
lance_names[0],
|
|
"",
|
|
1
|
|
);
|
|
|
|
int i=1;
|
|
while((lance_plug = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
if((lance_plug->State() == LancematePlug::OK) &&
|
|
(lance_plug->Joined()))
|
|
{
|
|
FREEANDNULL(lance_names[i]);
|
|
lance_names[i] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
lance_names[i],
|
|
(const char *)lance_plug->m_lancemateName,
|
|
lance_plug->m_lancemateName.GetLength() + 1
|
|
);
|
|
|
|
if(current_pilot_name)
|
|
{
|
|
if(current_pilot_name == lance_plug->m_lancemateName)
|
|
*selected_name = i;
|
|
}
|
|
|
|
i ++;
|
|
Verify(i<array_size);
|
|
}
|
|
}
|
|
|
|
*num_names = i;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SetLancemate(void* data[], int count)
|
|
{
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
int *lance_id = INTARRAYPARAM(1); //What lance we need a list for
|
|
const char *lance_name = STRPARM(2); //The list of names
|
|
|
|
MWGame::GetInstance()->SetPilot(*lance_id, lance_name);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SelectCurrentPilot(void* data[], int count)
|
|
{
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
int *lance_id = INTARRAYPARAM(1);
|
|
PilotPlug *pilot_plug = MWGame::GetInstance()->GetPilot(*lance_id);
|
|
Check_Object(pilot_plug);
|
|
|
|
MWGame::GetInstance()->m_currentPilot = pilot_plug;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::VerifyLaunchData()
|
|
{
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
return MWGame::GetInstance()->VerifyLaunchData();
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetPilotMechData(void *data[], int count)
|
|
{
|
|
int *lance_id = INTARRAYPARAM(1); //What lance we need a list for
|
|
char **mech_name = &STRPARM(2); //The list of names
|
|
int *mech_id = INTARRAYPARAM(3); //What name is currently selected
|
|
|
|
Check_Object(MWGame::GetInstance());
|
|
PilotPlug *pilot_plug = MWGame::GetInstance()->GetPilot(*lance_id);
|
|
Check_Object(pilot_plug);
|
|
|
|
if(!*mech_name)
|
|
{
|
|
FREEANDNULL(*mech_name);
|
|
*mech_name = (char *)gos_Malloc(128);
|
|
}
|
|
if(pilot_plug->GetMechPlug())
|
|
{
|
|
MString name = pilot_plug->GetMechName();
|
|
|
|
Str_Copy(
|
|
*mech_name,
|
|
(const char *)name,
|
|
name.GetLength() + 1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
Str_Copy(
|
|
*mech_name,
|
|
" ",
|
|
3
|
|
);
|
|
}
|
|
|
|
// if(pilot_plug->GetChassisID() == -1)
|
|
// {
|
|
*mech_id = NoMechID;
|
|
// }
|
|
// else
|
|
// {
|
|
// *mech_id = pilot_plug->GetChassisID();
|
|
// }
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::BanPlayer(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_id = (int)*((int **)data[0]);
|
|
if (connection_id > 255)
|
|
return 0;
|
|
if (connection_id < 2)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_id);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
|
|
MWApplication::GetInstance()->BanPlayer(connection_id);
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::BanPlayersISP(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_id = (int)*((int **)data[0]);
|
|
if (connection_id > 255)
|
|
return 0;
|
|
if (connection_id < 21)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_id);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
|
|
MWApplication::GetInstance()->BanPlayersISP(connection_id);
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::KickPlayer(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_id = (int)*((int **)data[0]);
|
|
if (connection_id > 255)
|
|
return 0;
|
|
if (connection_id < 2)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_id);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
|
|
MWApplication::GetInstance()->KickPlayer(connection_id);
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::SquelchPlayer(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_id = (int)*((int **)data[0]);
|
|
if (connection_id > 255)
|
|
return 0;
|
|
if (connection_id < 2)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_id);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
|
|
MWApplication::GetInstance()->SquelchPlayer(connection_id);
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::IsPlayerSquelched(void * instance,int numParms,void* data[])
|
|
{
|
|
|
|
Check_Object(Network::GetInstance());
|
|
|
|
int connection_id = (int)*((int **)data[0]);
|
|
if (connection_id > 255)
|
|
return 0;
|
|
if (connection_id < 1)
|
|
return 0;
|
|
|
|
Connection *connection = Network::GetInstance()->GetConnection(connection_id);
|
|
|
|
if (connection == NULL)
|
|
return 0;
|
|
|
|
|
|
return MWApplication::GetInstance()->servedConnectionData[connection_id].clientSquelched;
|
|
|
|
}
|
|
|
|
|
|
|
|
int _stdcall MW4Shell::IsMissionReviewAvailable(void *instance,int numParms,void* data[])
|
|
{
|
|
#if !defined(NO_MR)
|
|
return MWApplication::GetInstance()->missionReviewAvailable;
|
|
#else // defined(NO_MR)
|
|
return false;
|
|
#endif // !defined(NO_MR)
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// ngLog addition
|
|
int _stdcall MW4Shell::IsRegisteredForStats(void *instance,int numParms,void* data[])
|
|
{
|
|
#if !defined(NO_LOG)
|
|
#if 0
|
|
// Old options.ini parsing
|
|
NotationFile options_ini("options.ini", NotationFile::Standard, true);
|
|
Page *page = options_ini.FindPage("Network Options");
|
|
if(page) {
|
|
const char *my_password = "\0";
|
|
const char *my_name = "\0";
|
|
const char *my_usepassword = "\0";
|
|
|
|
page->GetEntry("password", &my_password);
|
|
page->GetEntry("playername", &my_name);
|
|
page->GetEntry("usepassword", &my_usepassword);
|
|
|
|
if(*my_usepassword && *my_usepassword != 'n' && *my_usepassword != 'N' && *my_password && *my_name) {
|
|
return(1);
|
|
}
|
|
}
|
|
#else
|
|
if(MW4Shell::Instance &&
|
|
MW4Shell::Instance->m_optionsObject->m_password && MW4Shell::Instance->m_optionsObject->m_password[0] &&
|
|
MW4Shell::Instance->m_optionsObject->m_playerName && MW4Shell::Instance->m_optionsObject->m_playerName[0]) {
|
|
return(1);
|
|
}
|
|
#endif
|
|
#endif // !defined(NO_LOG)
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// ngLog addition
|
|
int _stdcall MW4Shell::ViewStatsInBrowser(void *instance,int numParms,void* data[])
|
|
{
|
|
#if !defined(NO_LOG)
|
|
GUID password_guid;
|
|
|
|
memset(&password_guid, 0, sizeof(GUID));
|
|
|
|
#if 0
|
|
// Old options.ini parsing
|
|
NotationFile options_ini("options.ini", NotationFile::Standard, true);
|
|
Page *page = options_ini.FindPage("Network Options");
|
|
if (page) {
|
|
MD5_CTX resource_context;
|
|
unsigned char *buf = (unsigned char *)&password_guid;
|
|
const char *my_password = "\0";
|
|
const char *my_name = "\0";
|
|
const char *my_usepassword = "\0";
|
|
|
|
|
|
page->GetEntry("password", &my_password);
|
|
page->GetEntry("playername", &my_name);
|
|
page->GetEntry("usepassword", &my_usepassword);
|
|
|
|
if(*my_usepassword && *my_usepassword != 'n' && *my_usepassword != 'N' && *my_password && *my_name) {
|
|
char my_hash[128];
|
|
|
|
|
|
MD5Init(&resource_context);
|
|
MD5Update(&resource_context, (unsigned char *) my_name, strlen(my_name));
|
|
MD5Update(&resource_context, (unsigned char *) my_password, strlen(my_password));
|
|
MD5Final(buf, &resource_context);
|
|
|
|
my_hash[0] = 0;
|
|
for(int i=0; i<sizeof(GUID); i++) {
|
|
strcat(my_hash, va("%02x", buf[i]));
|
|
}
|
|
|
|
gos_EnableSetting(gos_Set_TriggerBrowser,
|
|
(DWORD)va("http://stats.zone.com/fcgi-bin/Search?gt=MW4&gm=all&page=m&view=p&data=%s&type=hash&Nick=%s",
|
|
my_hash, my_name));
|
|
}
|
|
} else {
|
|
return(0);
|
|
}
|
|
#else
|
|
if(!MW4Shell::Instance) {
|
|
return(0);
|
|
}
|
|
|
|
|
|
MD5_CTX resource_context;
|
|
unsigned char *buf = (unsigned char *)&password_guid;
|
|
char my_name[64] = {0};
|
|
char my_pass[64] = {0};
|
|
|
|
|
|
if(MW4Shell::Instance->m_optionsObject->m_password) {
|
|
strncpy(my_pass, MW4Shell::Instance->m_optionsObject->m_password, sizeof(my_pass)-1);
|
|
my_pass[sizeof(my_pass)-1] = 0;
|
|
}
|
|
|
|
if(MW4Shell::Instance->m_optionsObject->m_playerName) {
|
|
strncpy(my_name, MW4Shell::Instance->m_optionsObject->m_playerName, sizeof(my_name)-1);
|
|
my_pass[sizeof(my_name)-1] = 0;
|
|
}
|
|
|
|
if(my_pass[0] && my_name[0]) {
|
|
char tmp[1024], my_hash[128];
|
|
|
|
|
|
MD5Init(&resource_context);
|
|
MD5Update(&resource_context, (unsigned char *)&my_name, strlen(my_name));
|
|
MD5Update(&resource_context, (unsigned char *)&my_pass, strlen(my_pass));
|
|
MD5Final(buf, &resource_context);
|
|
|
|
my_hash[0] = 0;
|
|
for(int i=0; i<sizeof(GUID); i++) {
|
|
sprintf(tmp, "%02x", buf[i]);
|
|
strcat(my_hash, tmp);
|
|
}
|
|
|
|
sprintf(tmp,
|
|
"http://stats.zone.com/fcgi-bin/Search?gt=MW4&gm=all&page=m&view=p&data=%s&type=hash&Nick=%s",
|
|
my_hash, my_name);
|
|
|
|
gos_EnableSetting(gos_Set_TriggerBrowser, (DWORD)tmp);
|
|
} else {
|
|
return(0);
|
|
}
|
|
#endif
|
|
#endif // !defined(NO_LOG)
|
|
|
|
return(1);
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
MW4Shell::SelectLastUsedPilot()
|
|
{
|
|
//Ok so we need to run through all the Pilots...if there is not one then we need
|
|
//to create a default one.
|
|
|
|
bool make_new_pilot = false;
|
|
MString new_pilot_directory = "Resource\\Pilots\\";
|
|
if(!gos_DoesFileExist(new_pilot_directory))
|
|
{
|
|
//This means we have no pilots
|
|
gos_CreateDirectory(new_pilot_directory);
|
|
make_new_pilot = true;
|
|
}
|
|
|
|
new_pilot_directory += "*.*";
|
|
Stuff::Directory *pilot_directory;
|
|
pilot_directory = new Stuff::Directory(new_pilot_directory, true);
|
|
Check_Object(pilot_directory);
|
|
MString file_name = pilot_directory->GetCurrentFolderName();
|
|
MString selected_pilot;
|
|
__int64 selected_time_stamp = 0;
|
|
|
|
while(file_name)
|
|
{
|
|
MString current_pilot_path = "Resource\\Pilots\\";
|
|
current_pilot_path += file_name;
|
|
current_pilot_path += "\\*.mw4";
|
|
Stuff::Directory *current_pilot_directory;
|
|
current_pilot_directory = new Stuff::Directory(current_pilot_path, false);
|
|
MString newest_options_file = current_pilot_directory->currentDirectoryString;
|
|
MString options_file = current_pilot_directory->GetNewestFile();
|
|
if(options_file)
|
|
{
|
|
newest_options_file += options_file;
|
|
__int64 current_file_time = gos_FileTimeStamp((const char *)newest_options_file);
|
|
if(current_file_time > selected_time_stamp)
|
|
{
|
|
selected_pilot = file_name;
|
|
selected_time_stamp = current_file_time;
|
|
}
|
|
}
|
|
delete current_pilot_directory;
|
|
|
|
pilot_directory->AdvanceCurrentFolder();
|
|
file_name = pilot_directory->GetCurrentFolderName();
|
|
}
|
|
|
|
delete pilot_directory;
|
|
|
|
if(selected_time_stamp == 0)
|
|
make_new_pilot = true;
|
|
|
|
if(make_new_pilot)
|
|
{
|
|
CreateNewPilot("Default");
|
|
SelectPilot("Default");
|
|
}
|
|
else
|
|
{
|
|
SelectPilot((const char *)selected_pilot);
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SelectPilot(const char *pilot_name)
|
|
{
|
|
Check_Object(MWApplication::GetInstance());
|
|
|
|
MWApplication::GetInstance()->m_pilotName = pilot_name;
|
|
|
|
//Here we also need to load up the options file for the pilot.
|
|
MString new_pilot_directory = "Resource\\Pilots\\";
|
|
if(!gos_DoesFileExist(new_pilot_directory))
|
|
gos_CreateDirectory(new_pilot_directory);
|
|
new_pilot_directory += pilot_name;
|
|
new_pilot_directory += "\\";
|
|
|
|
if(m_optionsFile)
|
|
delete m_optionsFile;
|
|
|
|
MString options_file_name = new_pilot_directory;
|
|
options_file_name += "options.mw4";
|
|
|
|
bool need_create_new = true;
|
|
if(gos_DoesFileExist(options_file_name))
|
|
{
|
|
//if the file exists then open it
|
|
m_optionsFile = ResourceManager::Instance->OpenResourceFile(
|
|
options_file_name,
|
|
NULL,
|
|
OptionsResourceFileID,
|
|
VER_CONTENTVERSION,
|
|
false,
|
|
false,
|
|
false
|
|
);
|
|
|
|
//Check to see if the options are there (possible build failure)
|
|
Resource temp_resource("{Player Options}", m_optionsFile);
|
|
if(temp_resource.DoesResourceExist())
|
|
need_create_new = false;
|
|
else
|
|
{
|
|
#if defined(LAB_ONLY)
|
|
PAUSE(("Options out of Date, Rebuilding with Default Stream"));
|
|
#endif
|
|
delete m_optionsFile;
|
|
}
|
|
}
|
|
if(need_create_new)
|
|
{
|
|
//the file got zapped somehow...create one
|
|
m_optionsFile = ResourceManager::Instance->OpenResourceFile(
|
|
options_file_name,
|
|
NULL,
|
|
OptionsResourceFileID,
|
|
VER_CONTENTVERSION,
|
|
false,
|
|
true,
|
|
false
|
|
);
|
|
|
|
DynamicMemoryStream options_stream;
|
|
//By passing a NULL in here...we will get a default stream created.
|
|
MWOptions::ConstructOptionsStream(NULL, &options_stream);
|
|
Resource options_resource("{Player Options}", m_optionsFile);
|
|
options_stream.Rewind();
|
|
options_resource.Save(&options_stream, NULL);
|
|
m_optionsObject = new MWOptions(&options_resource);
|
|
Check_Object(m_optionsObject);
|
|
|
|
g_ControlList->LoadDefault ();
|
|
Resource control_resource("{Control Options}", m_optionsFile);
|
|
DynamicMemoryStream control_stream;
|
|
g_ControlList->SaveList (control_stream);
|
|
control_stream.Rewind ();
|
|
control_resource.Save (&control_stream,NULL);
|
|
|
|
m_optionsFile->Save();
|
|
}
|
|
|
|
if(m_optionsObject)
|
|
delete m_optionsObject;
|
|
|
|
Resource options_resource("{Player Options}", m_optionsFile);
|
|
options_resource.LoadData();
|
|
Verify(options_resource.DoesResourceExist());
|
|
|
|
m_optionsObject = new MWOptions(&options_resource);
|
|
Check_Object(m_optionsObject);
|
|
// jcem - begin
|
|
ChannelType::s_sfxVolume = m_optionsObject->m_sfxVolume / 100.0f;
|
|
ChannelType::s_musicVolume = m_optionsObject->m_musicVolume / 100.0f;
|
|
// jcem - end
|
|
if(m_optionsObject->m_closingCinemaName)
|
|
{
|
|
Str_Copy(m_endMovieName,
|
|
(char *)m_optionsObject->m_closingCinemaName,
|
|
256
|
|
);
|
|
}
|
|
|
|
Resource control_resource("{Control Options}", m_optionsFile);
|
|
control_resource.LoadData();
|
|
Verify(control_resource.DoesResourceExist());
|
|
g_ControlList->LoadList (control_resource);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SelectPilot(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
const char *pilot_name = STRPARM(1);
|
|
return SelectPilot(pilot_name);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetCurrentPilotName(void *data[], int count)
|
|
{
|
|
char **mech_name = &STRPARM(1);
|
|
|
|
FREEANDNULL(*mech_name);
|
|
*mech_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*mech_name,
|
|
(const char *)MWApplication::GetInstance()->m_pilotName,
|
|
MWApplication::GetInstance()->m_pilotName.GetLength() + 1
|
|
);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::DeletePilot(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
if(m_optionsObject)
|
|
{
|
|
delete m_optionsObject;
|
|
m_optionsObject = NULL;
|
|
}
|
|
|
|
if(m_optionsFile)
|
|
{
|
|
delete m_optionsFile;
|
|
m_optionsFile = NULL;
|
|
}
|
|
|
|
if(MWGame::GetInstance())
|
|
{
|
|
delete MWGame::GetInstance();
|
|
GlobalPointers::ClearPointer(MWGameGlobalPointerIndex);
|
|
}
|
|
|
|
const char *mech_name = STRPARM(1);
|
|
MString pilot_directory = "Resource\\Pilots\\";
|
|
pilot_directory += mech_name;
|
|
pilot_directory += "\\";
|
|
|
|
MString games_directory = pilot_directory;
|
|
games_directory += "Games\\";
|
|
MString games_path = games_directory;
|
|
games_path += "*.*";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(games_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
MString file = games_directory;
|
|
file += file_name;
|
|
gos_DeleteFile(file);
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
games_path.IsolateDirectory();
|
|
gos_DeleteDirectory(games_path);
|
|
|
|
MString pilot_path = pilot_directory;
|
|
pilot_path += "*.*";
|
|
resource_directory = new Stuff::Directory(pilot_path, true);
|
|
Check_Object(resource_directory);
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
MString file = pilot_directory;
|
|
file += file_name;
|
|
gos_DeleteFile(file);
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
gos_DeleteDirectory(pilot_directory);
|
|
|
|
if(!_stricmp((char *)MWApplication::GetInstance()->m_pilotName, mech_name))
|
|
MWApplication::GetInstance()->m_pilotName = "";
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::RenamePilot(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
const char *mech_name = STRPARM(1);
|
|
const char *new_mech_name = STRPARM(2);
|
|
|
|
if(m_optionsObject)
|
|
{
|
|
delete m_optionsObject;
|
|
m_optionsObject = NULL;
|
|
}
|
|
|
|
if(m_optionsFile)
|
|
{
|
|
delete m_optionsFile;
|
|
m_optionsFile = NULL;
|
|
}
|
|
|
|
MString old_pilot_directory = "Resource\\Pilots\\";
|
|
old_pilot_directory += mech_name;
|
|
MString new_pilot_directory = "Resource\\Pilots\\";
|
|
new_pilot_directory += new_mech_name;
|
|
|
|
int return_value = 0;
|
|
if ((MWApplication::ValidateName((char*)new_mech_name, true)) && (MWApplication::ValidatePath(new_pilot_directory, true)))
|
|
return_value = gos_RenameFile(old_pilot_directory, new_pilot_directory);
|
|
|
|
if (!return_value)
|
|
return -1;
|
|
|
|
return return_value;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::ClonePilot(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
const char *from_pilot_name = STRPARM(1);
|
|
const char *to_pilot_name = STRPARM(2);
|
|
|
|
// Select the pilot to be cloned
|
|
SelectPilot(from_pilot_name);
|
|
|
|
MString new_pilot_directory = "Resource\\Pilots\\";
|
|
//Check the name for slashes that will screw with directory structure
|
|
if(strstr(to_pilot_name, "\\"))
|
|
return -1;
|
|
if(!gos_DoesFileExist(new_pilot_directory))
|
|
gos_CreateDirectory(new_pilot_directory);
|
|
new_pilot_directory += to_pilot_name;
|
|
new_pilot_directory += "\\";
|
|
|
|
bool return_value = false;
|
|
|
|
if(!gos_DoesFileExist(new_pilot_directory))
|
|
{
|
|
|
|
if ((MWApplication::ValidateName((char*)to_pilot_name, true)) && (MWApplication::ValidatePath(new_pilot_directory, true)))
|
|
return_value = gos_CreateDirectory(new_pilot_directory);
|
|
else
|
|
return -1;
|
|
|
|
MString options_file_name = new_pilot_directory;
|
|
options_file_name += "options.mw4";
|
|
|
|
if(!MWApplication::ValidatePath(options_file_name, false))
|
|
return -1;
|
|
|
|
m_optionsFile = ResourceManager::Instance->OpenResourceFile(
|
|
options_file_name,
|
|
NULL,
|
|
OptionsResourceFileID,
|
|
VER_CONTENTVERSION,
|
|
false,
|
|
true,
|
|
false
|
|
);
|
|
|
|
DynamicMemoryStream options_stream;
|
|
|
|
Resource options_resource("{Player Options}", m_optionsFile);
|
|
m_optionsObject->SaveToStream(&options_stream);
|
|
options_resource.Save(&options_stream, NULL);
|
|
|
|
Resource control_resource("{Control Options}", m_optionsFile);
|
|
DynamicMemoryStream control_stream;
|
|
g_ControlList->SaveList (control_stream);
|
|
control_stream.Rewind ();
|
|
control_resource.Save (&control_stream,NULL);
|
|
|
|
Check_Object(m_optionsObject);
|
|
m_optionsFile->Save();
|
|
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
//Clean up because we will get a select after this!
|
|
if(m_optionsFile)
|
|
{
|
|
delete m_optionsFile;
|
|
m_optionsFile = NULL;
|
|
}
|
|
if(m_optionsObject)
|
|
{
|
|
delete m_optionsObject;
|
|
m_optionsObject = NULL;
|
|
}
|
|
return return_value;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::CreateNewPilot(const char *pilot_name, int difficulty)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
MString new_pilot_directory = "Resource\\Pilots\\";
|
|
//Check the name for slashes that will screw with directory structure
|
|
if(strstr(pilot_name, "\\"))
|
|
return -1;
|
|
if(!gos_DoesFileExist(new_pilot_directory))
|
|
gos_CreateDirectory(new_pilot_directory);
|
|
new_pilot_directory += pilot_name;
|
|
new_pilot_directory += "\\";
|
|
|
|
bool return_value = false;
|
|
|
|
if(!gos_DoesFileExist(new_pilot_directory))
|
|
{
|
|
|
|
if ((MWApplication::ValidateName((char*)pilot_name, true)) && (MWApplication::ValidatePath(new_pilot_directory, true)))
|
|
return_value = gos_CreateDirectory(new_pilot_directory);
|
|
else
|
|
return -1;
|
|
|
|
//When we create a new pilot...we need to create a new options file
|
|
if(m_optionsFile)
|
|
delete m_optionsFile;
|
|
if(m_optionsObject)
|
|
delete m_optionsObject;
|
|
|
|
MString options_file_name = new_pilot_directory;
|
|
options_file_name += "options.mw4";
|
|
|
|
if((!MWApplication::ValidatePath(options_file_name, false)) || (!return_value))
|
|
return -1;
|
|
|
|
m_optionsFile = ResourceManager::Instance->OpenResourceFile(
|
|
options_file_name,
|
|
NULL,
|
|
OptionsResourceFileID,
|
|
VER_CONTENTVERSION,
|
|
false,
|
|
true,
|
|
false
|
|
);
|
|
|
|
DynamicMemoryStream options_stream;
|
|
DynamicMemoryStream initial_stream;
|
|
//By passing a NULL in here...we will get a default stream created.
|
|
MWOptions::ConstructOptionsStream(NULL, &initial_stream);
|
|
|
|
initial_stream.Rewind();
|
|
Resource options_resource("{Player Options}", m_optionsFile);
|
|
m_optionsObject = new MWOptions(&initial_stream);
|
|
m_optionsObject->m_difficultyLevel = difficulty;
|
|
m_optionsObject->m_playerName = pilot_name;
|
|
|
|
NotationFile options_ini("options.ini", NotationFile::Standard, true);
|
|
Page *page = options_ini.FindPage("graphics options");
|
|
if(page)
|
|
{
|
|
int screen_width = 800;
|
|
page->GetEntry("screenwidth", &screen_width);
|
|
|
|
switch(screen_width)
|
|
{
|
|
case 1600:
|
|
m_optionsObject->m_resolution=MWOptions::Res1600x1200;
|
|
break;
|
|
|
|
case 1280:
|
|
m_optionsObject->m_resolution=MWOptions::Res1280x1024;
|
|
break;
|
|
|
|
case 1024:
|
|
m_optionsObject->m_resolution=MWOptions::Res1024x768;
|
|
break;
|
|
|
|
case 800:
|
|
m_optionsObject->m_resolution=MWOptions::Res800x600;
|
|
break;
|
|
|
|
case 640:
|
|
m_optionsObject->m_resolution=MWOptions::Res640x480;
|
|
break;
|
|
}
|
|
}
|
|
m_optionsObject->SaveToStream(&options_stream);
|
|
options_resource.Save(&options_stream, NULL);
|
|
|
|
g_ControlList->LoadDefault ();
|
|
Resource control_resource("{Control Options}", m_optionsFile);
|
|
DynamicMemoryStream control_stream;
|
|
g_ControlList->SaveList (control_stream);
|
|
control_stream.Rewind ();
|
|
control_resource.Save (&control_stream,NULL);
|
|
Check_Object(m_optionsObject);
|
|
m_optionsFile->Save();
|
|
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
//Clean up because we will get a select after this!
|
|
if(m_optionsFile)
|
|
{
|
|
delete m_optionsFile;
|
|
m_optionsFile = NULL;
|
|
}
|
|
if(m_optionsObject)
|
|
{
|
|
delete m_optionsObject;
|
|
m_optionsObject = NULL;
|
|
}
|
|
return return_value;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::CreateNewPilot(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
const char *pilot_name = STRPARM(1);
|
|
int difficulty = INTPARM(2);
|
|
|
|
return CreateNewPilot(pilot_name, difficulty);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetPilotList(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
char **pilot_names = STRARRAYPARAM(1);
|
|
int *num_pilots = INTARRAYPARAM(2);
|
|
|
|
Stuff::MString mechs_path = "Resource\\Pilots\\*.*";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(mechs_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
int i = 0;
|
|
while((file_name = resource_directory->GetCurrentFolderName()) != NULL)
|
|
{
|
|
FREEANDNULL(pilot_names[i]);
|
|
pilot_names[i] = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
pilot_names[i],
|
|
(const char *)file_name,
|
|
strlen(file_name) + 1
|
|
);
|
|
|
|
resource_directory->AdvanceCurrentFolder();
|
|
i ++;
|
|
}
|
|
delete resource_directory;
|
|
|
|
*num_pilots = i;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetDifficultyLevel(void *data[], int count)
|
|
{
|
|
int *level = INTARRAYPARAM(1);
|
|
|
|
*level = MWApplication::GetInstance()->GetDifficultyLevel();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SetDifficultyLevel(void *data[], int count)
|
|
{
|
|
int *level = INTARRAYPARAM(1);
|
|
|
|
MWApplication::GetInstance()->SetDifficultyLevel(*level);
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetLanceStats(void *data[], int count)
|
|
{
|
|
int *lance_id = INTARRAYPARAM(1);
|
|
int *stats = INTARRAYPARAM(2);
|
|
|
|
Check_Object(MWGame::GetInstance());
|
|
PilotPlug *pilot_plug = MWGame::GetInstance()->GetPilot(*lance_id);
|
|
Check_Object(pilot_plug);
|
|
|
|
for(int i=0; i<4; i++)
|
|
{
|
|
stats[i] = 0;
|
|
}
|
|
|
|
if(pilot_plug->GetPilot())
|
|
{
|
|
stats[0] = pilot_plug->GetPilot()->GunnerySkill();
|
|
Clamp(stats[0], 0, 100);
|
|
stats[1] = pilot_plug->GetPilot()->PilotSkill();
|
|
Clamp(stats[1], 0, 100);
|
|
int sensor = (10 - pilot_plug->GetPilot()->SensorSkill()) * 10;
|
|
stats[2] = sensor;
|
|
Clamp(stats[2], 0, 100);
|
|
stats[3] = pilot_plug->GetPilot()->BlindFightingSkill() / 2;
|
|
Clamp(stats[3], 0, 100);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetMechStats(void *data[], int count)
|
|
{
|
|
int *lance_id = INTARRAYPARAM(1);
|
|
int *stats = INTARRAYPARAM(2);
|
|
|
|
Check_Object(MWGame::GetInstance());
|
|
PilotPlug *pilot_plug = MWGame::GetInstance()->GetPilot(*lance_id);
|
|
Check_Object(pilot_plug);
|
|
|
|
for(int i=0; i<4; i++)
|
|
{
|
|
stats[i] = 0;
|
|
}
|
|
|
|
if(pilot_plug->GetMechPlug())
|
|
{
|
|
stats[0] = 60;
|
|
stats[1] = 50;
|
|
stats[2] = 80;
|
|
stats[3] = 60;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetMissionRegionCount(void *data[], int count)
|
|
{
|
|
int *region_count = INTARRAYPARAM(1);
|
|
|
|
Check_Object(MWGame::GetInstance());
|
|
Check_Object(MWGame::GetInstance()->m_campaign);
|
|
|
|
*region_count = MWGame::GetInstance()->m_campaign->GetOPMissionCount();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetMissionRegionIDs(void *data[], int count)
|
|
{
|
|
int *region_ids = INTARRAYPARAM(1);
|
|
int *selected_region = INTARRAYPARAM(2);
|
|
|
|
Check_Object(MWGame::GetInstance());
|
|
Check_Object(MWGame::GetInstance()->m_campaign);
|
|
|
|
CampaignMissionPlug *mission;
|
|
ChainIteratorOf<CampaignMissionPlug *> iterator(&MWGame::GetInstance()->m_campaign->m_missions);
|
|
int num = 0;
|
|
int current_op = MWGame::GetInstance()->m_campaign->m_currentOp;
|
|
while((mission = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mission);
|
|
if((mission->m_status != MWCampaign::Hidden) && (mission->m_opNumber == current_op))
|
|
{
|
|
Verify(num < MWGame::GetInstance()->m_campaign->GetOPMissionCount());
|
|
region_ids[num] = mission->m_displayNameIndex;
|
|
num ++;
|
|
}
|
|
}
|
|
|
|
*selected_region = MWGame::GetInstance()->m_campaign->m_currentMissionPlug->m_displayNameIndex;
|
|
MString name = MWGame::GetInstance()->m_campaign->m_currentMissionPlug->m_missionName;
|
|
name.StripDirectory();
|
|
name.StripExtension();
|
|
Str_Copy(m_iaMissionName, (char *)name, 256);
|
|
MWApplication::GetInstance()->m_currentMissionName = name;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetMissionData(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
char **icon_name = &STRPARM(2);
|
|
char **texture_name = &STRPARM(3);
|
|
int *change_time = INTARRAYPARAM(4);
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
FREEANDNULL(*icon_name);
|
|
*icon_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*icon_name,
|
|
(const char *)interface_plug->GetIconName(),
|
|
interface_plug->GetIconName().GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(*texture_name);
|
|
*texture_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*texture_name,
|
|
(const char *)interface_plug->GetMapTextureName(),
|
|
interface_plug->GetMapTextureName().GetLength() + 1
|
|
);
|
|
|
|
*change_time = mission_plug->m_canChangeTime;
|
|
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetMissionRegionData(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *x_location = INTARRAYPARAM(2);
|
|
int *y_location = INTARRAYPARAM(3);
|
|
int *height = INTARRAYPARAM(4);
|
|
int *width = INTARRAYPARAM(5);
|
|
int *status = INTARRAYPARAM(6);
|
|
int *num_lance = INTARRAYPARAM(7);
|
|
char **region_name = &STRPARM(8);
|
|
char **rollover_name = &STRPARM(9);
|
|
char **rclick_name = &STRPARM(10);
|
|
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
*x_location = interface_plug->GetXLocation();
|
|
*y_location = interface_plug->GetYLocation();
|
|
*height = interface_plug->GetHeight();
|
|
*width = interface_plug->GetWidth();
|
|
|
|
*status = mission_plug->m_status;
|
|
*num_lance = mission_plug->m_NumLancemates;
|
|
|
|
FREEANDNULL(*region_name);
|
|
*region_name = (char *)gos_Malloc(128);
|
|
|
|
MString region_loc_name = MWApplication::GetInstance()->GetLocString(mission_plug->m_displayNameIndex);
|
|
Str_Copy(
|
|
*region_name,
|
|
(const char *)region_loc_name,
|
|
region_loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(*rollover_name);
|
|
*rollover_name = (char *)gos_Malloc(512);
|
|
|
|
region_loc_name = MWApplication::GetInstance()->GetLocString(interface_plug->GetRollOverID());
|
|
Str_Copy(
|
|
*rollover_name,
|
|
(const char *)region_loc_name,
|
|
region_loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(*rclick_name);
|
|
*rclick_name = (char *)gos_Malloc(512);
|
|
|
|
region_loc_name = MWApplication::GetInstance()->GetLocString(interface_plug->GetRightClickID());
|
|
Str_Copy(
|
|
*rclick_name,
|
|
(const char *)region_loc_name,
|
|
region_loc_name.GetLength() + 1
|
|
);
|
|
|
|
|
|
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SetCampaignMissionName(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
MWGame::GetInstance()->m_campaign->m_currentMissionPlug = mission_plug;
|
|
MString name = mission_plug->m_missionName;
|
|
name.StripDirectory();
|
|
name.StripExtension();
|
|
Str_Copy(m_iaMissionName, (char *)name, 256);
|
|
MWApplication::GetInstance()->m_currentMissionName = name;
|
|
|
|
MWGame::GetInstance()->m_campaign->m_movieManager->ExecuteMissionSelection(name);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionNavPointCount(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *point_count = INTARRAYPARAM(2);
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
*point_count = interface_plug->m_navPoints.GetSize();
|
|
|
|
delete interface_plug;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionDropPointCount(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *point_count = INTARRAYPARAM(2);
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
*point_count = interface_plug->m_dropPoints.GetSize();
|
|
|
|
delete interface_plug;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionInfoPointCount(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *point_count = INTARRAYPARAM(2);
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
*point_count = interface_plug->m_infoPoints.GetSize();
|
|
|
|
delete interface_plug;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetGeneralInfoPointCount(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *point_count = INTARRAYPARAM(2);
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
*point_count = interface_plug->m_generalInfoPoints.GetSize();
|
|
|
|
delete interface_plug;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionNavPoints(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *x_location = INTARRAYPARAM(2);
|
|
int *y_location = INTARRAYPARAM(3);
|
|
int *height = INTARRAYPARAM(4);
|
|
int *width = INTARRAYPARAM(5);
|
|
char **point_name = STRARRAYPARAM(6);
|
|
char **rollover_name = STRARRAYPARAM(7);
|
|
char **rclick_name = STRARRAYPARAM(8);
|
|
|
|
#if defined(_ARMOR)
|
|
int array_size = VALUEPARM(9);
|
|
#endif
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
ChainIteratorOf<MWMissionMapPoint *> nav_iterator(&interface_plug->m_navPoints);
|
|
MWMissionMapPoint *nav_point;
|
|
int point_count = 0;
|
|
while((nav_point = nav_iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Verify(point_count < array_size);
|
|
Check_Object(nav_point);
|
|
x_location[point_count] = nav_point->m_xLoc;
|
|
y_location[point_count] = nav_point->m_yLoc;
|
|
width[point_count] = nav_point->m_width;
|
|
height[point_count] = nav_point->m_height;
|
|
|
|
FREEANDNULL(point_name[point_count]);
|
|
point_name[point_count] = (char *)gos_Malloc(128);
|
|
|
|
MString loc_name = MWApplication::GetInstance()->GetLocString(nav_point->m_textID);
|
|
Str_Copy(
|
|
point_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rollover_name[point_count]);
|
|
rollover_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(nav_point->m_rolltextID);
|
|
Str_Copy(
|
|
rollover_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rclick_name[point_count]);
|
|
rclick_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(nav_point->m_rclicktextID);
|
|
Str_Copy(
|
|
rclick_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
point_count ++;
|
|
}
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionInfoPoints(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *x_location = INTARRAYPARAM(2);
|
|
int *y_location = INTARRAYPARAM(3);
|
|
int *height = INTARRAYPARAM(4);
|
|
int *width = INTARRAYPARAM(5);
|
|
char **point_name = STRARRAYPARAM(6);
|
|
char **rollover_name = STRARRAYPARAM(7);
|
|
char **rclick_name = STRARRAYPARAM(8);
|
|
char **icon_name = STRARRAYPARAM(9);
|
|
#if defined(_ARMOR)
|
|
int array_size = VALUEPARM(10);
|
|
#endif
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
ChainIteratorOf<MWMissionMapPoint *> info_iterator(&interface_plug->m_infoPoints);
|
|
MWMissionMapPoint *info_point;
|
|
int point_count = 0;
|
|
while((info_point = info_iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Verify(point_count < array_size);
|
|
Check_Object(info_point);
|
|
x_location[point_count] = info_point->m_xLoc;
|
|
y_location[point_count] = info_point->m_yLoc;
|
|
width[point_count] = info_point->m_width;
|
|
height[point_count] = info_point->m_height;
|
|
|
|
FREEANDNULL(point_name[point_count]);
|
|
point_name[point_count] = (char *)gos_Malloc(128);
|
|
|
|
MString loc_name = MWApplication::GetInstance()->GetLocString(info_point->m_textID);
|
|
Str_Copy(
|
|
point_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rollover_name[point_count]);
|
|
rollover_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(info_point->m_rolltextID);
|
|
Str_Copy(
|
|
rollover_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rclick_name[point_count]);
|
|
rclick_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(info_point->m_rclicktextID);
|
|
Str_Copy(
|
|
rclick_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(icon_name[point_count]);
|
|
icon_name[point_count] = (char *)gos_Malloc(256);
|
|
|
|
Str_Copy(
|
|
icon_name[point_count],
|
|
(const char *)info_point->m_iconName,
|
|
info_point->m_iconName.GetLength() + 1
|
|
);
|
|
|
|
point_count ++;
|
|
}
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionDropPoints(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *x_location = INTARRAYPARAM(2);
|
|
int *y_location = INTARRAYPARAM(3);
|
|
int *height = INTARRAYPARAM(4);
|
|
int *width = INTARRAYPARAM(5);
|
|
char **point_name = STRARRAYPARAM(6);
|
|
char **rollover_name = STRARRAYPARAM(7);
|
|
char **rclick_name = STRARRAYPARAM(8);
|
|
#if defined(_ARMOR)
|
|
int array_size = VALUEPARM(9);
|
|
#endif
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
ChainIteratorOf<MWMissionMapPoint *> drop_iterator(&interface_plug->m_dropPoints);
|
|
MWMissionMapPoint *drop_point;
|
|
int point_count = 0;
|
|
while((drop_point = drop_iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Verify(point_count < array_size);
|
|
Check_Object(drop_point);
|
|
x_location[point_count] = drop_point->m_xLoc;
|
|
y_location[point_count] = drop_point->m_yLoc;
|
|
width[point_count] = drop_point->m_width;
|
|
height[point_count] = drop_point->m_height;
|
|
|
|
FREEANDNULL(point_name[point_count]);
|
|
point_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
MString loc_name = MWApplication::GetInstance()->GetLocString(drop_point->m_textID);
|
|
Str_Copy(
|
|
point_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rollover_name[point_count]);
|
|
rollover_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(drop_point->m_rolltextID);
|
|
Str_Copy(
|
|
rollover_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rclick_name[point_count]);
|
|
rclick_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(drop_point->m_rclicktextID);
|
|
Str_Copy(
|
|
rclick_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
point_count ++;
|
|
}
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetMissionGeneralInfoPoints(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
int *x_location = INTARRAYPARAM(2);
|
|
int *y_location = INTARRAYPARAM(3);
|
|
int *height = INTARRAYPARAM(4);
|
|
int *width = INTARRAYPARAM(5);
|
|
char **point_name = STRARRAYPARAM(6);
|
|
char **rollover_name = STRARRAYPARAM(7);
|
|
char **rclick_name = STRARRAYPARAM(8);
|
|
char **icon_name = STRARRAYPARAM(9);
|
|
#if defined(_ARMOR)
|
|
int array_size = VALUEPARM(10);
|
|
#endif
|
|
|
|
CampaignMissionPlug *mission_plug = MWGame::GetInstance()->m_campaign->FindMission(*region_id);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
ChainIteratorOf<MWMissionMapPoint *> info_iterator(&interface_plug->m_generalInfoPoints);
|
|
MWMissionMapPoint *info_point;
|
|
int point_count = 0;
|
|
while((info_point = info_iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Verify(point_count < array_size);
|
|
Check_Object(info_point);
|
|
x_location[point_count] = info_point->m_xLoc;
|
|
y_location[point_count] = info_point->m_yLoc;
|
|
width[point_count] = info_point->m_width;
|
|
height[point_count] = info_point->m_height;
|
|
|
|
FREEANDNULL(point_name[point_count]);
|
|
point_name[point_count] = (char *)gos_Malloc(256);
|
|
|
|
MString loc_name = MWApplication::GetInstance()->GetLocString(info_point->m_textID);
|
|
Str_Copy(
|
|
point_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rollover_name[point_count]);
|
|
rollover_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(info_point->m_rolltextID);
|
|
Str_Copy(
|
|
rollover_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(rclick_name[point_count]);
|
|
rclick_name[point_count] = (char *)gos_Malloc(512);
|
|
|
|
loc_name = MWApplication::GetInstance()->GetLocString(info_point->m_rclicktextID);
|
|
Str_Copy(
|
|
rclick_name[point_count],
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(icon_name[point_count]);
|
|
icon_name[point_count] = (char *)gos_Malloc(256);
|
|
|
|
Str_Copy(
|
|
icon_name[point_count],
|
|
(const char *)info_point->m_iconName,
|
|
info_point->m_iconName.GetLength() + 1
|
|
);
|
|
|
|
point_count ++;
|
|
}
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetCampaignOpData(void *data[], int count)
|
|
{
|
|
char **op_name = &STRPARM(1);
|
|
char **texture_name = &STRPARM(2);
|
|
|
|
int current_op = MWGame::GetInstance()->m_campaign->m_currentOp;
|
|
OperationPlug *op_plug = MWGame::GetInstance()->m_campaign->m_operations.Find(current_op);
|
|
Check_Object(op_plug);
|
|
|
|
FREEANDNULL(*op_name);
|
|
*op_name = (char *)gos_Malloc(128);
|
|
|
|
MString loc_name = MWApplication::GetInstance()->GetLocString(op_plug->GetNameIndex());
|
|
Str_Copy(
|
|
*op_name,
|
|
(const char *)loc_name,
|
|
loc_name.GetLength() + 1
|
|
);
|
|
|
|
FREEANDNULL(*texture_name);
|
|
*texture_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*texture_name,
|
|
(const char *)op_plug->GetMapTextureName(),
|
|
op_plug->GetMapTextureName().GetLength() + 1
|
|
);
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
Sets the m_gameTypeStr to be the abbreviated name for the rule type
|
|
enumeration specified in data[0] (which is expected to be an int variable,
|
|
not a literal value).
|
|
|
|
m_gameTypeStr is advertised to the scripts via the registered variable
|
|
"m_gameTypeStr".
|
|
*/
|
|
int MW4Shell::GetGameTypeString(void * instance, int numParms, void* data[])
|
|
{
|
|
const char * ruleName;
|
|
if ( numParms == 2 ) {
|
|
int compareVal;
|
|
switch(VALUEPARM(0))
|
|
{
|
|
case 0:
|
|
compareVal = VALUEPARM(1);
|
|
break;
|
|
case 1:
|
|
compareVal = INTPARM(1);
|
|
break;
|
|
default: // case 2:
|
|
gosASSERT(VALUEPARM(0) == 2);
|
|
compareVal = *INTARRAYPARAM(1);
|
|
break;
|
|
}
|
|
ruleName = GetRuleName( compareVal);
|
|
} else {
|
|
ruleName = NULL;
|
|
}
|
|
m_gameTypeStr = s_gameTypeStr;
|
|
if (ruleName)
|
|
{
|
|
strcpy(s_gameTypeStr, (char *) ruleName);
|
|
return 0;
|
|
} else {
|
|
strcpy(s_gameTypeStr,"");
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
int MW4Shell::GetGameTypeFromString(void * instance, int numParms, void* data[])
|
|
{
|
|
if ( numParms == 0 )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
for (int i = 0; i < GameTypeCount; i++)
|
|
{
|
|
if ( !stricmp(STRPARM(0), GetRuleName( i ) ) )
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
return -1; // not found
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
/*
|
|
author: mdm
|
|
Description: Maps rule type enumeration to a descriptive string. String
|
|
is designed to be minimal in length.
|
|
*/
|
|
const char * MW4Shell::GetRuleName( int ruleType )
|
|
{
|
|
if ((unsigned int)ruleType >= GameTypeCount)
|
|
return NULL;
|
|
|
|
return Application::GetInstance()->GetLocString(IDS_RULENAME_BASE + ruleType);
|
|
}
|
|
|
|
void * __cdecl GetMech4SpecialGameData(int data_type, ...)
|
|
{
|
|
if (data_type == 0)
|
|
{
|
|
int ruleType = ((int *)&data_type)[1];
|
|
int size = ((int *)&data_type)[2];
|
|
char *buffer = ((char **)&data_type)[3];
|
|
|
|
if ((unsigned int)ruleType >= GameTypeCount)
|
|
{
|
|
if (buffer)
|
|
buffer[0]=0;
|
|
return NULL;
|
|
}
|
|
|
|
if (buffer)
|
|
mbs_strncpy(buffer, Application::GetInstance()->GetLocString(IDS_RULENAME_SHORT_BASE + ruleType), size);
|
|
return (void *)1;
|
|
}
|
|
else if (data_type == 1)
|
|
{
|
|
int ruleType = ((int *)&data_type)[1];
|
|
int size = ((int *)&data_type)[2];
|
|
char *buffer = ((char **)&data_type)[3];
|
|
|
|
if ((unsigned int)ruleType >= GameTypeCount)
|
|
{
|
|
if (buffer)
|
|
buffer[0]=0;
|
|
return NULL;
|
|
}
|
|
|
|
if (buffer)
|
|
mbs_strncpy(buffer, Application::GetInstance()->GetLocString(IDS_RULENAME_BASE + ruleType), size);
|
|
return (void *)1;
|
|
}
|
|
|
|
|
|
return NULL;
|
|
}
|
|
|
|
char MW4Shell::s_gameTypeStr[128] = ""; // mdm - for game type string is gosscript
|
|
char * MW4Shell::m_gameTypeStr = s_gameTypeStr;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetOptionsToggleValue(void *data[], int count)
|
|
{
|
|
int toggle_id = (int)data[1];
|
|
int *toggle_value = INTARRAYPARAM(2);
|
|
Check_Object(m_optionsObject);
|
|
|
|
*toggle_value = 0;
|
|
|
|
switch(toggle_id)
|
|
{
|
|
case MWO_HEAT:
|
|
*toggle_value = m_optionsObject->m_useHeat;
|
|
break;
|
|
case MWO_INVINCIBILITY:
|
|
*toggle_value = m_optionsObject->m_useInvincibility;
|
|
break;
|
|
case MWO_UNLIMITEDAMMO:
|
|
*toggle_value = m_optionsObject->m_unlimmitedAmmo;
|
|
break;
|
|
case MWO_FRIENDLYFIRE:
|
|
*toggle_value = m_optionsObject->m_friendlyFire;
|
|
break;
|
|
case MWO_SPLASHDAMAGE:
|
|
*toggle_value = m_optionsObject->m_splashDamage;
|
|
break;
|
|
case MWO_WEAPONJAM:
|
|
*toggle_value = m_optionsObject->m_weaponJam;
|
|
break;
|
|
case MWO_AMMOBAYFIRE:
|
|
*toggle_value = m_optionsObject->m_ammobayFire;
|
|
break;
|
|
// MSL 5.05 Advance Mode
|
|
case MWO_ADVANCEMODE:
|
|
*toggle_value = m_optionsObject->m_advanceMode;
|
|
break;
|
|
// MSL 5.06 Armor Mode
|
|
case MWO_ARMORMODE:
|
|
*toggle_value = m_optionsObject->m_armorMode;
|
|
break;
|
|
case MWO_DEFAULTVIEW:
|
|
*toggle_value = m_optionsObject->m_defaultView;
|
|
break;
|
|
case MWO_BETTYSOUND:
|
|
*toggle_value = m_optionsObject->m_bettyOn;
|
|
break;
|
|
case MWO_AUDIOHARDWARE:
|
|
*toggle_value = m_optionsObject->m_audioHardware;
|
|
}
|
|
return 1;
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetOptionsToggleValue(void *data[], int count)
|
|
{
|
|
int toggle_id = (int)data[1];
|
|
int *toggle_value = INTARRAYPARAM(2);
|
|
Check_Object(m_optionsObject);
|
|
|
|
switch(toggle_id)
|
|
{
|
|
case MWO_HEAT:
|
|
m_optionsObject->m_useHeat = *toggle_value;
|
|
break;
|
|
case MWO_INVINCIBILITY:
|
|
m_optionsObject->m_useInvincibility = *toggle_value;
|
|
break;
|
|
case MWO_UNLIMITEDAMMO:
|
|
m_optionsObject->m_unlimmitedAmmo = *toggle_value;
|
|
break;
|
|
case MWO_FRIENDLYFIRE:
|
|
m_optionsObject->m_friendlyFire = *toggle_value;
|
|
break;
|
|
case MWO_SPLASHDAMAGE:
|
|
m_optionsObject->m_splashDamage = *toggle_value;
|
|
break;
|
|
case MWO_WEAPONJAM:
|
|
m_optionsObject->m_weaponJam = *toggle_value;
|
|
break;
|
|
case MWO_AMMOBAYFIRE:
|
|
m_optionsObject->m_ammobayFire = *toggle_value;
|
|
break;
|
|
// MSL 5.05 Advance Mode
|
|
case MWO_ADVANCEMODE:
|
|
m_optionsObject->m_advanceMode = *toggle_value;
|
|
break;
|
|
// MSL 5.06 Armor Mode
|
|
case MWO_ARMORMODE:
|
|
m_optionsObject->m_armorMode = *toggle_value;
|
|
break;
|
|
case MWO_DEFAULTVIEW:
|
|
m_optionsObject->m_defaultView = *toggle_value;
|
|
break;
|
|
case MWO_BETTYSOUND:
|
|
m_optionsObject->m_bettyOn = *toggle_value;
|
|
break;
|
|
case MWO_AUDIOHARDWARE:
|
|
m_optionsObject->m_audioHardware = *toggle_value;
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetOptionsSliderValue(void *data[], int count)
|
|
{
|
|
int slider_id = (int)data[1];
|
|
int *slider_value = INTARRAYPARAM(2);
|
|
|
|
Check_Object(m_optionsObject);
|
|
|
|
switch(slider_id)
|
|
{
|
|
case MWO_GAMMA:
|
|
*slider_value = (int)(m_optionsObject->m_gamma * 100);
|
|
break;
|
|
case MWO_BRIGHTNESS:
|
|
*slider_value = (int)(m_optionsObject->m_brightness * 100);
|
|
break;
|
|
case MWO_CONTRAST:
|
|
*slider_value = (int)(m_optionsObject->m_contrast * 100);
|
|
break;
|
|
case MWO_SFXVOLUME:
|
|
*slider_value = m_optionsObject->m_sfxVolume;
|
|
break;
|
|
case MWO_MUSICVOLUME:
|
|
*slider_value = m_optionsObject->m_musicVolume;
|
|
break;
|
|
default:
|
|
*slider_value = 50;
|
|
return -1;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetOptionsSliderValue(void *data[], int count)
|
|
{
|
|
int slider_id = (int)data[1];
|
|
int *slider_value = INTARRAYPARAM(2);
|
|
|
|
Check_Object(m_optionsObject);
|
|
|
|
switch(slider_id)
|
|
{
|
|
case MWO_GAMMA:
|
|
{
|
|
Min_Clamp(*slider_value, 1);
|
|
m_optionsObject->m_gamma = (Scalar)(*slider_value / 100.0f);
|
|
Scalar gamma = m_optionsObject->m_gamma * 1.7f + 0.8f;
|
|
gos_SetGammaValue(gamma);
|
|
break;
|
|
}
|
|
case MWO_BRIGHTNESS:
|
|
{
|
|
m_optionsObject->m_brightness = (Scalar)(*slider_value / 100.0f);
|
|
int brightness = (int)(m_optionsObject->m_brightness * 10000);
|
|
gos_SetBrightnessValue((DWORD) brightness );
|
|
break;
|
|
}
|
|
case MWO_CONTRAST:
|
|
{
|
|
m_optionsObject->m_contrast = (Scalar)(*slider_value / 100.0f);
|
|
int contrast = (int)(m_optionsObject->m_contrast * 20000);
|
|
gos_SetContrastValue((DWORD)contrast);
|
|
break;
|
|
}
|
|
case MWO_SFXVOLUME:
|
|
m_optionsObject->m_sfxVolume = *slider_value;
|
|
break;
|
|
case MWO_MUSICVOLUME:
|
|
m_optionsObject->m_musicVolume = *slider_value;
|
|
// ABL::g_MissionMusic = (slider_value != 0);
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetOptionsValue(void *data[], int count)
|
|
{
|
|
int option_id = (int)data[1];
|
|
int *option_value = INTARRAYPARAM(2);
|
|
|
|
Check_Object(m_optionsObject);
|
|
switch(option_id)
|
|
{
|
|
case MWO_DIFFICULTY:
|
|
m_optionsObject->m_difficultyLevel = *option_value;
|
|
break;
|
|
case MWO_SCREENRESOLUTION:
|
|
m_optionsObject->m_resolution = *option_value;
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetOptionsValue(void *data[], int count)
|
|
{
|
|
int option_id = (int)data[1];
|
|
int *option_value = INTARRAYPARAM(2);
|
|
|
|
Check_Object(m_optionsObject);
|
|
switch(option_id)
|
|
{
|
|
case MWO_DIFFICULTY:
|
|
*option_value = m_optionsObject->m_difficultyLevel;
|
|
break;
|
|
case MWO_SCREENRESOLUTION:
|
|
*option_value = m_optionsObject->m_resolution;
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SaveOptions()
|
|
{
|
|
if(m_optionsObject)
|
|
{
|
|
DynamicMemoryStream options_stream;
|
|
m_optionsObject->SaveToStream(&options_stream);
|
|
options_stream.Rewind();
|
|
Resource options_resource("{Player Options}", m_optionsFile);
|
|
Verify(options_resource.DoesResourceExist());
|
|
options_resource.Save(&options_stream, NULL);
|
|
|
|
DynamicMemoryStream control_stream;
|
|
g_ControlList->SaveList (control_stream);
|
|
control_stream.Rewind ();
|
|
Resource control_resource("{Control Options}", m_optionsFile);
|
|
Verify(control_resource.DoesResourceExist());
|
|
control_resource.Save(&control_stream, NULL);
|
|
|
|
m_optionsFile->Save();
|
|
|
|
MWApplication::GetInstance()->InitializeOptions(m_optionsObject);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::LoadDefaultOptions()
|
|
{
|
|
if(m_optionsObject)
|
|
{
|
|
DynamicMemoryStream options_stream;
|
|
MWOptions::ConstructOptionsStream(NULL, &options_stream);
|
|
options_stream.Rewind();
|
|
Resource options_resource("{Player Options}", m_optionsFile);
|
|
Verify(options_resource.DoesResourceExist());
|
|
options_resource.Save(&options_stream, NULL);
|
|
|
|
g_ControlList->LoadDefault ();
|
|
Resource control_resource("{Control Options}", m_optionsFile);
|
|
DynamicMemoryStream control_stream;
|
|
g_ControlList->SaveList (control_stream);
|
|
control_stream.Rewind ();
|
|
control_resource.Save (&control_stream,NULL);
|
|
|
|
|
|
m_optionsFile->Save();
|
|
delete m_optionsObject;
|
|
m_optionsObject = new MWOptions(&options_stream);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::AddBot(void *instance, int numParams, void* data[])
|
|
{
|
|
gosASSERT(!CTCL_IsConsole());
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
// Check to see if we have a full game
|
|
int bot_count = 0;
|
|
int player_count = 0;
|
|
for (int i = 0; i < MWApplication::Maximum_Lancemates; i++)
|
|
{
|
|
if (app->lancemateConnectionData[i].lancemateConnected)
|
|
bot_count++;
|
|
}
|
|
player_count = Network::GetInstance()->GetPlayerCount();
|
|
NetMissionParameters::MWNetMissionParameters *params = app->GetLocalNetParams();
|
|
if (params->m_runDedicated)
|
|
{
|
|
// Somehow dedicated server has a player_count of 1 even though there is no player in it
|
|
if ((player_count + bot_count - 1) >= params->m_maxPlayers)
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
if ((player_count + bot_count) >= params->m_maxPlayers)
|
|
return -1;
|
|
}
|
|
|
|
if (bot_count >= params->m_maxBots)
|
|
return -1;
|
|
|
|
int bot_number = app->GetNextLancemateID();
|
|
|
|
if (bot_number < 0)
|
|
return -1;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return -1;
|
|
|
|
app->lancemateConnectionData[bot_number].lancemateConnected = true;
|
|
app->lancemateConnectionData[bot_number].lancemateVehicleAccepted = false;
|
|
|
|
|
|
int diff_level = INTPARM(0);
|
|
const char *text = STRPARM(1);
|
|
const char *clan = STRPARM(2);
|
|
|
|
Str_Copy(app->lancemateConnectionData[bot_number].lancemateName, text, ELEMENTS(app->lancemateConnectionData[bot_number].lancemateName));
|
|
Str_Copy(app->lancemateConnectionData[bot_number].lancemateClan, clan, ELEMENTS(app->lancemateConnectionData[bot_number].lancemateClan));
|
|
|
|
switch (diff_level)
|
|
{
|
|
case 0:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\WussyBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 1:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\EasyBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 2:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\RookieDodgeBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 3:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\RookieSniperBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 4:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\RookieBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 5:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\DodgeBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 6:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SniperBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 7:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\KillerBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 8:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SlaughterBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 9:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\UberBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
default:
|
|
STOP(("INVALID BOT LEVEL <0-9> : %f ", diff_level));
|
|
}
|
|
|
|
Resource res("AIPlayers\\MechAI\\mechai.data");
|
|
|
|
Verify(res.DoesResourceExist());
|
|
|
|
app->lancemateConnectionData[bot_number].aiModel = res.GetResourceID();
|
|
|
|
ServerAdvertiser::AddPlayerAll(bot_number+256, text, true);
|
|
return bot_number;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::RemoveBot(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return -1;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return -1;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int pilotTeam = app->lancemateConnectionData[bot_number].pilotTeam;
|
|
app->lancemateConnectionData[bot_number].Disconnect();
|
|
|
|
ServerAdvertiser::RemovePlayerAll(bot_number+256, NULL, true);
|
|
|
|
// send a tally on team members to everyone
|
|
if (pilotTeam != MWApplication::No_Team)
|
|
{
|
|
char* message = app->GetTeamCount();
|
|
if (message)
|
|
{
|
|
app->SendChat(
|
|
Connection::Local->GetID(),
|
|
MWApplication::SystemBroadcast,
|
|
0,
|
|
message);
|
|
delete [] message;
|
|
}
|
|
}
|
|
|
|
app->ReverifyDeniedVehicles();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::RemoveAllBots(void *instance, int numParams, void* data[])
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
for (int i = 0; i < MWApplication::Maximum_Lancemates; i++) {
|
|
|
|
app->lancemateConnectionData[i].Disconnect();
|
|
ServerAdvertiser::RemovePlayerAll(i+256, NULL, true);
|
|
}
|
|
// no need to send a tally on team members to clients because
|
|
// the only case RemoveAllBots() is called is when the server
|
|
// changes map. That means all team will be reset as well.
|
|
|
|
|
|
app->ReverifyDeniedVehicles();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::SetTeamBot(void *instance, int numParams, void* data[])
|
|
{
|
|
gosASSERT(!CTCL_IsConsole());
|
|
int bot_number = INTPARM(0);
|
|
int team_number = INTPARM(1);
|
|
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
if (team_number < 0)
|
|
return 0;
|
|
if (team_number > 8)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
app->RequestLancemateTeam(bot_number, team_number);
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::SetMechBot(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
int bot_number = INTPARM(0);
|
|
int mech_index = INTPARM(1);
|
|
const char *mech_name = STRPARM(2);
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
ResourceID mech_id;
|
|
|
|
mech_id = MW4Shell::Instance->m_mechIDs[mech_index];
|
|
|
|
MString resource_file;
|
|
if(mech_id == ResourceID::Null)
|
|
{
|
|
//
|
|
//-----------------------------------------------------------------
|
|
//This means that we have a user made mech in its own resource file
|
|
//-----------------------------------------------------------------
|
|
//
|
|
resource_file = "Resource\\Variants\\";
|
|
resource_file += mech_name;
|
|
resource_file += ".mw4";
|
|
}
|
|
app->RequestLancemateMech(bot_number, mech_id, resource_file);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotValid(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
return app->lancemateConnectionData[bot_number].lancemateConnected;
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotName(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
if (!app->lancemateConnectionData[bot_number].lancemateConnected)
|
|
return 0;
|
|
|
|
if (*((char **)data[1])) gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(256);
|
|
strcpy(*((char **) data[1]), app->lancemateConnectionData[bot_number].lancemateName);
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotClan(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
if (!app->lancemateConnectionData[bot_number].lancemateConnected)
|
|
return 0;
|
|
|
|
if (*((char **)data[1])) gos_Free(*((char **)data[1]));
|
|
*((char **) data[1]) = (char *)gos_Malloc(256);
|
|
strcpy(*((char **) data[1]), app->lancemateConnectionData[bot_number].lancemateClan);
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotChasis(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return M_CameraShip;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return M_CameraShip;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
if (app->lancemateConnectionData[bot_number].mechChasisID == EmptyMechID)
|
|
return M_CameraShip;
|
|
|
|
return app->lancemateConnectionData[bot_number].mechChasisID;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotTeam(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
return app->lancemateConnectionData[bot_number].pilotTeam;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::GetBotVehicleAccepted(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
int bot_number = INTPARM(0);
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
return app->lancemateConnectionData[bot_number].lancemateVehicleAccepted;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int _stdcall MW4Shell::FillTeams(void *instance, int numParams, void* data[])
|
|
{
|
|
|
|
int* botIds = INTARRAYPARAM(0);
|
|
int* mechIds = INTARRAYPARAM(1);
|
|
|
|
return FillBotsForAllTeams(botIds, mechIds);
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::GetTimeToLaunch(void *instance, int numParams, void* data[])
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int *seconds = INTARRAYPARAM(0);
|
|
*seconds = 0;
|
|
|
|
if (!app->recycleTimer)
|
|
return 0;
|
|
|
|
|
|
*seconds = (int)app->recycleTimerVal;
|
|
|
|
return 1;
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::GetTimeToLaunchLock(void *instance, int numParams, void* data[])
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int *seconds = INTARRAYPARAM(0);
|
|
*seconds = 0;
|
|
|
|
|
|
if (!app->lockTimer)
|
|
return 0;
|
|
|
|
*seconds = (int)app->lockTimerVal;
|
|
|
|
return 1;
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::GetTimeToGameEnd(void *instance, int numParams, void* data[])
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int *seconds = INTARRAYPARAM(0);
|
|
*seconds = 0;
|
|
|
|
|
|
if (!app->gameTimer)
|
|
return 0;
|
|
|
|
*seconds = (int)app->gameTimerVal;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int _stdcall MW4Shell::GetNetworkError(void *instance, int numParams, void* data[])
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
return app->networkExitCode;
|
|
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::DoesHavePilotLoaded(void *data[], int count)
|
|
{
|
|
int *does_have_pilot = INTARRAYPARAM(1);
|
|
|
|
*does_have_pilot = 0;
|
|
if(m_optionsObject)
|
|
*does_have_pilot = 1;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetIAMissionType(void *data[], int count)
|
|
{
|
|
int *ia_mission_type = INTARRAYPARAM(1);
|
|
|
|
ia_gameType = *ia_mission_type;
|
|
MWApplication::GetInstance()->m_isMasterTrial = false;
|
|
MWApplication::GetInstance()->m_iaDisplayGameType = ia_gameType;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
|
|
NetMissionParameters::MWNetMissionParameters *net_params = MWApplication::GetInstance()->GetLocalNetParams();
|
|
if((ia_gameType == IA_WAVEBATTLE) || (ia_gameType == IA_MASTERTRIAL))
|
|
{
|
|
|
|
MWApplication::GetInstance()->servedConnectionData[1].pilotTeam = 0;
|
|
|
|
//This is seven to accomadate clearing out all lances and all bots just to make sure.
|
|
for(int i=0; i<7; i++)
|
|
{
|
|
app->lancemateConnectionData[i].lancemateConnected = false;
|
|
}
|
|
net_params->m_teamAllowed = true;
|
|
net_params->m_teamCount = 2;
|
|
m_lancePerWave = 0;
|
|
m_botsPerWave = 0;
|
|
|
|
if(ia_gameType == IA_MASTERTRIAL)
|
|
MWApplication::GetInstance()->m_isMasterTrial = true;
|
|
}
|
|
else
|
|
{
|
|
MWApplication::GetInstance()->servedConnectionData[1].pilotTeam = MWApplication::No_Team;
|
|
|
|
//This is seven to accomadate clearing out all lances and all bots just to make sure.
|
|
for(int i=0; i<7; i++)
|
|
{
|
|
app->lancemateConnectionData[i].lancemateConnected = false;
|
|
}
|
|
net_params->m_teamAllowed = false;
|
|
net_params->m_teamCount = 0;
|
|
m_lancePerWave = 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetIALancemate(void *data[], int count)
|
|
{
|
|
int *lance_id = INTARRAYPARAM(1);
|
|
int *ai_id = INTARRAYPARAM(2);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int bot_number = *lance_id + MWApplication::LanceConnectionStart;
|
|
|
|
if (bot_number < 0)
|
|
return -1;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return -1;
|
|
|
|
|
|
if(app->lancemateConnectionData[bot_number].lancemateConnected == false)
|
|
{
|
|
Verify(m_lancePerWave < 3);
|
|
m_lancePerWave ++;
|
|
}
|
|
app->lancemateConnectionData[bot_number].lancemateConnected = true;
|
|
//app->lancemateConnectionData[bot_number].lancemateVehicleAccepted = false;
|
|
app->lancemateConnectionData[bot_number].buildName = true;
|
|
if(ia_gameType == IA_WAVEBATTLE)
|
|
app->lancemateConnectionData[bot_number].pilotTeam = 0;
|
|
|
|
char text[128];
|
|
sprintf(text, "%d", bot_number);
|
|
Str_Copy(app->lancemateConnectionData[bot_number].lancemateName, text, ELEMENTS(app->lancemateConnectionData[bot_number].lancemateName));
|
|
|
|
switch (*ai_id)
|
|
{
|
|
case 0:
|
|
app->lancemateConnectionData[bot_number].lancemateConnected = false;
|
|
m_lancePerWave --;
|
|
break;
|
|
case 1:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\RookieSniperBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 2:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SniperBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 3:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\UberBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
}
|
|
|
|
Resource res("AIPlayers\\MechAI\\mechai.data");
|
|
|
|
Verify(res.DoesResourceExist());
|
|
|
|
app->lancemateConnectionData[bot_number].aiModel = res.GetResourceID();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetIALancemateMech(void *data[], int count)
|
|
{
|
|
int *lance_id = INTARRAYPARAM(1);
|
|
int *mech_index = INTARRAYPARAM(2);
|
|
char **mech_name =&STRPARM(3);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int bot_number = *lance_id + MWApplication::LanceConnectionStart;
|
|
|
|
if (bot_number < 0)
|
|
return -1;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return -1;
|
|
|
|
ResourceID mech_id = MW4Shell::Instance->m_mechIDs[*mech_index - 1];
|
|
|
|
MString resource_file;
|
|
if(mech_id == ResourceID::Null)
|
|
{
|
|
resource_file = "Resource\\Variants\\";
|
|
resource_file += *mech_name;
|
|
resource_file += ".mw4";
|
|
}
|
|
app->RequestLancemateMech(bot_number, mech_id, resource_file);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetWaveMissions(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWCampaign::WaveInstance);
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *num_missions = INTARRAYPARAM(2);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::WaveInstance->m_missions);
|
|
|
|
CampaignMissionPlug * mission;
|
|
int i = 0;
|
|
while(((mission = iterator.ReadAndNext()) != NULL) && (i < MAX_MISSIONS))
|
|
{
|
|
if(mission->m_status > 0)
|
|
{
|
|
Check_Object(mission);
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(256);
|
|
MString mission_name;
|
|
mission_name = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
mission_name.StripDirectory().StripExtension();
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mission_name,
|
|
mission_name.GetLength() + 1
|
|
);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
*num_missions = i;
|
|
gos_PopCurrentHeap();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetWaveMission(void *data[], int count)
|
|
{
|
|
int *mission_index = INTARRAYPARAM(1);
|
|
int *mission_id = INTARRAYPARAM(2);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::WaveInstance->m_missions);
|
|
|
|
*mission_id = -1;
|
|
//We are less then so we are in the chain
|
|
CampaignMissionPlug *mission = iterator.GetNth(*mission_index);
|
|
Check_Object(mission);
|
|
|
|
MString mission_path_name = mission->m_missionName;
|
|
mission_path_name.StripDirectory();
|
|
mission_path_name.StripExtension();
|
|
|
|
Str_Copy(m_iaMissionName, (char *)mission_path_name, 128);
|
|
MWApplication::GetInstance()->m_currentMissionName = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
*mission_id = mission->m_displayNameIndex;
|
|
|
|
MWApplication::GetInstance()->m_isNight = false;
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::AddMechToEnemyAI(void *data[], int count)
|
|
{
|
|
int *bot_index = INTARRAYPARAM(1);
|
|
int *mech_index = INTARRAYPARAM(2);
|
|
char **mech_name =&STRPARM(3);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int bot_number = MWApplication::BotConnectionStart + *bot_index;
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
if(*mech_index == 0)
|
|
{
|
|
//Here we need to clear out the mech that was there...we selected a blank
|
|
app->lancemateConnectionData[bot_number].lancemateConnected = false;
|
|
m_botsPerWave --;
|
|
return 1;
|
|
}
|
|
//This minus one is because the first entry is blank
|
|
|
|
//Ok first we have to make sure we are setup as an ai
|
|
if(app->lancemateConnectionData[bot_number].lancemateConnected == false)
|
|
{
|
|
m_botsPerWave ++;
|
|
Verify(m_botsPerWave <= 4);
|
|
}
|
|
app->lancemateConnectionData[bot_number].lancemateConnected = true;
|
|
app->lancemateConnectionData[bot_number].lancemateVehicleAccepted = false;
|
|
app->lancemateConnectionData[bot_number].buildName = true;
|
|
app->lancemateConnectionData[bot_number].pilotTeam = 1;
|
|
|
|
char text[128];
|
|
sprintf(text, "%d", bot_number);
|
|
Str_Copy(app->lancemateConnectionData[bot_number].lancemateName, text, ELEMENTS(app->lancemateConnectionData[bot_number].lancemateName));
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\KillerBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
|
|
Resource res("AIPlayers\\MechAI\\mechai.data");
|
|
|
|
Verify(res.DoesResourceExist());
|
|
|
|
app->lancemateConnectionData[bot_number].aiModel = res.GetResourceID();
|
|
|
|
//Second we need assign the mech
|
|
ResourceID mech_id = MW4Shell::Instance->m_mechIDs[*mech_index - 1];
|
|
MString resource_file;
|
|
if(mech_id == ResourceID::Null)
|
|
{
|
|
resource_file = "Resource\\Variants\\";
|
|
resource_file += *mech_name;
|
|
resource_file += ".mw4";
|
|
}
|
|
|
|
app->RequestLancemateMech(bot_number, mech_id, resource_file);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetEnemyMechChassis(void *data[], int count)
|
|
{
|
|
int *bot_number = INTARRAYPARAM(1);
|
|
int *chassis_id = INTARRAYPARAM(2);
|
|
|
|
if (*bot_number < 0)
|
|
*chassis_id = -1;
|
|
if (*bot_number >= MWApplication::Maximum_Lancemates)
|
|
*chassis_id = -1;
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
|
|
*chassis_id = app->lancemateConnectionData[*bot_number].mechChasisID;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::RemoveEnemyAIFromWave(void *data[], int count)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetWaveAITypes(void *data[], int count)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetMechsWithSpace(void* data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *stock_array = INTARRAYPARAM(2);
|
|
|
|
SortedChainOf<PlugOf<MString>*, MString> alpha_mech_names(NULL, true);
|
|
MString* alpha_mech_names_with_mc = new MString[m_mechCount];
|
|
|
|
FREEANDNULL(name_array[0]);
|
|
name_array[0] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
name_array[0],
|
|
(const char *)" ",
|
|
3
|
|
);
|
|
stock_array[0] = 1;
|
|
|
|
MWTable::TableIterator *mech_iterator;
|
|
Check_Object(MWApplication::GetInstance()->m_mechTable);
|
|
|
|
mech_iterator = MWApplication::GetInstance()->m_mechTable->MakeTableIterator();
|
|
MWTableEntry *mech_entry;
|
|
while((mech_entry = mech_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mech_entry);
|
|
PlugOf<MString> *name_plug = new PlugOf<MString>(mech_entry->GetEntryName());
|
|
alpha_mech_names.AddValue(name_plug, mech_entry->GetEntryName());
|
|
}
|
|
|
|
delete mech_iterator;
|
|
|
|
Stuff::MString mechs_path = "Resource\\Variants\\*.mw4";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(mechs_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
MString mech_name;
|
|
mech_name = file_name;
|
|
mech_name.StripDirectory().StripExtension();
|
|
|
|
PlugOf<MString> *name_plug = new PlugOf<MString>(mech_name);
|
|
alpha_mech_names.AddValue(name_plug, mech_name);
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
|
|
// Sort Mad Cat correctly
|
|
SortedChainIteratorOf<PlugOf<MString> *, MString> mech_name_iterator(&alpha_mech_names);
|
|
PlugOf<MString> *mstring_plug;
|
|
int mech_index = 0;
|
|
while((mstring_plug = mech_name_iterator.ReadAndNext()) != NULL)
|
|
{
|
|
if (mech_index == m_mechCount)
|
|
break; // Boundary Check
|
|
|
|
alpha_mech_names_with_mc[mech_index] = mstring_plug->GetItem();
|
|
mech_index ++;
|
|
}
|
|
int mc2_start = 0;
|
|
while (_strnicmp(alpha_mech_names_with_mc[mc2_start], "Mad Cat MKII", 12) != 0)
|
|
{
|
|
mc2_start++;
|
|
}
|
|
int mc2_end = mc2_start;
|
|
while (_strnicmp(alpha_mech_names_with_mc[mc2_end], "Mad Cat MKII", 12) == 0)
|
|
{
|
|
mc2_end++;
|
|
}
|
|
int mc_end = mc2_end;
|
|
while (_strnicmp(alpha_mech_names_with_mc[mc_end], "Mad Cat", 7) == 0)
|
|
{
|
|
mc_end++;
|
|
}
|
|
int mc2_i = mc2_end - mc2_start;
|
|
int mc_i = mc_end - mc2_end;
|
|
MString* mc2_string = new MString[mc2_i];
|
|
for (int i = 0; i < mc2_i; i++)
|
|
mc2_string[i] = alpha_mech_names_with_mc[mc2_start + i];
|
|
for (i = 0; i < mc_i; i++)
|
|
alpha_mech_names_with_mc[mc2_start + i] = alpha_mech_names_with_mc[mc2_end + i];
|
|
for (i = 0; i < mc2_i; i++)
|
|
alpha_mech_names_with_mc[mc2_start + mc_i + i] = mc2_string[i];
|
|
delete [] mc2_string;
|
|
|
|
// now return the sorted strings
|
|
mech_index = 0;
|
|
while (mech_index < m_mechCount)
|
|
{
|
|
MString alpha_names = alpha_mech_names_with_mc[mech_index];
|
|
FREEANDNULL(name_array[mech_index + 1]);
|
|
name_array[mech_index + 1] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
name_array[mech_index + 1],
|
|
(const char *)alpha_names,
|
|
alpha_names.GetLength() + 1
|
|
);
|
|
|
|
MWTableEntry *mech_table_entry = MWApplication::GetInstance()->m_mechTable->FindEntry(alpha_names);
|
|
if(mech_table_entry)
|
|
stock_array[mech_index + 1] = 1;
|
|
else
|
|
stock_array[mech_index + 1] = 0;
|
|
mech_index ++;
|
|
}
|
|
|
|
alpha_mech_names.DeletePlugs();
|
|
delete [] alpha_mech_names_with_mc;
|
|
delete resource_directory;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetEnemyWaveCount(void *data[], int count)
|
|
{
|
|
int *wave_count = INTARRAYPARAM(1);
|
|
|
|
if(*wave_count == 5)
|
|
m_waves = -1; //Unlimmited
|
|
else
|
|
m_waves = *wave_count + 1;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetEnemyCount(void *data[], int count)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetWavePlayerRespawns(void *data[], int count)
|
|
{
|
|
int *player_lives = INTARRAYPARAM(1);
|
|
|
|
if(*player_lives == 5)
|
|
m_playerLives = -1; //Unlimmited!
|
|
else
|
|
m_playerLives = *player_lives + 1;
|
|
return 1;
|
|
}
|
|
|
|
//Training Support
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetTrainingMissions(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWCampaign::TrainingInstance);
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *num_missions = INTARRAYPARAM(2);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::TrainingInstance->m_missions);
|
|
|
|
CampaignMissionPlug * mission;
|
|
int i = 0;
|
|
while(((mission = iterator.ReadAndNext()) != NULL) && (i < MAX_MISSIONS))
|
|
{
|
|
if(mission->m_status > 0)
|
|
{
|
|
Check_Object(mission);
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(256);
|
|
MString mission_name;
|
|
mission_name = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
mission_name.StripDirectory().StripExtension();
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mission_name,
|
|
mission_name.GetLength() + 1
|
|
);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
*num_missions = i;
|
|
gos_PopCurrentHeap();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetTrainingMission(void *data[], int count)
|
|
{
|
|
int *mission_index = INTARRAYPARAM(1);
|
|
int *mission_id = INTARRAYPARAM(2);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::TrainingInstance->m_missions);
|
|
|
|
*mission_id = -1;
|
|
//We are less then so we are in the chain
|
|
CampaignMissionPlug *mission = iterator.GetNth(*mission_index);
|
|
Check_Object(mission);
|
|
|
|
MString mission_path_name = mission->m_missionName;
|
|
mission_path_name.StripDirectory();
|
|
mission_path_name.StripExtension();
|
|
|
|
Str_Copy(m_iaMissionName, (char *)mission_path_name, 128);
|
|
MWApplication::GetInstance()->m_currentMissionName = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
*mission_id = mission->m_displayNameIndex;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetIAMissionName(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
char **mission_name = &STRPARM(1);
|
|
int *mission_index = INTARRAYPARAM(2);
|
|
int *mission_id = INTARRAYPARAM(3);
|
|
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::Instance->m_missions);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
for (int i = 0; i < MWApplication::Maximum_Lancemates; ++i)
|
|
{
|
|
app->lancemateConnectionData[i].Recycle();
|
|
}
|
|
|
|
*mission_id = -1;
|
|
if(*mission_index < iterator.GetSize())
|
|
{
|
|
//We are less then so we are in the chain
|
|
CampaignMissionPlug *mission = iterator.GetNth(*mission_index);
|
|
Check_Object(mission);
|
|
|
|
MString mission_path_name = mission->m_missionName;
|
|
mission_path_name.StripDirectory();
|
|
mission_path_name.StripExtension();
|
|
|
|
Str_Copy(m_iaMissionName, (char *)mission_path_name, 128);
|
|
MWApplication::GetInstance()->m_currentMissionName = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
*mission_id = mission->m_displayNameIndex;
|
|
|
|
MWApplication::GetInstance()->m_isNight = false;
|
|
}
|
|
else
|
|
{
|
|
MString user_mission_name = "UserMissions\\";
|
|
user_mission_name += *mission_name;
|
|
Str_Copy(m_iaMissionName, (char *)user_mission_name, 256);
|
|
MWApplication::GetInstance()->m_currentMissionName = m_iaMissionName;
|
|
MWApplication::GetInstance()->m_isNight = false;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::ShellIAGetMapInfo(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
int *mission_index = INTARRAYPARAM(1);
|
|
char **map_name = &STRPARM(2);
|
|
int *does_have_map = INTARRAYPARAM(3);
|
|
int *num_lancemates = INTARRAYPARAM(4);
|
|
int *allow_time = INTARRAYPARAM(5);
|
|
|
|
*allow_time = 1;
|
|
switch(ia_gameType)
|
|
{
|
|
case IA_MISSIONSELECTION:
|
|
{
|
|
|
|
if(*mission_index > -1)
|
|
{
|
|
CampaignMissionPlug *mission_plug = MWCampaign::Instance->FindMission(*mission_index);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
FREEANDNULL(*map_name);
|
|
*map_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*map_name,
|
|
(const char *)interface_plug->GetMapTextureName(),
|
|
interface_plug->GetMapTextureName().GetLength() + 1
|
|
);
|
|
|
|
*num_lancemates = mission_plug->m_NumLancemates;
|
|
*does_have_map = 1;
|
|
*allow_time = mission_plug->m_canChangeTime;
|
|
|
|
delete interface_plug;
|
|
}
|
|
else
|
|
{
|
|
*does_have_map = 0;
|
|
*num_lancemates = 3;
|
|
}
|
|
break;
|
|
}
|
|
case IA_WAVEBATTLE:
|
|
{
|
|
if(*mission_index > -1)
|
|
{
|
|
CampaignMissionPlug *mission_plug = MWCampaign::WaveInstance->FindMission(*mission_index);
|
|
Check_Object(mission_plug);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
FREEANDNULL(*map_name);
|
|
*map_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*map_name,
|
|
(const char *)interface_plug->GetMapTextureName(),
|
|
interface_plug->GetMapTextureName().GetLength() + 1
|
|
);
|
|
|
|
*num_lancemates = 3;
|
|
*allow_time = mission_plug->m_canChangeTime;
|
|
if(interface_plug->GetMapTextureName())
|
|
*does_have_map = 1;
|
|
else
|
|
*does_have_map = 0;
|
|
|
|
delete interface_plug;
|
|
}
|
|
break;
|
|
}
|
|
case IA_TRAININGMISSION:
|
|
{
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::TrainingInstance->m_missions);
|
|
|
|
//We are less then so we are in the chain
|
|
CampaignMissionPlug *mission_plug = iterator.GetNth(0);
|
|
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
FREEANDNULL(*map_name);
|
|
*map_name = (char *)gos_Malloc(256);
|
|
|
|
Str_Copy(
|
|
*map_name,
|
|
(const char *)interface_plug->GetMapTextureName(),
|
|
interface_plug->GetMapTextureName().GetLength() + 1
|
|
);
|
|
|
|
*allow_time = mission_plug->m_canChangeTime;
|
|
*num_lancemates = 0;
|
|
*does_have_map = 1;
|
|
|
|
delete interface_plug;
|
|
break;
|
|
}
|
|
case IA_MASTERTRIAL:
|
|
{
|
|
*does_have_map = 0;
|
|
*num_lancemates = 0;
|
|
break;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetDifficulty(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
int *difficulty_level = INTARRAYPARAM(1);
|
|
|
|
*difficulty_level = MWApplication::GetInstance()->GetDifficultyLevel();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IASetDifficulty(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
int *difficulty_level = INTARRAYPARAM(1);
|
|
|
|
MWApplication::GetInstance()->SetDifficultyLevel(*difficulty_level);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetWavePlayerRespawns(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
int *player_respawns = INTARRAYPARAM(1);
|
|
|
|
if(m_playerLives == -1)
|
|
*player_respawns = 5; //Unlimmited
|
|
else
|
|
*player_respawns = m_playerLives - 1;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetEnemyWaveCount(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
int *waves = INTARRAYPARAM(1);
|
|
|
|
if(m_waves == -1)
|
|
*waves = 5; //Unlimmited
|
|
else
|
|
*waves = m_waves - 1;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IASetupMasterTrials(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
int *mission_index = INTARRAYPARAM(1);
|
|
int *mission_id = INTARRAYPARAM(2);
|
|
int *mech_1_index = INTARRAYPARAM(3);
|
|
int *mech_2_index = INTARRAYPARAM(4);
|
|
int *mech_3_index = INTARRAYPARAM(5);
|
|
int *time = INTARRAYPARAM(6);
|
|
char **map_name = &STRPARM(7);
|
|
|
|
|
|
//THIS IS TO FAKE THE SYSTEM!
|
|
ia_gameType = IA_WAVEBATTLE;
|
|
|
|
m_playerLives = 3;
|
|
|
|
//First Setup the mission
|
|
Check_Object(MWCampaign::MasterTrialsInstance);
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::MasterTrialsInstance->m_missions);
|
|
|
|
*mission_id = -1;
|
|
//We are less then so we are in the chain
|
|
CampaignMissionPlug *mission = iterator.GetNth(*mission_index);
|
|
Check_Object(mission);
|
|
|
|
Resource mission_region(mission->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
FREEANDNULL(*map_name);
|
|
*map_name = (char *)gos_Malloc(128);
|
|
|
|
Str_Copy(
|
|
*map_name,
|
|
(const char *)interface_plug->GetMapTextureName(),
|
|
interface_plug->GetMapTextureName().GetLength() + 1
|
|
);
|
|
|
|
MString mission_path_name = mission->m_missionName;
|
|
mission_path_name.StripDirectory();
|
|
mission_path_name.StripExtension();
|
|
|
|
Str_Copy(m_iaMissionName, (char *)mission_path_name, 128);
|
|
MWApplication::GetInstance()->m_currentMissionName = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
|
|
*mission_id = mission->m_displayNameIndex;
|
|
//Next we need to setup 3 mechs...
|
|
SetUpMasterMech(0, *mech_1_index);
|
|
SetUpMasterMech(1, *mech_2_index);
|
|
SetUpMasterMech(2, *mech_3_index);
|
|
|
|
//Last setup the time of day
|
|
switch(*time)
|
|
{
|
|
case 0:
|
|
MWApplication::GetInstance()->m_isNight = false;
|
|
break;
|
|
default:
|
|
MWApplication::GetInstance()->m_isNight = true;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetMasterTrialMissions(void *data[], int count)
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(MWCampaign::MasterTrialsInstance);
|
|
gos_PushCurrentHeap(MechWarrior4::Heap);
|
|
|
|
char **name_array = STRARRAYPARAM(1);
|
|
int *num_missions = INTARRAYPARAM(2);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&MWCampaign::MasterTrialsInstance->m_missions);
|
|
|
|
CampaignMissionPlug * mission;
|
|
int i = 0;
|
|
while(((mission = iterator.ReadAndNext()) != NULL) && (i < MAX_MISSIONS))
|
|
{
|
|
if(mission->m_status > 0)
|
|
{
|
|
Check_Object(mission);
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char *)gos_Malloc(128);
|
|
MString mission_name;
|
|
mission_name = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
mission_name.StripDirectory().StripExtension();
|
|
Str_Copy(
|
|
name_array[i],
|
|
(const char *)mission_name,
|
|
mission_name.GetLength() + 1
|
|
);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
*num_missions = i;
|
|
gos_PopCurrentHeap();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::SetMasterTrialPlayerMech(void *data[], int count)
|
|
{
|
|
//For right now we are going to just create a known mech
|
|
|
|
int mech_index = INTPARM(1);
|
|
m_mechID = m_stockMechIDs[mech_index];
|
|
const char *mech_name = STRPARM(2);
|
|
//const char *skin_name = STRPARM(3);
|
|
|
|
if(m_mechID == ResourceID::Null)
|
|
{
|
|
//
|
|
//-----------------------------------------------------------------
|
|
//This means that we have a user made mech in its own resource file
|
|
//-----------------------------------------------------------------
|
|
//
|
|
m_mechResourceFile = "Resource\\Variants\\";
|
|
m_mechResourceFile += mech_name;
|
|
m_mechResourceFile += ".mw4";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void MW4Shell::SetUpMasterMech(int bot_index, int mech_index)
|
|
{
|
|
Check_Pointer(this);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
int bot_number = MWApplication::BotConnectionStart + bot_index;
|
|
|
|
if (bot_number < 0)
|
|
return;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return;
|
|
|
|
//This minus one is because the first entry is blank
|
|
|
|
//Ok first we have to make sure we are setup as an ai
|
|
if(app->lancemateConnectionData[bot_number].lancemateConnected == false)
|
|
{
|
|
m_botsPerWave ++;
|
|
Verify(m_botsPerWave < 4);
|
|
}
|
|
app->lancemateConnectionData[bot_number].lancemateConnected = true;
|
|
app->lancemateConnectionData[bot_number].lancemateVehicleAccepted = false;
|
|
app->lancemateConnectionData[bot_number].buildName = true;
|
|
app->lancemateConnectionData[bot_number].pilotTeam = 1;
|
|
|
|
char text[128];
|
|
sprintf(text, "%d", bot_number);
|
|
Str_Copy(app->lancemateConnectionData[bot_number].lancemateName, text, ELEMENTS(app->lancemateConnectionData[bot_number].lancemateName));
|
|
|
|
switch(MWApplication::GetInstance()->GetDifficultyLevel())
|
|
{
|
|
case 0:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SniperBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 1:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\KillerBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 2:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SlaughterBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
default:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\UberBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
}
|
|
|
|
Resource res("AIPlayers\\MechAI\\mechai.data");
|
|
|
|
Verify(res.DoesResourceExist());
|
|
|
|
app->lancemateConnectionData[bot_number].aiModel = res.GetResourceID();
|
|
|
|
//Second we need assign the mech
|
|
Clamp(mech_index, 0, LastMechID);
|
|
ResourceID mech_id = MW4Shell::Instance->m_stockMechIDs[mech_index];
|
|
|
|
MString resource_file;
|
|
app->RequestLancemateMech(bot_number, mech_id, resource_file);
|
|
|
|
}
|
|
|
|
|
|
|
|
//========================================================================
|
|
//========================================================================
|
|
#define UNUSED(x) (x)=(x)
|
|
SCRIPTCALLBACK(EnterMultiplayerOptionsScreen)
|
|
{
|
|
gosASSERT(args == 10);
|
|
|
|
char ** szName = (char **)arg[0];
|
|
char ** szTeam = (char **)arg[1];
|
|
int * nPassToggle = (int *)arg[2];
|
|
char ** szPass = (char **)arg[3];
|
|
int * nPlayerI = (int *)arg[4];
|
|
int * nTeamI = (int *)arg[5];
|
|
char ** szInsignia = (char **)arg[6];
|
|
char ** szInsigniaFull = (char **)arg[7];
|
|
int * nInsigTotal = (int *)arg[8];
|
|
int * nAllowDecal = (int *)arg[9];
|
|
|
|
UNUSED(szInsignia);
|
|
//UNUSED(szInsigniaFull);
|
|
//UNUSED(nInsigTotal);
|
|
|
|
FREE_PTR(*szName);
|
|
FREE_PTR(*szTeam);
|
|
FREE_PTR(*szPass);
|
|
|
|
*szName = (char *)gos_Malloc(256);
|
|
*szTeam = (char *)gos_Malloc(256);
|
|
*szPass = (char *)gos_Malloc(256);
|
|
|
|
char *s;
|
|
|
|
//
|
|
// prepare to read from options file
|
|
//
|
|
NotationFile startup_ini(OPTIONS_INI, NotationFile::Standard, true);
|
|
Page *page = startup_ini.FindPage(OPTIONS_SECTION);
|
|
if (!page)
|
|
page = startup_ini.AddPage(OPTIONS_SECTION);
|
|
|
|
#if 0
|
|
// player name
|
|
if (page && page->GetEntry(OPTION_PLAYERNAME, (const char **)&s, false))
|
|
strcpy(*szName, s);
|
|
else
|
|
strcpy(*szName, MWApplication::GetInstance()->m_pilotName);
|
|
|
|
// team name
|
|
if (page && page->GetEntry(OPTION_TEAMNAME, (const char **)&s, false))
|
|
strcpy(*szTeam, s);
|
|
else
|
|
strcpy(*szTeam, "Default Team");
|
|
|
|
// password
|
|
if (page && page->GetEntry(OPTION_PASSWORD, (const char **)&s, false))
|
|
strcpy(*szPass, s);
|
|
else
|
|
strcpy(*szPass, "");
|
|
|
|
// other
|
|
if (page && page->GetEntry(OPTION_USEPASSWORD, (const char **)&s, false))
|
|
*nPassToggle = *s=='y' || *s=='Y';
|
|
else
|
|
*nPassToggle = 0;
|
|
#else
|
|
(*szName)[0]=0;
|
|
(*szTeam)[0]=0;
|
|
(*szPass)[0]=0;
|
|
|
|
char *p;
|
|
p=(char *)MW4Shell::Instance->m_optionsObject->m_playerName;
|
|
if (p) strcpy(*szName, p);
|
|
p=(char *)MW4Shell::Instance->m_optionsObject->m_teamName;
|
|
if (p) strcpy(*szTeam, p);
|
|
p=(char *)MW4Shell::Instance->m_optionsObject->m_password;
|
|
if (p) strcpy(*szPass, p);
|
|
|
|
if (szPass[0][0])
|
|
*nPassToggle = 1;
|
|
else
|
|
*nPassToggle = 0;
|
|
|
|
#endif
|
|
|
|
if (page && page->GetEntry(OPTION_PLAYERICON, (const char **)&s, false))
|
|
{
|
|
//
|
|
// we've got the name of a file, check to see what index it
|
|
// is in the list
|
|
//
|
|
for (*nPlayerI=0 ; *nPlayerI<*nInsigTotal ; (*nPlayerI)++)
|
|
{
|
|
if (!stricmp(s, szInsigniaFull[*nPlayerI]))
|
|
break;
|
|
}
|
|
if (*nPlayerI == *nInsigTotal)
|
|
*nPlayerI = 0;
|
|
}
|
|
else
|
|
*nPlayerI = 0;
|
|
|
|
if (page && page->GetEntry(OPTION_TEAMICON, (const char **)&s, false))
|
|
{
|
|
//
|
|
// we've got the name of a file, check to see what index it
|
|
// is in the list
|
|
//
|
|
for (*nTeamI=0 ; *nTeamI<*nInsigTotal ; (*nTeamI)++)
|
|
{
|
|
if (!stricmp(s, szInsigniaFull[*nTeamI]))
|
|
break;
|
|
}
|
|
if (*nTeamI == *nInsigTotal)
|
|
*nTeamI = 0;
|
|
}
|
|
else
|
|
*nTeamI = 0;
|
|
|
|
Page *page2 = startup_ini.FindPage(OPTIONS_SERVER_SECTION);
|
|
|
|
if (page2 && page2->GetEntry(OPTION_ALLOWDECALTRANSFER, (const char **)&s, false))
|
|
*nAllowDecal = atoi(s);
|
|
else
|
|
*nAllowDecal = 0;
|
|
|
|
#if 0
|
|
if (true)
|
|
{
|
|
int iDecalCount;
|
|
void *args[2];
|
|
char **pszFullNames;
|
|
|
|
iDecalCount = MW4Shell::GetDecalCount(NULL, 0, NULL);
|
|
pszFullNames = (char **)gos_Malloc(sizeof(char *) * iDecalCount);
|
|
|
|
for (int i=0 ; i<iDecalCount ; i++)
|
|
{
|
|
FREE_PTR(szIcon[i]);
|
|
szIcon[i] = (char *)gos_Malloc(256);
|
|
pszFullNames[i] = (char *)gos_Malloc(256);
|
|
}
|
|
|
|
args[0] = szIcon;
|
|
args[1] = pszFullNames;
|
|
|
|
MW4Shell::GetDecalNames(NULL, 2, args);
|
|
|
|
for (i=0 ; i<iDecalCount ; i++)
|
|
{
|
|
FREE_PTR(pszFullNames[i]);
|
|
}
|
|
FREE_PTR(pszFullNames);
|
|
}
|
|
#endif
|
|
startup_ini.Save();
|
|
|
|
return 0;
|
|
}
|
|
|
|
//========================================================================
|
|
//========================================================================
|
|
SCRIPTCALLBACK(LeaveMultiplayerOptionsScreen)
|
|
{
|
|
gosASSERT(args == 10);
|
|
|
|
const char ** szName = (const char **)arg[0];
|
|
char ** szTeam = (char **)arg[1];
|
|
int * nPassToggle = (int *)arg[2];
|
|
char ** szPass = (char **)arg[3];
|
|
int * nPlayerI = (int *)arg[4];
|
|
int * nTeamI = (int *)arg[5];
|
|
char ** szInsignia = (char **)arg[6];
|
|
char ** szInsigniaFull = (char **)arg[7];
|
|
int * nInsigTotal = (int *)arg[8];
|
|
int * nAllowDecal = (int *)arg[9];
|
|
|
|
UNUSED(szInsignia);
|
|
//UNUSED(szInsigniaFull);
|
|
UNUSED(nInsigTotal);
|
|
|
|
if (!MWApplication::ValidateName((char*)*szName, true))
|
|
return -1;
|
|
|
|
#define SAVE_VALUES
|
|
#ifdef SAVE_VALUES
|
|
//
|
|
// prepare to read from options file
|
|
//
|
|
NotationFile startup_ini(OPTIONS_INI, NotationFile::Standard, true);
|
|
Page *page = startup_ini.FindPage(OPTIONS_SECTION);
|
|
if (!page)
|
|
page = startup_ini.AddPage(OPTIONS_SECTION);
|
|
|
|
//
|
|
// player name
|
|
//
|
|
|
|
#if 0
|
|
//Kill the bad one that we read in without the @
|
|
//page->DeleteNote(OPTION_PLAYERNAME);
|
|
|
|
//MString name_entry = "@";
|
|
//name_entry += OPTION_PLAYERNAME;
|
|
//page->SetEntry((const char *)name_entry, *szName);
|
|
page->SetEntry(OPTION_PLAYERNAME, *szName);
|
|
|
|
//Kill the bad one that we read in without the @
|
|
//page->DeleteNote(OPTION_TEAMNAME);
|
|
|
|
//name_entry = "@";
|
|
//name_entry += OPTION_TEAMNAME;
|
|
//page->SetEntry((const char *)name_entry, *szTeam);
|
|
page->SetEntry(OPTION_TEAMNAME, *szTeam);
|
|
|
|
page->SetEntry(OPTION_PASSWORD, *szPass);
|
|
if (*nPassToggle)
|
|
page->SetEntry(OPTION_USEPASSWORD, "Yes");
|
|
else
|
|
page->SetEntry(OPTION_USEPASSWORD, "No");
|
|
#else
|
|
MW4Shell::Instance->m_optionsObject->m_playerName = *szName;
|
|
MW4Shell::Instance->m_optionsObject->m_teamName = *szTeam;
|
|
|
|
if (*nPassToggle)
|
|
MW4Shell::Instance->m_optionsObject->m_password = *szPass;
|
|
else
|
|
MW4Shell::Instance->m_optionsObject->m_password = "";
|
|
MW4Shell::Instance->SaveOptions();
|
|
#endif
|
|
|
|
#if 0
|
|
char sz[5];
|
|
sprintf(sz, "%d", *nPlayerI);
|
|
page->SetEntry(OPTION_PLAYERICON, sz);
|
|
sprintf(sz, "%d", *nTeamI);
|
|
page->SetEntry(OPTION_TEAMICON, sz);
|
|
#else
|
|
page->SetEntry(OPTION_PLAYERICON, szInsigniaFull[*nPlayerI]);
|
|
page->SetEntry(OPTION_TEAMICON, szInsigniaFull[*nTeamI]);
|
|
#endif
|
|
|
|
Page *page2 = startup_ini.SetPage(OPTIONS_SERVER_SECTION);
|
|
|
|
if (*nAllowDecal)
|
|
page2->SetEntry(OPTION_ALLOWDECALTRANSFER, "1");
|
|
else
|
|
page2->SetEntry(OPTION_ALLOWDECALTRANSFER, "0");
|
|
|
|
//
|
|
// save the ini file
|
|
//
|
|
startup_ini.Save();
|
|
|
|
#else
|
|
szName = szName;
|
|
szTeam = szTeam;
|
|
nPassToggle = nPassToggle;
|
|
szPass = szPass;
|
|
nPlayerI = nPlayerI;
|
|
nTeamI = nTeamI;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignGetPlayerStatus(void *data[], int count)
|
|
{
|
|
//Here we need to ask the game for the player data
|
|
Check_Object(MWGame::GetInstance());
|
|
char **player_mech = &STRPARM(1);
|
|
int *mech_status = INTARRAYPARAM(2);
|
|
|
|
PilotPlug *player_plug = MWGame::GetInstance()->GetPilotLeader();
|
|
Check_Object(player_plug);
|
|
|
|
FREEANDNULL(*player_mech);
|
|
*player_mech = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
*player_mech,
|
|
(const char *)player_plug->GetMechName(),
|
|
player_plug->GetMechName().GetLength() + 1
|
|
);
|
|
|
|
*mech_status = player_plug->GetMechPlug()->GetStatus();
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignGetLanceStatus(void *data[], int count)
|
|
{
|
|
//Here we need to walk throught he current lancemates
|
|
Check_Object(MWGame::GetInstance());
|
|
char **lance_names = STRARRAYPARAM(1);
|
|
int *lance_status = INTARRAYPARAM(2);
|
|
int *base_gunnery = INTARRAYPARAM(3);
|
|
int *new_gunnery = INTARRAYPARAM(4);
|
|
int *base_piloting = INTARRAYPARAM(5);
|
|
int *new_piloting = INTARRAYPARAM(6);
|
|
char **lance_mechs = STRARRAYPARAM(7);
|
|
int *mech_status = INTARRAYPARAM(8);
|
|
int *num_lance = INTARRAYPARAM(9);
|
|
|
|
SortedChainIteratorOf<PilotPlug *, int> iterator(&MWGame::GetInstance()->m_lancePilots);
|
|
PilotPlug *pilot;
|
|
int i = 0;
|
|
while((pilot = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(pilot);
|
|
|
|
//WE don't want the player here
|
|
if(!pilot->IsPlayer())
|
|
{
|
|
//Make sure we were valid and were in the last mission too
|
|
if(pilot->GetMechPlug() && pilot->GetPilot())
|
|
{
|
|
//Lance Name Enter here
|
|
FREEANDNULL(lance_names[i]);
|
|
lance_names[i] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
lance_names[i],
|
|
(const char *)pilot->GetPilot()->m_lancemateName,
|
|
pilot->GetPilot()->m_lancemateName.GetLength() + 1
|
|
);
|
|
|
|
lance_status[i] = pilot->GetPilot()->State();
|
|
base_gunnery[i] = pilot->GetPilot()->GetStartGunnerySkill();
|
|
new_gunnery[i] = pilot->GetPilot()->GunnerySkill();
|
|
base_piloting[i] = pilot->GetPilot()->GetStartPilotSkill();
|
|
new_piloting[i] = pilot->GetPilot()->PilotSkill();
|
|
|
|
FREEANDNULL(lance_mechs[i]);
|
|
lance_mechs[i] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
lance_mechs[i],
|
|
(const char *)pilot->GetMechName(),
|
|
pilot->GetMechName().GetLength() + 1
|
|
);
|
|
|
|
mech_status[i] = pilot->GetMechPlug()->GetStatus();
|
|
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
*num_lance = i;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignGetMechSalvage(void *data[], int count)
|
|
{
|
|
//Here we need to get the salvage gotten
|
|
char **mech_name = STRARRAYPARAM(1);
|
|
int *mech_count = INTARRAYPARAM(2);
|
|
int *num_mechs = INTARRAYPARAM(3);
|
|
|
|
//Run through the Mechtable looking for new mechs
|
|
Check_Object(MWGame::GetInstance());
|
|
Check_Object(MWGame::GetInstance()->m_campaign);
|
|
int i = 0;
|
|
|
|
if(MWGame::GetInstance()->m_campaign->m_currentMissionPlug->m_status == MWCampaign::Completed)
|
|
{
|
|
SortedChainIteratorOf<MechTablePlug *, MString> iterator(&MWGame::GetInstance()->m_mechTable);
|
|
MechTablePlug *mech_plug;
|
|
while((mech_plug = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mech_plug);
|
|
if(mech_plug->IsNew())
|
|
{
|
|
FREEANDNULL(mech_name[i]);
|
|
mech_name[i] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
mech_name[i],
|
|
(const char *)mech_plug->GetMechName(),
|
|
mech_plug->GetMechName().GetLength() + 1
|
|
);
|
|
|
|
mech_count[i] = 1;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
*num_mechs = i;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignGetWeaponSalvage(void *data[], int count)
|
|
{
|
|
char **salvage_name = STRARRAYPARAM(1);
|
|
int *salvage_count = INTARRAYPARAM(2);
|
|
int *num_salvage = INTARRAYPARAM(3);
|
|
|
|
//Run through the Mechtable looking for new mechs
|
|
Check_Object(MWGame::GetInstance());
|
|
Check_Object(MWGame::GetInstance()->m_salvageManager);
|
|
Check_Object(MWGame::GetInstance()->m_campaign);
|
|
int i = 0;
|
|
|
|
if(MWGame::GetInstance()->m_campaign->m_currentMissionPlug->m_status == MWCampaign::Completed)
|
|
{
|
|
SortedChainIteratorOf<SalvagePlug *, int> iterator(&MWGame::GetInstance()->m_salvageManager->m_salvageList);
|
|
SalvagePlug *salvage_plug;
|
|
|
|
while((salvage_plug = iterator.ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(salvage_plug);
|
|
if(salvage_plug->m_newCount > 0)
|
|
{
|
|
FREEANDNULL(salvage_name[i]);
|
|
salvage_name[i] = (char *)gos_Malloc(128);
|
|
Str_Copy(
|
|
salvage_name[i],
|
|
(const char *)salvage_plug->m_salvageName,
|
|
salvage_plug->m_salvageName.GetLength() + 1
|
|
);
|
|
|
|
salvage_count[i] = salvage_plug->m_newCount;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
*num_salvage = i;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignGetResults(void *data[], int count)
|
|
{
|
|
//Here we get the general results including the objectives? I hope we still have these somewhere
|
|
Check_Object(MWGame::GetInstance());
|
|
Check_Object(MWGame::GetInstance()->m_campaign);
|
|
|
|
int *mission_status = INTARRAYPARAM(1);
|
|
|
|
*mission_status = MWGame::GetInstance()->m_campaign->m_currentMissionPlug->m_status;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignGetSavedGames(void *data[], int count)
|
|
{
|
|
char **game_names = STRARRAYPARAM(1);
|
|
int *num_games = INTARRAYPARAM(2);
|
|
|
|
Stuff::MString games_path = "Resource\\Pilots\\";
|
|
games_path += MWApplication::GetInstance()->m_pilotName;
|
|
games_path += "\\Games\\*.mw4";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(games_path, true);
|
|
Check_Object(resource_directory);
|
|
int i = 0;
|
|
const char *file_name;
|
|
while((file_name = resource_directory->GetNewestFile()) != NULL)
|
|
{
|
|
FREEANDNULL(game_names[i]);
|
|
game_names[i] = (char *)gos_Malloc(256);
|
|
|
|
MString game_name;
|
|
game_name = file_name;
|
|
game_name.StripDirectory().StripExtension();
|
|
Str_Copy(
|
|
game_names[i],
|
|
(const char *)game_name,
|
|
game_name.GetLength() + 1
|
|
);
|
|
i++;
|
|
|
|
Directory::DirectoryEntry *entry = resource_directory->fileEntries.Find(file_name);
|
|
Check_Object(entry);
|
|
delete entry;
|
|
//resource_directory->AdvanceCurrentFile();
|
|
}
|
|
|
|
*num_games = i;
|
|
delete resource_directory;
|
|
|
|
return 1;
|
|
}
|
|
|
|
//
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::CampaignLoadGame(void *data[], int count)
|
|
{
|
|
char **game_name = &STRPARM(1);
|
|
|
|
if(*game_name)
|
|
{
|
|
if(MWCampaign::Instance)
|
|
{
|
|
delete MWCampaign::Instance;
|
|
MWCampaign::Instance = NULL;
|
|
}
|
|
|
|
if(MWGame::GetInstance())
|
|
{
|
|
delete MWGame::GetInstance();
|
|
GlobalPointers::ClearPointer(MWGameGlobalPointerIndex);
|
|
}
|
|
GlobalPointers::AddGlobalPointer(new MWGame(*game_name), MWGameGlobalPointerIndex);
|
|
Check_Object(MWGame::GetInstance());
|
|
m_doesHaveLoadGame = true;
|
|
|
|
MWCampaign::Instance = MWGame::GetInstance()->GetCampaign();
|
|
}
|
|
|
|
Instance->shellStart = CampaignLoadShellStart;
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::GetLoadMissionName(void *data[], int count)
|
|
{
|
|
char **game_name = &STRPARM(1);
|
|
|
|
FREEANDNULL(*game_name);
|
|
*game_name = (char *)gos_Malloc(256);
|
|
::memset(*game_name, 0, 256);
|
|
|
|
MString name = MWApplication::GetInstance()->m_currentMissionName;
|
|
if (!(!name))
|
|
Str_Copy(*game_name,(const char *)name, name.GetLength() + 1);
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// Takes no parameters. Restores default mapping of input.
|
|
int MW4Shell::ControlSetDefault(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
Adept::g_ControlList->GetList(true);
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// In: int Row - row is relative to group previously selected by
|
|
// int Type - Key, Mouse, Joystick
|
|
// int value (device specific)
|
|
//
|
|
// Out: Device remapped, 1-2 mail messages sent to reflect changes to script side
|
|
|
|
static int sm_row = 0;
|
|
static int sm_col = 0;
|
|
|
|
int MW4Shell::ControlAssignValue(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
int row = INTPARM(1);
|
|
int type = INTPARM(2);
|
|
int value = INTPARM(3);
|
|
|
|
gosASSERT(type == MAP_KEY || type == MAP_JOY || type == MAP_MOUSE);
|
|
|
|
int modifier = 0;
|
|
int alteredRow = 0;
|
|
|
|
switch (type)
|
|
{
|
|
case MAP_KEY:
|
|
|
|
value >>= 8;
|
|
if (value == KEY_ESCAPE)
|
|
return 1;
|
|
modifier = INTPARM(4);
|
|
modifier = modifier >> 8;
|
|
switch (modifier)
|
|
{
|
|
case KEY_LCONTROL:
|
|
case (KEY_LCONTROL|0x100):
|
|
modifier = ControlsManager::CtrlFlag;
|
|
break;
|
|
|
|
case KEY_LMENU:
|
|
modifier = ControlsManager::AltFlag;
|
|
break;
|
|
|
|
case KEY_LSHIFT:
|
|
modifier = ControlsManager::ShiftFlag;
|
|
break;
|
|
|
|
case 0:
|
|
modifier = ControlsManager::PlainFlag;
|
|
break;
|
|
|
|
default:
|
|
gosASSERT(!"Unknown modifier");
|
|
modifier = ControlsManager::PlainFlag;
|
|
}
|
|
|
|
alteredRow = Adept::g_ControlList->AssignControlKey(VehicleInterface::GetInstance(), row, value, modifier);
|
|
break;
|
|
|
|
case MAP_JOY:
|
|
modifier = INTPARM(4);
|
|
if (modifier)
|
|
modifier = ControlsManager::ShiftFlag;
|
|
else
|
|
modifier = ControlsManager::PlainFlag;
|
|
alteredRow = Adept::g_ControlList->AssignControlJoy(VehicleInterface::GetInstance(), row, value, modifier);
|
|
break;
|
|
|
|
case MAP_MOUSE:
|
|
alteredRow = Adept::g_ControlList->AssignControlMouse(VehicleInterface::GetInstance(), row, value);
|
|
break;
|
|
}
|
|
|
|
|
|
int msg = nMSG_UPDATE_MAP;
|
|
|
|
sm_row = row;
|
|
sm_col = type;
|
|
|
|
_SCRIPT* handle = gosScript_GetScriptHandle("OM_Controls", 0);
|
|
if (handle == NULL)
|
|
handle = gosScript_GetScriptHandle("OM_Controls", NET_SCRIPT_PRIORITY);
|
|
|
|
gosScript_Command(handle, "@OM_Controls@", gosScript_Cmd_MAILBOX,(void *) &msg);
|
|
|
|
|
|
|
|
if (alteredRow != row)
|
|
{
|
|
sm_row = alteredRow;
|
|
gosScript_Command(handle, "@OM_Controls@", gosScript_Cmd_MAILBOX, (void *) &msg);
|
|
}
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// In: No parameters
|
|
//
|
|
// Out: Any changes made previously with AssignValue are implemented in the remapping code
|
|
|
|
int MW4Shell::ControlAcceptChanges(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
Adept::g_ControlList->SetList(VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// In: No parameters
|
|
//
|
|
// Out: Any changes made previously with AssignValue are discarded, and the internal state returns
|
|
// to what is presently implemented on the input remapping. No mailing occurs - the script
|
|
// must call GetMapping again to sync its state.
|
|
//
|
|
int MW4Shell::ControlCancelChanges(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
Adept::g_ControlList->GetList(false);
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::ControlSaveSettings(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
Adept::g_ControlList->SaveList(m_memoryStream);
|
|
m_memoryStream.Rewind();
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::ControlRestoreSettings(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
Adept::g_ControlList->LoadList(m_memoryStream);
|
|
Adept::g_ControlList->GetList(false);
|
|
m_memoryStream.Rewind();
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// In: Category // BUGBUG:DAN - needs to be defined
|
|
// Command String Array (used as output)
|
|
// Key String Array (used as output)
|
|
// Mouse String Array (used as output)
|
|
// Joy String Array (used as output)
|
|
// count (used as output)
|
|
#define DF_STR_BUFFER_SIZE 128
|
|
|
|
int MW4Shell::ControlGetMapping(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
|
|
// int category = INTPARM(1); // BUGBUG:DAN
|
|
char** name_array = STRARRAYPARAM(2);
|
|
char** key_array = STRARRAYPARAM(3);
|
|
char** mouse_array = STRARRAYPARAM(4);
|
|
char** joy_array = STRARRAYPARAM(5);
|
|
|
|
int listCount = Adept::g_ControlList->DefListSize();
|
|
if (listCount == 0)
|
|
{
|
|
Adept::g_ControlList->GetList(false);
|
|
listCount = Adept::g_ControlList->DefListSize();
|
|
}
|
|
|
|
INTPARM(6) = listCount;
|
|
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
for (int i = 0; i < listCount; ++i)
|
|
{
|
|
if (name_array[i])
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char*) gos_Malloc(DF_STR_BUFFER_SIZE + 1);
|
|
int nameresid = Adept::g_ControlList->GetControlDef(i).nameresid;
|
|
const char* str = "";
|
|
if (nameresid != 0)
|
|
{
|
|
str = app->GetLocString (nameresid);
|
|
}
|
|
Str_Copy(name_array[i], str, DF_STR_BUFFER_SIZE);
|
|
|
|
if (key_array[i])
|
|
FREEANDNULL(key_array[i]);
|
|
key_array[i] = (char*) gos_Malloc(DF_STR_BUFFER_SIZE + 1);
|
|
int nkey = Adept::g_ControlList->GetControlDef(i).nKey;
|
|
Str_Copy(key_array[i], Adept::g_ControlList->GetControlDef(i).KeyName(), DF_STR_BUFFER_SIZE);
|
|
nkey++;
|
|
// if (mouse_array[i])
|
|
FREEANDNULL(mouse_array[i]);
|
|
mouse_array[i] = (char*) gos_Malloc(DF_STR_BUFFER_SIZE + 1);
|
|
if (Adept::g_ControlList->GetControlDef(i).cd_mouse_valid)
|
|
{
|
|
int nMouse = Adept::g_ControlList->GetControlDef(i).nMouse;
|
|
if (nMouse == 512)
|
|
{
|
|
Str_Copy(mouse_array[i], Application::GetInstance()->GetLocString(IDS_MOUSE_WHEEL_DOWN), DF_STR_BUFFER_SIZE);
|
|
}
|
|
else if (nMouse == 513)
|
|
{
|
|
Str_Copy(mouse_array[i], Application::GetInstance()->GetLocString(IDS_MOUSE_WHEEL_UP), DF_STR_BUFFER_SIZE);
|
|
}
|
|
else
|
|
{
|
|
Str_Copy(mouse_array[i], Adept::g_ControlList->GetControlDef(i).MouseName(), DF_STR_BUFFER_SIZE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
FREEANDNULL(mouse_array[i]);
|
|
// mouse_array[i] = 0;
|
|
}
|
|
|
|
if (joy_array[i])
|
|
FREEANDNULL(joy_array[i]);
|
|
joy_array[i] = (char*) gos_Malloc(DF_STR_BUFFER_SIZE + 1);
|
|
Str_Copy(joy_array[i], Adept::g_ControlList->GetControlDef(i).JoyName(), DF_STR_BUFFER_SIZE);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// In: Row - relative to category
|
|
// Column (Type) - (0-3) Name Key Mouse Joy
|
|
// String (used as output)
|
|
// ***** note **** mail message must send out row & column!
|
|
|
|
int MW4Shell::ControlGetValue(void* data[], int count)
|
|
{
|
|
INTPARM(1) = sm_row;
|
|
INTPARM(2) = sm_col;
|
|
char** string = &STRPARM(3);
|
|
|
|
gosASSERT(sm_row >= 0);
|
|
gosASSERT(sm_col <= 3);
|
|
|
|
int type = sm_col;
|
|
gosASSERT(type >= 0 && type <= 3);
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
|
|
// int size = Adept::g_ControlList->DefListSize();
|
|
// gosASSERT(row < size);
|
|
|
|
if (*string)
|
|
{
|
|
FREEANDNULL(*string);
|
|
}
|
|
|
|
*string = (char *)gos_Malloc(DF_STR_BUFFER_SIZE + 1);
|
|
|
|
|
|
// Row += categoryOffset //BUGBUG - needed?
|
|
switch (type)
|
|
{
|
|
case MAP_CONTROL_NAME:
|
|
{
|
|
int nameresid = Adept::g_ControlList->GetControlDef(sm_row).nameresid;
|
|
const char* str = "none";
|
|
if (nameresid != 0)
|
|
{
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
str = app->GetLocString (nameresid);
|
|
}
|
|
Str_Copy(*string, str, DF_STR_BUFFER_SIZE);
|
|
break;
|
|
}
|
|
|
|
case MAP_KEY:
|
|
Str_Copy(*string, Adept::g_ControlList->GetControlDef(sm_row).KeyName(), DF_STR_BUFFER_SIZE);
|
|
break;
|
|
|
|
case MAP_MOUSE:
|
|
if (Adept::g_ControlList->GetControlDef(sm_row).cd_mouse_valid)
|
|
{
|
|
int nMouse = Adept::g_ControlList->GetControlDef(sm_row).nMouse;
|
|
if (nMouse == 512)
|
|
{
|
|
Str_Copy(*string, Application::GetInstance()->GetLocString(IDS_MOUSE_WHEEL_DOWN), DF_STR_BUFFER_SIZE);
|
|
}
|
|
else if (nMouse == 513)
|
|
{
|
|
Str_Copy(*string, Application::GetInstance()->GetLocString(IDS_MOUSE_WHEEL_UP), DF_STR_BUFFER_SIZE);
|
|
}
|
|
else
|
|
{
|
|
Str_Copy(*string, Adept::g_ControlList->GetControlDef(sm_row).MouseName(), DF_STR_BUFFER_SIZE);
|
|
}
|
|
}
|
|
else
|
|
*string = 0;
|
|
break;
|
|
|
|
case MAP_JOY:
|
|
Str_Copy(*string, Adept::g_ControlList->GetControlDef(sm_row).JoyName(), DF_STR_BUFFER_SIZE);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
// Callbacks for input remapping support
|
|
int
|
|
MW4Shell::ControlGetJoyStickNames(void* data[], int count)
|
|
{
|
|
static int joystickCount = -1;
|
|
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
if (joystickCount == -1)
|
|
joystickCount = gosJoystick_CountJoysticks(false);
|
|
|
|
char** name_array = STRARRAYPARAM(2);
|
|
for (int i = 0; i < joystickCount; ++i)
|
|
{
|
|
gosJoystick_Info ji;
|
|
gosJoystick_GetInfo(i, &ji);
|
|
|
|
if (name_array[i])
|
|
FREEANDNULL(name_array[i]);
|
|
name_array[i] = (char*) gos_Malloc(strlen(ji.lpstrName) + 1);
|
|
Str_Copy(name_array[i], ji.lpstrName, strlen(ji.lpstrName) + 1);
|
|
}
|
|
INTPARM(1) = joystickCount;
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyStickInvert(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->IsJoyYInverted();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetMouseInvert(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = !g_ControlList->IsMouseYInverted();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyStick(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->IsJoyStickAllowed();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetMouse(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->IsMouseAllowed();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyStickShift(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->IsJoyStickShiftAllowed();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyListSelected(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->Joystick();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyListSelected(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
g_ControlList->Joystick(INTPARM(1), VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyStickInvert(void* data[], int count)
|
|
{
|
|
bool joyState = (INTPARM(1) != 0);
|
|
g_ControlList->SetJoyYInvert(joyState, VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
|
|
int
|
|
MW4Shell::ControlSetMouseInvert(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
bool mouseState = (INTPARM(1) == 0);
|
|
g_ControlList->SetMouseYInvert(mouseState, VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetForce(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
bool forceState = (INTPARM(1) != 0);
|
|
g_ControlList->ForceFeedBack(forceState, VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetForce(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->ForceFeedBack();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyStickShift(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
bool flag = INTPARM(1) != 0;
|
|
|
|
|
|
int index1, index2;
|
|
int msgCount = g_ControlList->SetJoyStickShiftAllowed(flag, VehicleInterface::GetInstance(), &index1, &index2);
|
|
|
|
if (msgCount)
|
|
{
|
|
int msg = nMSG_UPDATE_MAP;
|
|
sm_row = index1;
|
|
sm_col = MAP_JOY;
|
|
|
|
_SCRIPT* handle = gosScript_GetScriptHandle("OM_Controls", 0);
|
|
if (handle == NULL)
|
|
handle = gosScript_GetScriptHandle("OM_Controls", NET_SCRIPT_PRIORITY);
|
|
|
|
gosScript_Command(handle, "@OM_Controls@", gosScript_Cmd_MAILBOX, (void *) &msg);
|
|
|
|
if (msgCount == 2)
|
|
{
|
|
sm_row = index2;
|
|
gosScript_Command(handle, "@OM_Controls@", gosScript_Cmd_MAILBOX, (void *) &msg);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyStick(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
bool flag = (INTPARM(1) != 0);
|
|
g_ControlList->SetJoyStickAllowed(flag, VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetMouse(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
bool flag = (INTPARM(1) != 0);
|
|
g_ControlList->SetMouseAllowed(flag, VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyShiftValue(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
int index1, index2;
|
|
int msgCount = g_ControlList->SetJoyStickShiftValue(INTPARM(1), VehicleInterface::GetInstance(), &index1, &index2);
|
|
|
|
if (msgCount)
|
|
{
|
|
int msg = nMSG_UPDATE_MAP;
|
|
sm_row = index1;
|
|
sm_col = MAP_JOY;
|
|
|
|
_SCRIPT* handle = gosScript_GetScriptHandle("OM_Controls", 0);
|
|
if (handle == NULL)
|
|
handle = gosScript_GetScriptHandle("OM_Controls", NET_SCRIPT_PRIORITY);
|
|
|
|
gosScript_Command(handle, "@OM_Controls@", gosScript_Cmd_MAILBOX, (void *) &msg);
|
|
|
|
if (msgCount == 2)
|
|
{
|
|
sm_row = index2;
|
|
gosScript_Command(handle, "@OM_Controls@", gosScript_Cmd_MAILBOX, (void *) &msg);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyShiftValue(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->GetJoyStickShiftValue();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetMouseSensitivity(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
float value = static_cast<float>(INTPARM(1)) / 100;
|
|
g_ControlList->MouseSensitivity(value, VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetMouseSensitivity(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
float value = static_cast<float>(INTPARM(1)) / 100;
|
|
value = g_ControlList->MouseSensitivity();
|
|
INTPARM(1) = static_cast<int>(100.0 * value);
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyXAxis(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->JoystickXAxis();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyRudderAxis(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->JoystickRudderAxis();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetMouseXAxis(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
INTPARM(1) = g_ControlList->MouseXAxis();
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyXAxis(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
g_ControlList->JoystickXAxis(INTPARM(1), VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyRudderAxis(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
g_ControlList->JoystickRudderAxis(INTPARM(1), VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
|
|
int
|
|
MW4Shell::ControlSetMouseXAxis(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
g_ControlList->MouseXAxis(INTPARM(1), VehicleInterface::GetInstance());
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlScanKeyboard(void* data[], int count)
|
|
{
|
|
const int MyCtrl = 1;
|
|
const int MyShift = 2;
|
|
const int MyAlt = 4;
|
|
|
|
static const int Flags[] = {
|
|
ControlsManager::PlainFlag,
|
|
ControlsManager::CtrlFlag,
|
|
ControlsManager::ShiftFlag,
|
|
ControlsManager::CtrlShiftFlag,
|
|
ControlsManager::AltFlag,
|
|
ControlsManager::CtrlAltFlag,
|
|
ControlsManager::ShiftAltFlag,
|
|
ControlsManager::CtrlShiftAltFlag
|
|
};
|
|
|
|
// If no key pressed, return
|
|
DWORD value = gos_GetKey();
|
|
if (value == 0)
|
|
return 0;
|
|
|
|
// If key is a modifier, ignore it
|
|
if (value == KEY_LSHIFT || value == KEY_LMENU || value == KEY_LCONTROL)
|
|
return 0;
|
|
|
|
// Key is probably valid here. Scan for any modifiers currently held down
|
|
|
|
int flag = 0;
|
|
gosEnum_KeyStatus status = gos_GetKeyStatus( KEY_LSHIFT );
|
|
if (status == KEY_PRESSED || status == KEY_HELD)
|
|
flag |= MyShift;
|
|
|
|
status = gos_GetKeyStatus( KEY_LCONTROL );
|
|
if (status == KEY_PRESSED || status == KEY_HELD)
|
|
flag |= MyCtrl;
|
|
|
|
status = gos_GetKeyStatus( KEY_LMENU );
|
|
if (status == KEY_PRESSED || status == KEY_HELD)
|
|
flag |= MyAlt;
|
|
|
|
int modifier = Flags[flag];
|
|
int row = INTPARM(1);
|
|
|
|
int alteredRow = Adept::g_ControlList->AssignControlKey(VehicleInterface::GetInstance(), row, value, modifier);
|
|
int msg = nMSG_UPDATE_MAP;
|
|
|
|
sm_row = row;
|
|
sm_col = MAP_KEY;
|
|
|
|
gosScript_Command(gosScript_GetScriptHandle("OM_Controls", NULL),
|
|
"@OM_Controls@",
|
|
gosScript_Cmd_MAILBOX,
|
|
(void *) &msg);
|
|
|
|
|
|
|
|
if (alteredRow != row)
|
|
{
|
|
sm_row = alteredRow;
|
|
gosScript_Command(gosScript_GetScriptHandle("OM_Controls", NULL),
|
|
"@OM_Controls@",
|
|
gosScript_Cmd_MAILBOX,
|
|
(void *) &msg);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::IAGetResults(void *data[], int count)
|
|
{
|
|
//This is for the end screen of the Instant Action section.
|
|
|
|
char **mission_name = &STRPARM(1);
|
|
char **player_name = &STRPARM(2);
|
|
int *deaths = INTARRAYPARAM(3);
|
|
int *kills = INTARRAYPARAM(4);
|
|
int *status = INTARRAYPARAM(5);
|
|
int *game_type = INTARRAYPARAM(6);
|
|
int *difficulty = INTARRAYPARAM(7);
|
|
|
|
FREEANDNULL(*mission_name);
|
|
*mission_name = (char *)gos_Malloc(256);
|
|
|
|
MString name = MWApplication::GetInstance()->m_currentMissionName;
|
|
Str_Copy(*mission_name,(const char *)name, name.GetLength() + 1);
|
|
|
|
FREEANDNULL(*player_name);
|
|
*player_name = (char *)gos_Malloc(128);
|
|
|
|
MString pilot_name = MWApplication::GetInstance()->m_pilotName;
|
|
Str_Copy(*player_name,(const char *)pilot_name, pilot_name.GetLength() + 1);
|
|
|
|
*status = MWApplication::GetInstance()->m_currentMissionStatus;
|
|
|
|
//*deaths = MWApplication::GetInstance->servedConnectionData[Connection::Local->GetID() ].clientPlayer
|
|
*deaths = MWApplication::GetInstance()->m_lastMissionDeaths;
|
|
*kills = MWApplication::GetInstance()->m_lastMissionKills;
|
|
|
|
*game_type = MWApplication::GetInstance()->m_iaDisplayGameType;
|
|
|
|
*difficulty = MWApplication::GetInstance()->GetDifficultyLevel();
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetIAMissionRegionData(void *data[], int count)
|
|
{
|
|
int *region_id = INTARRAYPARAM(1);
|
|
char **rollover_name = &STRPARM(2);
|
|
|
|
CampaignMissionPlug *mission_plug = MWCampaign::Instance->FindMission(*region_id);
|
|
if(mission_plug)
|
|
{
|
|
Resource mission_region(mission_plug->m_interfacePlugID);
|
|
Verify(mission_region.DoesResourceExist());
|
|
MWCampaignInterfacePlug *interface_plug = new MWCampaignInterfacePlug(&mission_region);
|
|
|
|
FREEANDNULL(*rollover_name);
|
|
*rollover_name = (char *)gos_Malloc(512);
|
|
|
|
MString region_loc_name = MWApplication::GetInstance()->GetLocString(interface_plug->GetRollOverID());
|
|
Str_Copy(
|
|
*rollover_name,
|
|
(const char *)region_loc_name,
|
|
region_loc_name.GetLength() + 1
|
|
);
|
|
|
|
delete interface_plug;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::CampaignPlayIntro(void *data[], int count)
|
|
{
|
|
Check_Object(MWGame::GetInstance());
|
|
int return_value = MWGame::GetInstance()->m_isNewGame;
|
|
MWGame::GetInstance()->m_isNewGame = false;
|
|
return return_value;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::CampaignPlayEnd(void *data[], int count)
|
|
{
|
|
char **movie_name = &STRPARM(1);
|
|
|
|
if(MWApplication::GetInstance()->m_campaignIsComplete)
|
|
{
|
|
MString movie_string;
|
|
Check_Object(MWGame::GetInstance());
|
|
Check_Object(MWGame::GetInstance()->m_campaign);
|
|
|
|
movie_string = MWGame::GetInstance()->m_campaign->m_finalMovieName;
|
|
if(!movie_string)
|
|
return 0;
|
|
|
|
FREEANDNULL(*movie_name);
|
|
*movie_name = (char *)gos_Malloc(256);
|
|
|
|
Str_Copy(
|
|
*movie_name,
|
|
(const char *)movie_string,
|
|
movie_string.GetLength() + 1
|
|
);
|
|
|
|
if(m_optionsObject)
|
|
{
|
|
m_optionsObject->m_closingCinemaName = movie_string;
|
|
SaveOptions();
|
|
}
|
|
|
|
MWApplication::GetInstance()->m_campaignIsComplete = false;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::CampaignGetMechBars(void *data[], int count)
|
|
{
|
|
char **mech_name = &STRPARM(1);
|
|
int *stats = INTARRAYPARAM(2);
|
|
|
|
Check_Object(MWGame::GetInstance());
|
|
|
|
MString name = *mech_name;
|
|
name.ToLower();
|
|
MechTablePlug *mech_plug = MWGame::GetInstance()->m_mechTable.Find(name);
|
|
if(mech_plug)
|
|
{
|
|
|
|
Resource mech_instance_resource(mech_plug->GetMechResourceID());
|
|
Verify(mech_instance_resource.DoesResourceExist());
|
|
|
|
Mech::CreateMessage *mech_message = Cast_Pointer(Mech::CreateMessage *, mech_instance_resource.GetPointer());
|
|
|
|
stats[0] = mech_message->m_powerBar;
|
|
stats[1] = mech_message->m_armorBar;
|
|
stats[2] = mech_message->m_speedBar;
|
|
stats[3] = mech_message->m_heatBar;
|
|
}
|
|
else
|
|
{
|
|
stats[0] = 0;
|
|
stats[1] = 0;
|
|
stats[2] = 0;
|
|
stats[3] = 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::IAGetMechBars(void *data[], int count)
|
|
{
|
|
char **mech_name = &STRPARM(1);
|
|
int *mech_index = INTARRAYPARAM(2);
|
|
int *stats = INTARRAYPARAM(3);
|
|
int *mech_icon_id = INTARRAYPARAM(4);
|
|
|
|
if(*mech_index >= 0)
|
|
{
|
|
ResourceFile *res_file = NULL;
|
|
ResourceID mech_id = m_mechIDs[*mech_index];
|
|
if(mech_id == ResourceID::Null)
|
|
{
|
|
|
|
//
|
|
//-----------------------------------------------------------------
|
|
//This means that we have a user made mech in its own resource file
|
|
//-----------------------------------------------------------------
|
|
//
|
|
MString path_name = "Resource\\Variants\\";
|
|
path_name += *mech_name;
|
|
MString res_name = path_name;
|
|
res_name += ".mw4";
|
|
Check_Object(ResourceManager::Instance);
|
|
res_file = ResourceManager::Instance->OpenResourceFile(
|
|
res_name,
|
|
NULL,
|
|
MechResourceFileID,
|
|
VER_CONTENTVERSION,
|
|
false,
|
|
false
|
|
);
|
|
Check_Object(res_file);
|
|
ResourceID temp_id(MechResourceFileID, 1);
|
|
mech_id = temp_id;
|
|
}
|
|
|
|
Resource *mech_instance_resource = new Resource(mech_id);
|
|
Verify(mech_instance_resource->DoesResourceExist());
|
|
|
|
Mech::CreateMessage *mech_message = Cast_Pointer(Mech::CreateMessage *, mech_instance_resource->GetPointer());
|
|
|
|
stats[0] = mech_message->m_powerBar;
|
|
stats[1] = mech_message->m_armorBar;
|
|
stats[2] = mech_message->m_speedBar;
|
|
stats[3] = mech_message->m_heatBar;
|
|
|
|
*mech_icon_id = mech_message->m_mechID;
|
|
Clamp(*mech_icon_id, 0, LastMechID);
|
|
|
|
if(mech_instance_resource)
|
|
delete mech_instance_resource;
|
|
if(res_file)
|
|
delete res_file;
|
|
}
|
|
else
|
|
{
|
|
stats[0] = 0;
|
|
stats[1] = 0;
|
|
stats[2] = 0;
|
|
stats[3] = 0;
|
|
|
|
*mech_icon_id = NoMechID;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetMasterMechBars(void *data[], int count)
|
|
{
|
|
int *mech_index = INTARRAYPARAM(1);
|
|
int *stats = INTARRAYPARAM(2);
|
|
int *mech_icon_id = INTARRAYPARAM(3);
|
|
|
|
if(*mech_index >= 0)
|
|
{
|
|
ResourceID mech_id = m_stockMechIDs[*mech_index];
|
|
Verify(mech_id != ResourceID::Null);
|
|
|
|
Resource *mech_instance_resource = new Resource(mech_id);
|
|
Verify(mech_instance_resource->DoesResourceExist());
|
|
|
|
Mech::CreateMessage *mech_message = Cast_Pointer(Mech::CreateMessage *, mech_instance_resource->GetPointer());
|
|
|
|
stats[0] = mech_message->m_powerBar;
|
|
stats[1] = mech_message->m_armorBar;
|
|
stats[2] = mech_message->m_speedBar;
|
|
stats[3] = mech_message->m_heatBar;
|
|
|
|
*mech_icon_id = mech_message->m_mechID;
|
|
Clamp(*mech_icon_id, 0, LastMechID);
|
|
|
|
if(mech_instance_resource)
|
|
delete mech_instance_resource;
|
|
}
|
|
else
|
|
{
|
|
stats[0] = 0;
|
|
stats[1] = 0;
|
|
stats[2] = 0;
|
|
stats[3] = 0;
|
|
|
|
*mech_icon_id = NoMechID;
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetTrainingMechBars(void *data[], int count)
|
|
{
|
|
int *stats = INTARRAYPARAM(1);
|
|
|
|
MWTable *mech_table = MWApplication::GetInstance()->m_mechTable;
|
|
MWTableEntry *mech_entry = mech_table->FindEntry("Shadow cat");
|
|
ResourceID mech_id = mech_entry->GetEntryResourceID();
|
|
|
|
if(mech_id != ResourceID::Null)
|
|
{
|
|
Resource *mech_instance_resource = new Resource(mech_id);
|
|
Verify(mech_instance_resource->DoesResourceExist());
|
|
|
|
Mech::CreateMessage *mech_message = Cast_Pointer(Mech::CreateMessage *, mech_instance_resource->GetPointer());
|
|
|
|
stats[0] = mech_message->m_powerBar;
|
|
stats[1] = mech_message->m_armorBar;
|
|
stats[2] = mech_message->m_speedBar;
|
|
stats[3] = mech_message->m_heatBar;
|
|
|
|
delete mech_instance_resource;
|
|
}
|
|
else
|
|
{
|
|
stats[0] = 0;
|
|
stats[1] = 0;
|
|
stats[2] = 0;
|
|
stats[3] = 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetClosingCinema(void *data[], int count)
|
|
{
|
|
char **movie_name = &STRPARM(1);
|
|
|
|
if(m_optionsObject)
|
|
{
|
|
if(m_optionsObject->m_closingCinemaName)
|
|
{
|
|
FREEANDNULL(*movie_name);
|
|
*movie_name = (char *)gos_Malloc(256);
|
|
|
|
Str_Copy(
|
|
*movie_name,
|
|
(const char *)m_optionsObject->m_closingCinemaName,
|
|
m_optionsObject->m_closingCinemaName.GetLength() + 1
|
|
);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::SetMasterTrialDifficutly(void *data[], int count)
|
|
{
|
|
int *difficulty = INTARRAYPARAM(1);
|
|
|
|
MWApplication::GetInstance()->SetDifficultyLevel(*difficulty);
|
|
|
|
MWApplication *app = MWApplication::GetInstance();
|
|
|
|
for(int i=0; i<3; i++)
|
|
{
|
|
int bot_number = MWApplication::BotConnectionStart + i;
|
|
|
|
if (bot_number < 0)
|
|
return 0;
|
|
if (bot_number >= MWApplication::Maximum_Lancemates)
|
|
return 0;
|
|
|
|
switch(MWApplication::GetInstance()->GetDifficultyLevel())
|
|
{
|
|
case 0:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SniperBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 1:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\KillerBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
case 2:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\SlaughterBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
break;
|
|
default:
|
|
Str_Copy(app->lancemateConnectionData[bot_number].scriptName, "Content\\ABLScripts\\Bots\\UberBot.abl", ELEMENTS(app->lancemateConnectionData[bot_number].scriptName));
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::LaunchTrainingMission()
|
|
{
|
|
MWTableEntry *mech_table_entry = MWApplication::GetInstance()->m_mechTable->FindEntry("shadow cat");
|
|
Check_Object(mech_table_entry);
|
|
|
|
m_mechID = mech_table_entry->GetEntryResourceID();
|
|
|
|
MWCampaign *training_campaign = MWCampaign::MakeNewCampaign("Content\\Campaigns\\Training.campaign");
|
|
Check_Pointer(training_campaign);
|
|
|
|
Stuff::ChainIteratorOf<CampaignMissionPlug*>
|
|
iterator(&training_campaign->m_missions);
|
|
|
|
CampaignMissionPlug *mission = iterator.GetNth(0);
|
|
Check_Object(mission);
|
|
|
|
MString mission_path_name = mission->m_missionName;
|
|
mission_path_name.StripDirectory();
|
|
mission_path_name.StripExtension();
|
|
|
|
Str_Copy(m_iaMissionName, (char *)mission_path_name, 128);
|
|
MWApplication::GetInstance()->m_currentMissionName = MWApplication::GetInstance()->GetLocString(mission->m_displayNameIndex);
|
|
|
|
HeatManager::g_OverrideHeatOption = true;
|
|
|
|
delete training_campaign;
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::GetSupportedRes(void *data[], int count)
|
|
{
|
|
char **res_list = STRARRAYPARAM(1);
|
|
int *num_res = INTARRAYPARAM(2);
|
|
|
|
int num = 0;
|
|
|
|
if(gos_GetMachineInformation( gos_Info_ValidMode, Environment.FullScreenDevice, 640, 480 ))
|
|
{
|
|
FREEANDNULL(res_list[num]);
|
|
res_list[num] = (char *)gos_Malloc(128);
|
|
MString res_name = "640 x 480";
|
|
Str_Copy(
|
|
res_list[num],
|
|
(const char *)res_name,
|
|
res_name.GetLength() + 1
|
|
);
|
|
num ++;
|
|
}
|
|
|
|
if(gos_GetMachineInformation( gos_Info_ValidMode, Environment.FullScreenDevice, 800, 600 ))
|
|
{
|
|
FREEANDNULL(res_list[num]);
|
|
res_list[num] = (char *)gos_Malloc(128);
|
|
MString res_name = "800 x 600";
|
|
Str_Copy(
|
|
res_list[num],
|
|
(const char *)res_name,
|
|
res_name.GetLength() + 1
|
|
);
|
|
num ++;
|
|
}
|
|
|
|
if(gos_GetMachineInformation( gos_Info_ValidMode, Environment.FullScreenDevice, 1024, 768 ))
|
|
{
|
|
FREEANDNULL(res_list[num]);
|
|
res_list[num] = (char *)gos_Malloc(128);
|
|
MString res_name = "1024 x 768";
|
|
Str_Copy(
|
|
res_list[num],
|
|
(const char *)res_name,
|
|
res_name.GetLength() + 1
|
|
);
|
|
num ++;
|
|
}
|
|
|
|
if(gos_GetMachineInformation( gos_Info_ValidMode, Environment.FullScreenDevice, 1280, 1024 ))
|
|
{
|
|
FREEANDNULL(res_list[num]);
|
|
res_list[num] = (char *)gos_Malloc(128);
|
|
MString res_name = "1280 x 1024";
|
|
Str_Copy(
|
|
res_list[num],
|
|
(const char *)res_name,
|
|
res_name.GetLength() + 1
|
|
);
|
|
num ++;
|
|
}
|
|
|
|
if(gos_GetMachineInformation( gos_Info_ValidMode, Environment.FullScreenDevice, 1600, 1200 ))
|
|
{
|
|
FREEANDNULL(res_list[num]);
|
|
res_list[num] = (char *)gos_Malloc(128);
|
|
MString res_name = "1600 x 1200";
|
|
Str_Copy(
|
|
res_list[num],
|
|
(const char *)res_name,
|
|
res_name.GetLength() + 1
|
|
);
|
|
num ++;
|
|
}
|
|
|
|
*num_res = num;
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlSetJoyStickThrottle(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
|
|
Scalar joystick_throttle_center = g_ControlList->JoyStickThrottleCenter();
|
|
Scalar joystick_throttle_dead_low = g_ControlList->JoyStickThrottleLow();
|
|
|
|
// If center and low are close enough, then currently throttle goes one way only,
|
|
// toggle will change throttle to two way
|
|
if (Close_Enough(joystick_throttle_center, joystick_throttle_dead_low)) {
|
|
NotationFile startup_ini("options.ini", NotationFile::Standard, true);
|
|
Stuff::Page *joypage = startup_ini.FindPage("joystick");
|
|
Verify(joypage);
|
|
Scalar center, low, high;
|
|
joypage->GetEntry("BiThrottleCenter", ¢er);
|
|
joypage->GetEntry("BiThrottleLow", &low);
|
|
joypage->GetEntry("BiThrottleHigh", &high);
|
|
g_ControlList->JoyStickThrottleCenter(center, VehicleInterface::GetInstance());
|
|
g_ControlList->JoyStickThrottleLow(low, VehicleInterface::GetInstance());
|
|
g_ControlList->JoyStickThrottleHigh(high, VehicleInterface::GetInstance());
|
|
}
|
|
|
|
// Otherwise throttle is currently two way, toggle will change it to one way
|
|
else {
|
|
NotationFile startup_ini("options.ini", NotationFile::Standard, true);
|
|
Stuff::Page *joypage = startup_ini.FindPage("joystick");
|
|
Verify(joypage);
|
|
Scalar center, high;
|
|
joypage->GetEntry("OneThrottleCenter", ¢er);
|
|
joypage->GetEntry("OneThrottleHigh", &high);
|
|
|
|
g_ControlList->JoyStickThrottleCenter(center, VehicleInterface::GetInstance());
|
|
g_ControlList->JoyStickThrottleLow(center, VehicleInterface::GetInstance());
|
|
g_ControlList->JoyStickThrottleHigh(high, VehicleInterface::GetInstance());
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
MW4Shell::ControlGetJoyStickThrottle(void* data[], int count)
|
|
{
|
|
gosASSERT(Adept::g_ControlList != NULL);
|
|
|
|
Scalar joystick_throttle_center = g_ControlList->JoyStickThrottleCenter();
|
|
Scalar joystick_throttle_dead_low = g_ControlList->JoyStickThrottleLow();
|
|
|
|
// Throttle is one way
|
|
if (Close_Enough(joystick_throttle_center, joystick_throttle_dead_low)) {
|
|
INTPARM(1) = 1;
|
|
}
|
|
|
|
// Throttle is two way
|
|
else {
|
|
INTPARM(1) = 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int MW4Shell::AddBots(int number, int* botIds, int* mechIds)
|
|
{
|
|
gosASSERT(!CTCL_IsConsole());
|
|
if (number > MW4Shell::Instance->networkScenarioCount && number < 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// load that maps options...
|
|
Stuff::MString full_name;
|
|
full_name = "Resource\\Missions\\";
|
|
full_name += MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].missionName;
|
|
full_name += ".nfo";
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
|
|
int botNum = 0;
|
|
if (page != NULL)
|
|
{
|
|
NotationFile scenario_file;
|
|
MString scenario_name;
|
|
page->GetEntry(MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].scenarioTag,&scenario_file);
|
|
|
|
Page *serverPage = scenario_file.FindPage("server");
|
|
ChainOf<Note*> *list = serverPage->MakeNoteChain("bot_");
|
|
Check_Object(list);
|
|
Page::NoteIterator notes(list);
|
|
Note *botNote = notes.ReadAndNext();
|
|
while (botNote)
|
|
{
|
|
NotationFile bot_file;
|
|
botNote->GetEntry(&bot_file);
|
|
Page *botPage = bot_file.FindPage("botdata");
|
|
if (botPage)
|
|
botNum = botNum + AddBots(botPage, botIds+botNum, mechIds+botNum);
|
|
botNote = notes.ReadAndNext();
|
|
}
|
|
delete list;
|
|
}
|
|
else
|
|
{
|
|
|
|
full_name = "Resource\\UserMissions\\";
|
|
full_name += MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].missionName;
|
|
full_name += ".nfo";
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
|
|
if (page != NULL)
|
|
{
|
|
NotationFile scenario_file;
|
|
MString scenario_name;
|
|
page->GetEntry(MW4Shell::Instance->scenarios[MW4Shell::Instance->selectedScenario].scenarioTag,&scenario_file);
|
|
|
|
Page *serverPage = scenario_file.FindPage("server");
|
|
ChainOf<Note*> *list = serverPage->MakeNoteChain("bot_");
|
|
Check_Object(list);
|
|
Page::NoteIterator notes(list);
|
|
Note *botNote = notes.ReadAndNext();
|
|
while (botNote)
|
|
{
|
|
NotationFile bot_file;
|
|
botNote->GetEntry(&bot_file);
|
|
Page *botPage = bot_file.FindPage("botdata");
|
|
if (botPage)
|
|
botNum = botNum + AddBots(botPage, botIds+botNum, mechIds+botNum);
|
|
botNote = notes.ReadAndNext();
|
|
}
|
|
delete list;
|
|
}
|
|
|
|
|
|
}
|
|
return botNum;
|
|
}
|
|
|
|
// If you update the names here, please update Content\Shellscripts\callsign.h as well!
|
|
#define NUM_CALLSIGNS 64
|
|
char* BotNames[NUM_CALLSIGNS] = {
|
|
"Firestorm", "Scarab", "Pocus", "Hacksaw",
|
|
"Gnaw", "Darklord", "Spice", "Rocker",
|
|
"Leepus", "Coolhand", "Piotr", "Propwash",
|
|
"Mecca", "Rusty", "Faith", "Thomcat",
|
|
"kilo romeo", "Tryptic", "Isis", "Suredude",
|
|
"PAINGOD", "Lucky", "Gothmog", "Synth boy",
|
|
"Arioch", "Dark Priest", "Splotch", "Paladin",
|
|
"Macleod", "Super", "BooYah", "Von",
|
|
"azero", "Wraith", "Undead", "mantis",
|
|
"Wicced", "TINY", "Crusher", "Darkman",
|
|
"ULMEERA", "Morfane", "Darkheart", "Joker",
|
|
"Mouse", "Greywolf", "Pyrotech", "Elengil",
|
|
"Undomiel", "Marz", "Kuroshii", "Crow",
|
|
"Conn Man", "Lysosome", "Dax", "HamHouke",
|
|
"Intrepid", "Toad", "oObeaner", "Apophis",
|
|
"Thor", "Sauron", "Pharaoh", "Dicion"
|
|
};
|
|
int BotLevels[NUM_CALLSIGNS] = {
|
|
9,9,9,8,
|
|
6,9,9,2,
|
|
5,6,7,8,
|
|
5,2,7,4,
|
|
3,2,4,7,
|
|
1,0,3,9,
|
|
4,0,5,6,
|
|
7,9,9,6,
|
|
0,1,8,6,
|
|
3,1,9,9,
|
|
9,9,1,9,
|
|
5,9,8,8,
|
|
5,6,5,8,
|
|
9,5,4,4,
|
|
4,4,4,4,
|
|
4,8,9,8
|
|
};
|
|
|
|
// If you update the names here, please update Content\Shellscripts\callsign.h as well!
|
|
|
|
int
|
|
MW4Shell::AddBots(Stuff::Page* botPage, int* botIds, int* mechIds)
|
|
{
|
|
gosASSERT(!CTCL_IsConsole());
|
|
int number;
|
|
if (!botPage->GetEntry("botcount", &number))
|
|
return 0;
|
|
|
|
int maxLevel = 9;
|
|
int minLevel = 0;
|
|
int maxTonnage = 100;
|
|
int minTonnage = 25;
|
|
int maxTotalTonnage = 1600;
|
|
int teamId = -1;
|
|
|
|
botPage->GetEntry("maximumlevel", &maxLevel);
|
|
botPage->GetEntry("minimumlevel", &minLevel);
|
|
Clamp(maxLevel, 0, 9);
|
|
Clamp(minLevel, 0, maxLevel);
|
|
|
|
botPage->GetEntry("team", &teamId);
|
|
teamId--;
|
|
botPage->GetEntry("maximumTonnage", &maxTonnage);
|
|
botPage->GetEntry("minimumTonnage", &minTonnage);
|
|
Clamp(maxTonnage, 25, 100);
|
|
Clamp(minTonnage, 25, maxTonnage);
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *netParams = app->GetLocalNetParams();
|
|
|
|
if (netParams->m_teamAllowed && teamId>=0 && teamId<netParams->m_teamCount) {
|
|
int teamMinTonnage = netParams->m_teamParams[teamId].m_minimumTonnage;
|
|
int teamMaxTonnage = netParams->m_teamParams[teamId].m_maximumTonnage;
|
|
|
|
if (teamMinTonnage > minTonnage)
|
|
minTonnage = teamMinTonnage;
|
|
if (teamMaxTonnage < maxTonnage)
|
|
maxTonnage = teamMaxTonnage;
|
|
|
|
maxTotalTonnage = netParams->m_teamParams[teamId].m_maximumTotalTonnage;
|
|
}
|
|
|
|
if (minTonnage > maxTonnage)
|
|
return 0;
|
|
|
|
for (int i=0; i<number; i++)
|
|
{
|
|
// Deal with team tonnage limits
|
|
if (netParams->m_teamAllowed && teamId>=0 && teamId<netParams->m_teamCount) {
|
|
|
|
Stuff::Scalar currentTotalTonnage = netParams->m_teamParams[teamId].m_currentTotalTonnage;
|
|
|
|
// No more mech can be added within the total tonnage limit
|
|
if (maxTotalTonnage - currentTotalTonnage < Max(minTonnage, 30.0) )
|
|
break;
|
|
}
|
|
|
|
int numPasses = 0;
|
|
while (numPasses<20)
|
|
{
|
|
if (AddOneBot(&botIds[i], &mechIds[i], teamId, minTonnage, maxTonnage, minLevel, maxLevel)>=0)
|
|
{
|
|
if (app->lancemateConnectionData[botIds[i]].lancemateVehicleAccepted)
|
|
break;
|
|
|
|
app->lancemateConnectionData[botIds[i]].Disconnect();
|
|
ServerAdvertiser::RemovePlayerAll(botIds[i]+256, NULL, true);
|
|
}
|
|
numPasses++;
|
|
}
|
|
}
|
|
return i;
|
|
}
|
|
|
|
int
|
|
MW4Shell::FillBotsForAllTeams(int* botIds, int* mechIds)
|
|
{
|
|
if (!MWApplication::GetInstance()->serverFlag)
|
|
return 0;
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *netParams = app->GetLocalNetParams();
|
|
|
|
int numPasses = 0;
|
|
int botNumber = 0;
|
|
bool ret = false;
|
|
while (!ret) {
|
|
// Check to see if we have a full game
|
|
for (int i = 0; i < MWApplication::Maximum_Lancemates; i++)
|
|
{
|
|
if (app->lancemateConnectionData[i].lancemateConnected &&
|
|
!app->lancemateConnectionData[i].lancemateVehicleAccepted)
|
|
{
|
|
app->lancemateConnectionData[i].Disconnect();
|
|
ServerAdvertiser::RemovePlayerAll(i+256, NULL, true);
|
|
}
|
|
}
|
|
app->UpdateAllTeamTotalTonnages();
|
|
numPasses ++;
|
|
if (numPasses>=20)
|
|
break;
|
|
|
|
int player_count = 0;
|
|
for (i = 0; i < MWApplication::Maximum_Lancemates; i++)
|
|
{
|
|
if (app->lancemateConnectionData[i].lancemateConnected)
|
|
player_count++;
|
|
}
|
|
player_count += Network::GetInstance()->GetPlayerCount();
|
|
int bots_to_add = 0;
|
|
if (netParams->m_runDedicated)
|
|
{
|
|
// Somehow dedicated server has a player_count of 1 even though there is no player in it
|
|
bots_to_add = netParams->m_maxBots - (player_count-1);
|
|
}
|
|
else
|
|
{
|
|
bots_to_add = netParams->m_maxBots - player_count;
|
|
}
|
|
if (bots_to_add<=0)
|
|
break;
|
|
|
|
for (i=0; i<bots_to_add; i++)
|
|
{
|
|
int teamId = -1;
|
|
int minTonnage = 25;
|
|
int maxTonnage = 100;
|
|
if (netParams->m_teamAllowed) {
|
|
teamId = FindTeamWithLeastTonnage();
|
|
// All teams are full
|
|
if (teamId < 0) {
|
|
ret = true;
|
|
break;
|
|
}
|
|
minTonnage = netParams->m_teamParams[teamId].m_minimumTonnage;
|
|
maxTonnage = netParams->m_teamParams[teamId].m_maximumTonnage;
|
|
}
|
|
else {
|
|
|
|
minTonnage = netParams->m_minimumTonnage;
|
|
maxTonnage = netParams->m_maximumTonnage;
|
|
}
|
|
|
|
AddOneBot(&botIds[botNumber], &mechIds[botNumber], teamId, minTonnage, maxTonnage, 0, 9);
|
|
botNumber++;
|
|
|
|
// We've tried enough
|
|
if (botNumber >= 256) {
|
|
ret = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// update everybody's status
|
|
app->SendLobbyStatus();
|
|
|
|
// send a tally on team members to everyone
|
|
char* message = app->GetTeamCount();
|
|
if (message)
|
|
{
|
|
app->SendChat(
|
|
Connection::Local->GetID(),
|
|
MWApplication::SystemBroadcast,
|
|
0,
|
|
message);
|
|
delete [] message;
|
|
}
|
|
return botNumber;
|
|
}
|
|
|
|
int
|
|
MW4Shell::AddOneBot(int* botId, int* mechId, int teamId, int minTon, int maxTon, int minLev, int maxLev)
|
|
{
|
|
gosASSERT(!CTCL_IsConsole());
|
|
if (!MWApplication::GetInstance()->serverFlag)
|
|
return -1;
|
|
|
|
if (minTon > maxTon)
|
|
return -1;
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *netParams = app->GetLocalNetParams();
|
|
|
|
// Ramdonly pick a mech
|
|
int mechIndex = rand()%MW4Shell::Instance->m_mechCount;
|
|
while (mechIndex==0 ||
|
|
MW4Shell::Instance->m_mechIDs[mechIndex] == ResourceID::Null)
|
|
mechIndex = rand()%MW4Shell::Instance->m_mechCount;
|
|
|
|
int maxTotalTonnage = 1600;
|
|
Stuff::Scalar currentTotalTonnage = 0.0f;
|
|
if (netParams->m_teamAllowed && teamId>=0 && teamId<netParams->m_teamCount) {
|
|
|
|
int maxTotalTonnage = netParams->m_teamParams[teamId].m_maximumTotalTonnage;
|
|
Stuff::Scalar currentTotalTonnage = netParams->m_teamParams[teamId].m_currentTotalTonnage;
|
|
|
|
// No more mech can be added within the total tonnage limit
|
|
if (maxTotalTonnage - currentTotalTonnage < Max(minTon, 30.0) )
|
|
return -1;
|
|
|
|
}
|
|
|
|
MWTable::TableIterator *mech_iterator;
|
|
Check_Object(MWApplication::GetInstance()->m_mechTable);
|
|
mech_iterator = MWApplication::GetInstance()->m_mechTable->MakeTableIterator();
|
|
MWTableEntry *mech_entry;
|
|
|
|
int stockMechIndex = 0;
|
|
while((mech_entry = mech_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mech_entry);
|
|
if (MW4Shell::Instance->m_mechIDs[mechIndex] == mech_entry->GetEntryResourceID())
|
|
break;
|
|
stockMechIndex++;
|
|
}
|
|
|
|
int numPasses = 0;
|
|
while (mechIndex==0 ||
|
|
MW4Shell::Instance->m_mechIDs[mechIndex] == ResourceID::Null ||
|
|
stockMechIndex > LastMechID ||
|
|
g_aMechSpecs[stockMechIndex].m_fTonnage > Min(maxTotalTonnage-currentTotalTonnage, maxTon) ||
|
|
g_aMechSpecs[stockMechIndex].m_fTonnage < minTon) {
|
|
mechIndex = rand()%MW4Shell::Instance->m_mechCount;
|
|
stockMechIndex = 0;
|
|
mech_iterator->First();
|
|
while((mech_entry = mech_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(mech_entry);
|
|
if (MW4Shell::Instance->m_mechIDs[mechIndex] == mech_entry->GetEntryResourceID())
|
|
break;
|
|
stockMechIndex++;
|
|
}
|
|
numPasses++;
|
|
|
|
// try not to loop forever
|
|
if (numPasses>20) {
|
|
delete mech_iterator;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
delete mech_iterator;
|
|
|
|
DWORD langResources = gos_OpenResourceDLL("ScriptStrings.dll");
|
|
char* clan = (char*)gos_Malloc(256);
|
|
int level;
|
|
if (maxLev == minLev)
|
|
level = maxLev;
|
|
else
|
|
level = rand()%(maxLev-minLev+1) + minLev;
|
|
sprintf(clan, "%s%d", gos_GetResourceString(langResources, IDS_MP_LOBBY_BOT_LEVEL), level);
|
|
|
|
char* name = BotNames[rand()%NUM_CALLSIGNS];
|
|
char* mechName = "";
|
|
|
|
void* params[3];
|
|
params[0] = (void*)&level;
|
|
params[1] = (void*)&name;
|
|
params[2] = (void*)&clan;
|
|
|
|
int botNumber = MW4Shell::AddBot(NULL, 3, params);
|
|
params[0] = (void**)&botNumber;
|
|
|
|
if (botNumber != -1)
|
|
{
|
|
params[1] = (void**)&mechIndex;
|
|
params[2] = (void**)&mechName;
|
|
|
|
MW4Shell::SetMechBot(NULL, 3, params);
|
|
|
|
if (netParams->m_teamAllowed && teamId>=0 && teamId<netParams->m_teamCount)
|
|
{
|
|
params[1] = (void**)&teamId;
|
|
SetTeamBot(NULL, 2, (void**)params);
|
|
}
|
|
}
|
|
|
|
*botId = botNumber;
|
|
*mechId = mechIndex;
|
|
|
|
gos_CloseResourceDLL(langResources);
|
|
FREE_PTR(clan);
|
|
|
|
return botNumber;
|
|
}
|
|
|
|
int
|
|
MW4Shell::FindTeamWithLeastTonnage()
|
|
{
|
|
if (!MWApplication::GetInstance()->serverFlag)
|
|
return 0;
|
|
|
|
MWApplication *app = Cast_Object(MWApplication *, Application::GetInstance());
|
|
NetMissionParameters::MWNetMissionParameters *netParams = app->GetLocalNetParams();
|
|
|
|
if (!netParams->m_teamAllowed)
|
|
return -1;
|
|
|
|
int teamId = -1;
|
|
Stuff::Scalar tonnagePercent = 1.0f;
|
|
|
|
for (int i=0; i<netParams->m_teamCount; i++) {
|
|
|
|
int amount_on_requested_team = 0;
|
|
for (int j = 0; j < Maximum_Players; ++j)
|
|
{
|
|
if (app->servedConnectionData[j].clientConnected && app->servedConnectionData[j].pilotTeam == i)
|
|
{
|
|
++amount_on_requested_team;
|
|
}
|
|
}
|
|
|
|
for (j = 0; j < Maximum_Lancemates; ++j)
|
|
{
|
|
if (app->lancemateConnectionData[j].lancemateConnected && app->lancemateConnectionData[j].pilotTeam == i)
|
|
{
|
|
++amount_on_requested_team;
|
|
}
|
|
}
|
|
|
|
if ((amount_on_requested_team + 1) <= netParams->m_teamParams[i].m_maxPlayersOnTeam)
|
|
{
|
|
|
|
int minTonnage = netParams->m_teamParams[i].m_minimumTonnage;
|
|
int maxTotalTonnage = netParams->m_teamParams[i].m_maximumTotalTonnage;
|
|
Stuff::Scalar currentTotalTonnage = netParams->m_teamParams[i].m_currentTotalTonnage;
|
|
|
|
if (currentTotalTonnage/maxTotalTonnage < tonnagePercent &&
|
|
maxTotalTonnage - currentTotalTonnage >= Max(minTonnage, 30.0)){
|
|
|
|
tonnagePercent = currentTotalTonnage/maxTotalTonnage;
|
|
teamId = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return teamId;
|
|
}
|
|
|
|
int
|
|
MW4Shell::GetScenarioCount(void *instance, int, void *data[])
|
|
{
|
|
int ruleType = INTPARM(0);
|
|
|
|
int networkScenarioCount = 0;
|
|
|
|
Stuff::MString missions_path = "Resource\\Missions\\*.nfo";
|
|
Stuff::Directory *resource_directory;
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
const char *file_name;
|
|
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Resource\\Missions\\";
|
|
full_name += file_name;
|
|
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
|
|
Page *info_page = notefile.FindPage("info");
|
|
|
|
if (info_page != NULL)
|
|
{
|
|
const char *long_mission_name;
|
|
if (info_page->GetEntry("longname",&long_mission_name))
|
|
{
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
if (page != NULL)
|
|
{
|
|
ChainIteratorOf<Note*> *note_iterator = page->MakeNoteIterator();
|
|
|
|
Note *note;
|
|
while ((note = note_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
|
|
NotationFile scenario_file;
|
|
note->GetEntry(&scenario_file);
|
|
|
|
|
|
Page *server_page = scenario_file.FindPage("server");
|
|
if (server_page)
|
|
{
|
|
int rule_set;
|
|
const char *scenario_read_name = NULL;
|
|
|
|
if (server_page->GetEntry("ruleset",&rule_set) && server_page->GetEntry("name",&scenario_read_name))
|
|
{
|
|
if (rule_set == ruleType)
|
|
{
|
|
++networkScenarioCount;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
delete note_iterator;
|
|
}
|
|
}
|
|
}
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
|
|
|
|
missions_path = "Resource\\UserMissions\\*.nfo";
|
|
resource_directory = new Stuff::Directory(missions_path, true);
|
|
Check_Object(resource_directory);
|
|
|
|
|
|
while((file_name = resource_directory->GetCurrentFileName()) != NULL)
|
|
{
|
|
|
|
Stuff::MString full_name;
|
|
full_name = "Resource\\UserMissions\\";
|
|
full_name += file_name;
|
|
|
|
|
|
NotationFile notefile(full_name);
|
|
|
|
|
|
Page *info_page = notefile.FindPage("info");
|
|
|
|
if (info_page != NULL)
|
|
{
|
|
const char *long_mission_name;
|
|
if (info_page->GetEntry("longname",&long_mission_name))
|
|
{
|
|
|
|
Page *page = notefile.FindPage("scenarios");
|
|
if (page != NULL)
|
|
{
|
|
ChainIteratorOf<Note*> *note_iterator = page->MakeNoteIterator();
|
|
|
|
Note *note;
|
|
while ((note = note_iterator->ReadAndNext()) != NULL)
|
|
{
|
|
|
|
NotationFile scenario_file;
|
|
note->GetEntry(&scenario_file);
|
|
|
|
|
|
Page *server_page = scenario_file.FindPage("server");
|
|
if (server_page)
|
|
{
|
|
int rule_set;
|
|
const char *scenario_read_name = NULL;
|
|
|
|
if (server_page->GetEntry("ruleset",&rule_set) && server_page->GetEntry("name",&scenario_read_name))
|
|
{
|
|
if (rule_set == ruleType)
|
|
{
|
|
++networkScenarioCount;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
delete note_iterator;
|
|
}
|
|
}
|
|
}
|
|
|
|
resource_directory->AdvanceCurrentFile();
|
|
}
|
|
delete resource_directory;
|
|
return networkScenarioCount;
|
|
}
|
|
// jcem begin
|
|
char* MW4Shell::GetShellString(int index)
|
|
{
|
|
Verify(m_dwShellResources);
|
|
|
|
return gos_GetResourceString(m_dwShellResources, index);
|
|
}
|
|
|
|
int __stdcall CTCL_IsValidName(void* instance, int args, void* data[])
|
|
{
|
|
const char* pcsz = STRPARM(0);
|
|
char c;
|
|
BOOL bAllSpace = TRUE;
|
|
|
|
while((c = *pcsz++) != '\0') {
|
|
switch(c) {
|
|
case '\"':
|
|
case '*':
|
|
case '?':
|
|
case '/':
|
|
case ':':
|
|
case '<':
|
|
case '>':
|
|
case '|':
|
|
case '&':
|
|
case '\\':
|
|
case ',':
|
|
return 0;
|
|
case ' ':
|
|
break;
|
|
default:
|
|
if (c < 0x20)
|
|
return 0;
|
|
bAllSpace = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return !bAllSpace;
|
|
}
|
|
|
|
int __stdcall CTCL_GetTeamParams(void* instance, int args, void* data[])
|
|
{
|
|
int* team_count = INTARRAYPARAM(0); // [8]
|
|
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
NetMissionParameters::MWNetMissionParameters* params = app->GetLocalNetParams();
|
|
if (params->m_teamAllowed) {
|
|
int i, nTeamCount = params->m_teamCount;
|
|
for(i = 0; i < nTeamCount; i++) {
|
|
team_count[i] = params->m_teamParams[i].m_maxPlayersOnTeam;
|
|
}
|
|
return nTeamCount;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_SetCDSP(void* instance, int args, void* data[])
|
|
{
|
|
ASSERT(CTCL_IsConsole());
|
|
CTCL_DefaultHostSetup(1);
|
|
return 0;
|
|
}
|
|
|
|
void CTCL_API CTCL_InitMechDatas()
|
|
{
|
|
//CTCL_ClearMechDatas();
|
|
if (!g_ppMech) {
|
|
MW4Shell::Instance->InitMPScreen();
|
|
|
|
int k, nMechCount = MW4Shell::Instance->m_mechCount;
|
|
g_ppMech = (char**)malloc(sizeof(char*) * nMechCount);
|
|
g_pStockIds = (int*)malloc(sizeof(int) * nMechCount);
|
|
for(k = 0; k < nMechCount; k++) {
|
|
g_ppMech[k] = NULL;
|
|
g_pStockIds[k] = 0;
|
|
}
|
|
void* data0[3] = {
|
|
0,
|
|
(void*)g_ppMech,
|
|
g_pStockIds,
|
|
};
|
|
MW4Shell::Instance->GetMechs(data0, 3);
|
|
}
|
|
}
|
|
|
|
void CTCL_API CTCL_ClearMechDatas()
|
|
{
|
|
if (g_ppMech) {
|
|
free(g_ppMech);
|
|
g_ppMech = NULL;
|
|
}
|
|
if (g_pStockIds) {
|
|
free(g_pStockIds);
|
|
g_pStockIds = NULL;
|
|
}
|
|
}
|
|
|
|
void CTCL_API CTCL_CheckNetConnectedToServer()
|
|
{
|
|
if (MW4Shell::NetConnectedToServer(NULL, 0, NULL)) {
|
|
//MWApplication* app = MWApplication::GetInstance();
|
|
|
|
//$$COOP
|
|
CTCL_InitMechDatas();
|
|
if (g_bIsServer) {
|
|
MW4Shell::Instance->InitNetworkScenarios(NULL, 0, (void**)NULL);
|
|
|
|
g_nMech4Comm = 3;
|
|
} else {
|
|
if (g_bCOOP)
|
|
g_nMech4Comm = 0;
|
|
else
|
|
g_nMech4Comm = 4;
|
|
}
|
|
} else {
|
|
if (25.0f <= (gos_GetElapsedTime() - g_fLastGameStart)) {
|
|
g_nMech4Comm = 0;
|
|
if (!g_bCOOP) {
|
|
if (g_bIsServer)
|
|
CTCL_DoSendGameReturn(_EGR_ErrCreateSession);
|
|
else
|
|
CTCL_DoSendGameReturn(_EGR_ErrJoinSession);
|
|
}
|
|
Application::GetInstance()->QueStopGame();
|
|
}
|
|
}
|
|
}
|
|
|
|
void _stdcall CTCL_SetMissionParamsBy(void* pNMP, int nSize)
|
|
{
|
|
gosASSERT(MW4Shell::NetConnectedToServer(NULL, 0, NULL));
|
|
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
|
|
NetMissionParameters::MWNetMissionParameters* lparams = app->GetLocalNetParams();
|
|
|
|
NetMissionParameters::MWNetMissionParameters params;
|
|
|
|
MemoryStream stream(pNMP, nSize, 0);
|
|
params.LoadParameters(&stream);
|
|
|
|
int param, value;
|
|
void *data_int[2] = {
|
|
¶m,
|
|
&value,
|
|
};
|
|
|
|
//if (lparams->m_ruleType != params.m_ruleType) {
|
|
param = RULE_TYPE_PARAMETER;
|
|
value = params.m_ruleType;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
|
|
MW4Shell::Instance->InitNetworkScenarios(NULL, 0, NULL);
|
|
//return;
|
|
//}
|
|
|
|
//if (!app->haveNetworkMap || (MW4Shell::Instance->selectedScenario != params.m_mapID) || (lparams->m_mapID != params.m_mapID)) {
|
|
param = MAP_ID_PARAMETER;
|
|
value = params.m_mapID;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
|
|
MW4Shell::Instance->selectedScenario = -1;
|
|
MW4Shell::SelectNetworkScenarioDirect(value);
|
|
//return;
|
|
//}
|
|
|
|
//if (lparams->m_weather != params.m_weather) {
|
|
param = WEATHER_PARAMETER;
|
|
value = params.m_weather;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
|
|
//if (lparams->m_visibility != params.m_visibility) {
|
|
param = VISIBILITY_PARAMETER;
|
|
value = params.m_visibility;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
|
|
//if (lparams->m_isNight != params.m_isNight) {
|
|
param = NIGHT_TIME_PARAMETER;
|
|
value = params.m_isNight;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
app->m_isNight = params.m_isNight ? true: false;
|
|
|
|
//if (lparams->m_gameLength != params.m_gameLength) {
|
|
param = GAME_LENGTH_PARAMETER;
|
|
value = params.m_gameLength;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
lparams->m_killLimit = params.m_killLimit;
|
|
lparams->m_killLimitNumber = params.m_killLimitNumber;
|
|
lparams->m_respawnLimit = params.m_respawnLimit;
|
|
lparams->m_respawnLimitNumber = params.m_respawnLimitNumber;
|
|
//params->m_isNight = params.m_isNight;
|
|
lparams->m_onlyStockMech = params.m_onlyStockMech;
|
|
lparams->m_playMissionReview = 0; // params.m_playMissionReview;
|
|
lparams->m_unlimitedAmmo = params.m_unlimitedAmmo;
|
|
lparams->m_heatOn = params.m_heatOn;
|
|
lparams->m_friendlyFirePercentage = params.m_friendlyFirePercentage; // or 0
|
|
lparams->m_splashOn = params.m_splashOn;
|
|
lparams->m_weaponjamOn = params.m_weaponjamOn;
|
|
lparams->m_ammobayfireOn = params.m_ammobayfireOn;
|
|
// MSL 5.05 Advance Mode
|
|
lparams->m_advancemodeOn = params.m_advancemodeOn;
|
|
// MSL 5.06 Armor Mode
|
|
lparams->m_armormodeOn = params.m_armormodeOn;
|
|
/*
|
|
KILL_LIMIT_NUMBER_PARAMETER;
|
|
RESPAWN_LIMIT_NUMBER_PARAMETER;
|
|
ONLY_STOCK_MECH_PARAMETER;
|
|
PLAY_MISSION_REVIEW_PARAMETER;
|
|
MAXIMUM_TONNAGE_PARAMETER;
|
|
KILL_LIMIT_PARAMETER;
|
|
RESPAWN_LIMIT_PARAMETER;
|
|
*/
|
|
//if (lparams->m_radarMode != params.m_radarMode) {
|
|
param = RADAR_MODE_PARAMETER;
|
|
value = params.m_radarMode;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
#if 0
|
|
param = params.m_ruleType; // param = RULE_TYPE_PARAMETER, value = params.m_ruleType;
|
|
shl->GetGameTypeString(NULL, 1, data_int);
|
|
#else
|
|
strcpy(MW4Shell::s_gameTypeStr, shl->GetRuleName(params.m_ruleType));
|
|
MW4Shell::m_gameTypeStr = MW4Shell::s_gameTypeStr;
|
|
#endif
|
|
}
|
|
|
|
void CTCL_API CTCL_SetMissionParams()
|
|
{
|
|
if (MW4Shell::NetConnectedToServer(NULL, 0, NULL)) {
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
|
|
if (g_bCOOP) {
|
|
int param, value;
|
|
void *data_int[2] = {
|
|
¶m,
|
|
&value,
|
|
};
|
|
|
|
//if (lparams->m_ruleType != params.m_ruleType) {
|
|
param = RULE_TYPE_PARAMETER;
|
|
value = StockAttrition;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
|
|
MW4Shell::Instance->InitNetworkScenarios(NULL, 0, NULL);
|
|
//return;
|
|
//}
|
|
|
|
//if (!app->haveNetworkMap || (MW4Shell::Instance->selectedScenario != params.m_mapID) || (lparams->m_mapID != params.m_mapID)) {
|
|
param = MAP_ID_PARAMETER;
|
|
value = 0;
|
|
for(int i = 0; i < MW4Shell::Instance->networkScenarioCount; i++)
|
|
{
|
|
if (strcmp(MW4Shell::Instance->scenarios[i].longMissionName, "ScarabStronghold") == 0) {
|
|
value = i;
|
|
break;
|
|
}
|
|
}
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
|
|
MW4Shell::Instance->selectedScenario = -1;
|
|
MW4Shell::SelectNetworkScenarioDirect(value);
|
|
//return;
|
|
//}
|
|
/*//if (lparams->m_weather != params.m_weather) {
|
|
param = WEATHER_PARAMETER;
|
|
value = 1; // 1-on,0-off
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}*/
|
|
|
|
/*//if (lparams->m_visibility != params.m_visibility) {
|
|
param = VISIBILITY_PARAMETER;
|
|
value = 0;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}*/
|
|
|
|
//if (lparams->m_isNight != params.m_isNight) {
|
|
param = NIGHT_TIME_PARAMETER;
|
|
value = 0; // 0-day, 1-night
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
app->m_isNight = value ? true: false;
|
|
|
|
//if (lparams->m_gameLength != params.m_gameLength) {
|
|
param = GAME_LENGTH_PARAMETER;
|
|
extern int g_nTimeList_Value;
|
|
#ifdef _DEBUG
|
|
value = g_nTimeList_Value; // 0; // in minute
|
|
#else // !_DEBUG
|
|
value = g_nTimeList_Value; // in minute
|
|
#endif // _DEBUG
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
NetMissionParameters::MWNetMissionParameters* lparams = app->GetLocalNetParams();
|
|
|
|
lparams->m_killLimit = 0; // no kill limit - ��ǥġ
|
|
lparams->m_killLimitNumber = 0;
|
|
lparams->m_respawnLimit = 0; // ���������� �� ����
|
|
lparams->m_respawnLimitNumber = 0; // ������
|
|
//params->m_isNight = params.m_isNight;
|
|
lparams->m_onlyStockMech = FALSE;
|
|
lparams->m_playMissionReview = 0; // params.m_playMissionReview;
|
|
lparams->m_unlimitedAmmo = 1;
|
|
lparams->m_heatOn = 0;
|
|
lparams->m_friendlyFirePercentage = 0; // 100 or 0
|
|
lparams->m_splashOn = 0;
|
|
lparams->m_weaponjamOn = 0;
|
|
lparams->m_ammobayfireOn = 0;
|
|
// MSL 5.05 Advance Mode
|
|
lparams->m_advancemodeOn = 0;
|
|
// MSL 5.06 Armor Mode
|
|
lparams->m_armormodeOn = 0;
|
|
/*
|
|
KILL_LIMIT_NUMBER_PARAMETER;
|
|
RESPAWN_LIMIT_NUMBER_PARAMETER;
|
|
ONLY_STOCK_MECH_PARAMETER;
|
|
PLAY_MISSION_REVIEW_PARAMETER;
|
|
MAXIMUM_TONNAGE_PARAMETER;
|
|
KILL_LIMIT_PARAMETER;
|
|
RESPAWN_LIMIT_PARAMETER;
|
|
*/
|
|
//if (lparams->m_radarMode != params.m_radarMode) {
|
|
param = RADAR_MODE_PARAMETER;
|
|
value = 3; // unlimited;
|
|
MW4Shell::SetNetworkMissionParamater(NULL, 2, data_int);
|
|
//return;
|
|
//}
|
|
lparams->m_joinInProgress = 0;
|
|
|
|
app->parametersDirty = true;
|
|
} else {
|
|
int nSize;
|
|
void* pNMP = CTCL_LoadNMP(nSize);
|
|
ASSERT(pNMP);
|
|
|
|
CTCL_SetMissionParamsBy(pNMP, nSize);
|
|
|
|
app->parametersDirty = true;
|
|
|
|
//$$COOP
|
|
CTCL_DoSendGameReturn(_EGR_OkCreateSession);
|
|
}
|
|
g_nMech4Comm = 5;
|
|
}
|
|
}
|
|
|
|
void CTCL_API CTCL_CheckMissionParams()
|
|
{
|
|
if (MW4Shell::NetConnectedToServer(NULL, 0, NULL)) {
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
|
|
//$$COOP
|
|
if (app->haveNetworkMap) {
|
|
NetMissionParameters::MWNetMissionParameters* sparams = app->GetServerNetParams();
|
|
|
|
int nSize;
|
|
void* pNMP = CTCL_LoadNMP(nSize);
|
|
ASSERT(pNMP);
|
|
|
|
NetMissionParameters::MWNetMissionParameters params;
|
|
MemoryStream stream(pNMP, nSize, 0);
|
|
params.LoadParameters(&stream);
|
|
|
|
int param, value;
|
|
void *data_int[2] = {
|
|
¶m,
|
|
&value,
|
|
};
|
|
|
|
BOOL bDiff = FALSE;
|
|
bDiff = sparams->m_ruleType != params.m_ruleType ? TRUE: bDiff;
|
|
bDiff = sparams->m_mapID != params.m_mapID ? TRUE: bDiff;
|
|
bDiff = sparams->m_visibility != params.m_visibility ? TRUE: bDiff;
|
|
bDiff = sparams->m_weather != params.m_weather ? TRUE: bDiff;
|
|
bDiff = sparams->m_isNight != params.m_isNight ? TRUE: bDiff;
|
|
bDiff = sparams->m_gameLength != params.m_gameLength ? TRUE: bDiff;
|
|
bDiff = sparams->m_radarMode != params.m_radarMode ? TRUE: bDiff;
|
|
bDiff = sparams->m_onlyStockMech != params.m_onlyStockMech ? TRUE: bDiff;
|
|
//bDiff = sparams->m_playMissionReview = 0;
|
|
bDiff = sparams->m_killLimit != params.m_killLimit ? TRUE: bDiff;
|
|
bDiff = sparams->m_killLimitNumber != params.m_killLimitNumber ? TRUE: bDiff;
|
|
bDiff = sparams->m_respawnLimit != params.m_respawnLimit ? TRUE: bDiff;
|
|
bDiff = sparams->m_respawnLimitNumber != params.m_respawnLimitNumber ? TRUE: bDiff;
|
|
bDiff = sparams->m_unlimitedAmmo != params.m_unlimitedAmmo ? TRUE: bDiff;
|
|
bDiff = sparams->m_heatOn != params.m_heatOn ? TRUE: bDiff;
|
|
bDiff = sparams->m_friendlyFirePercentage != params.m_friendlyFirePercentage ? TRUE: bDiff; // or 0
|
|
bDiff = sparams->m_splashOn != params.m_splashOn ? TRUE: bDiff;
|
|
bDiff = sparams->m_weaponjamOn != params.m_weaponjamOn ? TRUE: bDiff;
|
|
bDiff = sparams->m_ammobayfireOn != params.m_ammobayfireOn ? TRUE: bDiff;
|
|
// MSL 5.05 Advance Mode
|
|
bDiff = sparams->m_advancemodeOn != params.m_advancemodeOn ? TRUE: bDiff;
|
|
// MSL 5.06 Armor Mode
|
|
bDiff = sparams->m_armormodeOn != params.m_armormodeOn ? TRUE: bDiff;
|
|
if (!bDiff) {
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
#if 0
|
|
param = params.m_ruleType; // param = RULE_TYPE_PARAMETER, value = params.m_ruleType;
|
|
shl->GetGameTypeString(NULL, 1, data_int);
|
|
#else
|
|
strcpy(MW4Shell::s_gameTypeStr, shl->GetRuleName(params.m_ruleType));
|
|
MW4Shell::m_gameTypeStr = MW4Shell::s_gameTypeStr;
|
|
#endif
|
|
param = SCENARIO_NAME_PARAMETER;
|
|
shl->GetNetworkMissionParamater(sparams, 1, data_int);
|
|
|
|
g_nMech4Comm = 5;
|
|
}
|
|
} else {
|
|
/*static Time s_elapsed_time = 0.0;
|
|
Time elapsed_time = gos_GetElapsedTime() - s_elapsed_time;
|
|
if (elapsed_time > 2.0f)
|
|
{
|
|
// this only sends to lobby players..
|
|
s_elapsed_time = gos_GetElapsedTime();
|
|
Network::GetInstance()->SendNetMessage(Connection::Server->GetID(), MWApplication::RequestMissionParameterMessageID, NULL, true);
|
|
}*/
|
|
}
|
|
} else {
|
|
}
|
|
}
|
|
|
|
void CTCL_CheckMech(SPlayerInfo& PI)
|
|
{
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
|
|
if (!((0 <= PI.m_nMechIndex) && (PI.m_nMechIndex < shl->m_mechCount))) {
|
|
char* pszMech = &PI.m_szMech[0];
|
|
if (!*pszMech) {
|
|
strcpy(pszMech, "$err");
|
|
}
|
|
int nLen = strlen(pszMech);
|
|
int kk;
|
|
for(kk = 0; kk < shl->m_mechCount; kk++)
|
|
{
|
|
const char* pcszMech2 = g_ppMech[kk];
|
|
if (*pszMech == '$') {
|
|
int nLen2 = strlen(pcszMech2);
|
|
int nPos = nLen2 - nLen;
|
|
if ((0 < nPos) && (strcmpi(pszMech, &pcszMech2[nPos]) == 0)) {
|
|
break;
|
|
}
|
|
} else {
|
|
if (strcmpi(pszMech, pcszMech2) == 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
PI.m_nMechIndex = (kk < shl->m_mechCount) ? kk: shl->m_mechCount - 1;
|
|
}
|
|
const Adept::ResourceID& ResID = shl->m_mechIDs[PI.m_nMechIndex];
|
|
PI.m_fileID = ResID.GetFileID();
|
|
PI.m_recordID = ResID.GetRecordID();
|
|
strcpy(&PI.m_szMech[0], g_ppMech[PI.m_nMechIndex]);
|
|
}
|
|
|
|
void CTCL_API CTCL_SetMechs()
|
|
{
|
|
if (MW4Shell::NetConnectedToServer(NULL, 0, NULL)) {
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
|
|
//$$COOP
|
|
if (g_bIsServer) {
|
|
if (app->parametersDirty)
|
|
return;
|
|
}
|
|
NetMissionParameters::MWNetMissionParameters* params = g_bIsServer ? app->GetLocalNetParams(): app->GetServerNetParams();
|
|
|
|
BOOL bTeam;
|
|
bTeam = !!params->m_teamAllowed;
|
|
|
|
int nRet;
|
|
|
|
int k, nMechIndex;
|
|
char* pszMechName;
|
|
|
|
CTCL_CheckMech(g_aPlayerInfos[0]);
|
|
pszMechName = &g_aPlayerInfos[0].m_szMech[0];
|
|
nMechIndex = g_aPlayerInfos[0].m_nMechIndex;
|
|
void* data_mech[3] = {
|
|
0,
|
|
&nMechIndex,
|
|
&pszMechName,
|
|
};
|
|
shl->SetMech(data_mech, 3);
|
|
if (bTeam)
|
|
{
|
|
app->SendTeamRequest(g_aPlayerInfos[0].m_nTeamOrSkin);
|
|
}
|
|
else
|
|
{
|
|
int nSkin = g_aPlayerInfos[0].m_nTeamOrSkin;
|
|
void* data_skin[1] = {&nSkin,};
|
|
shl->SelectSkin(NULL, 1, data_skin);
|
|
}
|
|
app->SendVehicleRequest();
|
|
|
|
if (g_bIsServer) {
|
|
for(int i = 1; i < g_nPlayerInfos; i++) {
|
|
SPlayerInfo& PI = g_aPlayerInfos[i];
|
|
if (!PI.m_bBot)
|
|
continue;
|
|
char* pszName = &PI.m_szName[0];
|
|
int nBotLevel = PI.m_nLevelOrTesla + 1;
|
|
void* data_clan[3] = {
|
|
&nBotLevel,
|
|
&pszName,
|
|
&pszName, //clan
|
|
};
|
|
|
|
nRet = MW4Shell::AddBot(NULL/*instance*/, 3/*numParams*/, data_clan);
|
|
if (nRet != -1) {
|
|
int bot_number = nRet;
|
|
CTCL_CheckMech(PI);
|
|
pszMechName = &PI.m_szMech[0];
|
|
nMechIndex = PI.m_nMechIndex;
|
|
void* data_mech_bot[3] = {
|
|
&bot_number,
|
|
&nMechIndex,
|
|
&pszMechName,
|
|
};
|
|
nRet = MW4Shell::SetMechBot(NULL, 3, data_mech_bot);
|
|
|
|
if (bTeam) {
|
|
app->RequestLancemateTeam(bot_number, PI.m_nTeamOrSkin);
|
|
} else {
|
|
}
|
|
} else {
|
|
//...
|
|
}
|
|
}
|
|
} else {
|
|
}
|
|
g_nMech4Comm = 7;
|
|
} else {
|
|
}
|
|
}
|
|
|
|
void CTCL_API CTCL_CheckClientReady()
|
|
{
|
|
//$$COOP
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
if ((Connection::Server != NULL) && (Connection::Local != NULL)) {
|
|
if (app->localVehicelAccepted == VEHICLE_ACCEPTED) {
|
|
if (app->haveNetworkMap) {
|
|
if (g_bIsServer) {
|
|
g_nMech4Comm = 8;
|
|
} else {
|
|
app->SetClientReady();
|
|
CTCL_DoSendGameReturn(_EGR_OkJoinSession);
|
|
g_nMech4Comm = 0;
|
|
}
|
|
}
|
|
} else {
|
|
}
|
|
}
|
|
}
|
|
|
|
void CTCL_API CTCL_CheckServerReady()
|
|
{
|
|
//$$COOP
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
int i, nOK, nCount = Network::GetInstance()->GetPlayerCount();
|
|
|
|
BOOL bOK = FALSE;
|
|
if (nCount == (g_nTeslas + 1)) { // ���� Ŭ���̾�Ʈ�� ������ �Ǿ� ���� ��...
|
|
for(nOK = 0, i = 0; i < Maximum_Players; ++i) {
|
|
if (i != Connection::Server->GetID()) {
|
|
const MechWarrior4::ServedConnectionData& scd = app->servedConnectionData[i];
|
|
if (scd.clientReady && scd.clientVehicleAccepted) {
|
|
nOK++;
|
|
}
|
|
}
|
|
}
|
|
if (g_nTeslas == nOK) {
|
|
for(nOK = 0, i = 0; i < Maximum_Lancemates; i++) {
|
|
const MechWarrior4::LancemateConnectionData& lcd = app->lancemateConnectionData[i];
|
|
if (lcd.lancemateConnected && lcd.lancemateVehicleAccepted) {
|
|
nOK++;
|
|
}
|
|
}
|
|
if (nOK == g_nBOTs) {
|
|
bOK = TRUE;
|
|
}
|
|
}
|
|
if (!bOK) {
|
|
app->VerifyAllPlayerVehicles();
|
|
}
|
|
}
|
|
|
|
if (bOK) {
|
|
CTCL_StartGame(FALSE);
|
|
}
|
|
}
|
|
|
|
void CTCL_API CTCL_DefaultHostSetup(int nMode)
|
|
{
|
|
// nMode - 0 // CTCL_DoCreateGame()
|
|
// nMode - 1 // CTCL_SetCDSP from ConLonbby.script
|
|
// nMode - 2 // LoadServerOptions()
|
|
// nMode - 3 // LoadOverideParameters()
|
|
// nMode - 4 // CTCL_DoMission(0, ...)
|
|
if (CTCL_IsNone())
|
|
return;
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
NetMissionParameters::MWNetMissionParameters* params = app->GetLocalNetParams();
|
|
|
|
// hostgame1.script
|
|
extern int AdvertiseThisGame;
|
|
AdvertiseThisGame = 0;
|
|
|
|
params->m_reportStats = 0;
|
|
params->m_joinInProgress = 1;
|
|
params->m_joinInProgressCutOff = 0;
|
|
params->m_joinInProgressCutOffTime = 1000;
|
|
params->m_runDedicated = 0;
|
|
params->m_serverRecycle = 0;
|
|
params->m_recycleDelay = 30;
|
|
params->m_useMapCycle = 0;
|
|
params->m_allowdecaltransfer = 0;
|
|
if (g_bCOOP) {
|
|
Environment.NetworkMaxPlayers = 16;
|
|
//if (CTCL_GetTeslaCount() < CTCL_GetTeslaCountAll()) {
|
|
// any cameraship installed... so 1 more player can join
|
|
//params->m_maxPlayers = 9;
|
|
//params->m_maxBots = 8;
|
|
//} else {
|
|
params->m_maxPlayers = 9;
|
|
params->m_maxBots = 8;
|
|
//}
|
|
} else {
|
|
params->m_maxPlayers = 16;
|
|
Environment.NetworkMaxPlayers = 16;
|
|
params->m_maxBots = 16;
|
|
}
|
|
params->m_allow3rdPerson = 1;
|
|
if ((nMode != 0) && (nMode != 4)) {
|
|
params->m_isNight = false;
|
|
params->m_minimumTonnage = 25;
|
|
params->m_maximumTonnage = 100;
|
|
if (g_bCOOP) {
|
|
params->m_gameLength = g_nTimeList_Value;
|
|
} else {
|
|
// g_nTimeList_{Index}|{Value} will be used in ConLobbyMission.script
|
|
params->m_gameLength = 7;
|
|
}
|
|
params->m_visibility = 1; // clear
|
|
params->m_weather = false; // off
|
|
params->m_radarMode = 3; // unlimited
|
|
|
|
params->m_unlimitedAmmo = 1;
|
|
params->m_heatOn = 0;
|
|
params->m_friendlyFirePercentage = 0; // 100;
|
|
params->m_splashOn = 0;
|
|
params->m_weaponjamOn = 0;
|
|
params->m_ammobayfireOn = 0;
|
|
// MSL 5.05 Advance Mode
|
|
params->m_advancemodeOn = 0;
|
|
// MSL 5.06 Armor Mode
|
|
params->m_armormodeOn = 0;
|
|
params->m_respawnLimit = 0;
|
|
}
|
|
params->m_respawnLimitNumber = 0;
|
|
params->m_forceRespawn = 1;
|
|
params->m_allowDeadToChat = 0;
|
|
params->m_deadMechCantSee = 0;
|
|
params->m_deadMechCantSeeOtherTeam = 1;
|
|
params->m_killLimit = 0;
|
|
params->m_killLimitNumber = 1;
|
|
params->m_onlyStockMech = 0;
|
|
|
|
NetMissionParameters::TeamParameters* pTP = ¶ms->m_teamParams[0];
|
|
for(int i = 0; i < 8; i++) {
|
|
pTP->m_skin = g_caCamoPrefixes[g_naTeamSkins[i]];
|
|
pTP++;
|
|
}
|
|
|
|
if (CTCL_IsConsoleX() && (nMode == 0))
|
|
strcpy(params->m_serverIP, (char*)gos_NetInformation(gos_MyIPAddress));
|
|
}
|
|
|
|
int __stdcall CTCL_DoMission(void* instance, int args, void* data[])
|
|
{
|
|
int nDo = VALUEPARM(0);
|
|
|
|
if (nDo == 1) { // load
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
|
|
if (!shl->m_mechIDs)
|
|
return 999;
|
|
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
NetMissionParameters::MWNetMissionParameters* params = app->GetLocalNetParams();
|
|
|
|
BOOL bTeamGame = params->m_teamAllowed ? TRUE: FALSE;
|
|
int i, k, nCameraship, n1stTesla;
|
|
int nNormalTeslas = 0;
|
|
g_nServer = -1;
|
|
nCameraship = -1;
|
|
n1stTesla = -1;
|
|
g_nTeslas = 0;
|
|
int nErr = 0;
|
|
for(i = 0; !nErr && (i < g_nPlayerInfos); i++) {
|
|
SPlayerInfo& PI = g_aPlayerInfos[i];
|
|
BOOL bCameraShip = FALSE;
|
|
PI.m_bTeam = bTeamGame;
|
|
if (PI.m_nLevelOrTesla < 0) {
|
|
// bot - level
|
|
PI.m_bBot = TRUE;
|
|
PI.m_nLevelOrTesla++;
|
|
PI.m_nLevelOrTesla = -PI.m_nLevelOrTesla;
|
|
if (!((0 <= PI.m_nLevelOrTesla) && (PI.m_nLevelOrTesla < 9))) {
|
|
nErr = 1;
|
|
continue;
|
|
}
|
|
} else {
|
|
// tesla player - index
|
|
PI.m_bBot = FALSE;
|
|
if (!((0 <= PI.m_nLevelOrTesla) && (PI.m_nLevelOrTesla < CTCL_GetTeslaCountAll()))) {
|
|
nErr = 2;
|
|
continue;
|
|
}
|
|
if (PI.m_nLevelOrTesla < CTCL_GetTeslaCount()) {
|
|
if (!((1 <= PI.m_nMechIndex) && (PI.m_nMechIndex <= shl->m_mechCount))) {
|
|
nErr = 4;
|
|
continue;
|
|
}
|
|
} else {
|
|
if (PI.m_nMechIndex != 0) {
|
|
nErr = 5;
|
|
continue;
|
|
}
|
|
if (nCameraship == -1) {
|
|
nCameraship = i;
|
|
}
|
|
if (bTeamGame)
|
|
PI.m_nTeamOrSkin = 8;
|
|
else
|
|
PI.m_nTeamOrSkin = 0;
|
|
|
|
bCameraShip = TRUE;
|
|
}
|
|
if (!bCameraShip) {
|
|
if (n1stTesla == -1) {
|
|
n1stTesla = i;
|
|
}
|
|
nNormalTeslas++;
|
|
}
|
|
g_nTeslas++;
|
|
}
|
|
if ((PI.m_bBot || bCameraShip)/* && !PI.m_szName[0]*/) {
|
|
int n, nOld = -1;
|
|
const char* pcszBotName = NULL;
|
|
while(!pcszBotName) {
|
|
while((n = rand() % NUM_CALLSIGNS) == nOld)
|
|
;
|
|
nOld = n;
|
|
pcszBotName = BotNames[n];
|
|
for(k = 0; k < g_nPlayerInfos; k++) {
|
|
if (k != i) {
|
|
const SPlayerInfo& PI2 = g_aPlayerInfos[k];
|
|
if (strcmp(PI2.m_szName, pcszBotName) == 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (k == g_nPlayerInfos) {
|
|
strcpy(PI.m_szName, pcszBotName);
|
|
} else {
|
|
pcszBotName = NULL;
|
|
}
|
|
}
|
|
} else {
|
|
if (!PI.m_szName[0]) {
|
|
nErr = 3;
|
|
continue;
|
|
}
|
|
}
|
|
if (bCameraShip) {
|
|
PI.m_fileID = g_CameraResID.GetFileID();
|
|
PI.m_recordID = g_CameraResID.GetRecordID();
|
|
} else {
|
|
const Adept::ResourceID& ResID = shl->m_mechIDs[PI.m_nMechIndex];
|
|
PI.m_fileID = ResID.GetFileID();
|
|
PI.m_recordID = ResID.GetRecordID();
|
|
}
|
|
if (bTeamGame)
|
|
{
|
|
// MSL 5.03 decal
|
|
// if ((0 <= PI.m_nTeamOrSkin) && (PI.m_nTeamOrSkin <= 8))
|
|
if ((0 <= PI.m_nDecal) && (PI.m_nDecal <= 16))
|
|
PI.m_nDecal = g_naFFADecals[PI.m_nDecal];
|
|
else
|
|
PI.m_nDecal = 0;
|
|
}
|
|
else
|
|
{
|
|
// MSL 5.05 decal
|
|
if ((0 <= PI.m_nDecal) && (PI.m_nDecal < 37))
|
|
PI.m_nDecal = g_naFFADecals[PI.m_nDecal];
|
|
else
|
|
PI.m_nDecal = 0;
|
|
}
|
|
}
|
|
if (!nErr) {
|
|
gosASSERT(g_nServer == -1);
|
|
if (g_nTeslas > 0) {
|
|
if (nCameraship != -1) {
|
|
g_nServer = nCameraship;
|
|
} else {
|
|
gosASSERT(n1stTesla != -1);
|
|
g_nServer = n1stTesla;
|
|
}
|
|
g_nTeslas--;
|
|
} else {
|
|
nErr = 6;
|
|
}
|
|
}
|
|
if (!nErr) {
|
|
for(k = 0; !nErr && (k < g_nPlayerInfos); k++) {
|
|
SPlayerInfo& PI = g_aPlayerInfos[k];
|
|
for(int k2 = 0; !nErr && (k2 < g_nPlayerInfos); k2++) {
|
|
if (k != k2) {
|
|
SPlayerInfo& PI2 = g_aPlayerInfos[k2];
|
|
if (strcmp(PI.m_szName, PI2.m_szName) == 0) {
|
|
nErr = 7;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
g_guidGameDatas = gos_GenerateUniqueGUID();
|
|
if (!nErr) {
|
|
//$$COOP
|
|
|
|
extern SYSTEMTIME g_SysTime;
|
|
GetLocalTime(&g_SysTime); // GetSystemTime
|
|
|
|
CTCL_DefaultHostSetup(4);
|
|
|
|
DynamicMemoryStream stream;
|
|
params->SaveParameters(&stream);
|
|
stream.WriteByteAlign();
|
|
stream.Rewind();
|
|
|
|
CTCL_SaveNMP(stream.GetPointer(), stream.GetBufferBytesUsed());
|
|
|
|
if (CTCL_SaveLog(0, params)) {
|
|
g_nMech4Comm = 1;
|
|
} else {
|
|
nErr = 9;
|
|
g_nMech4Comm = 0;
|
|
}
|
|
}
|
|
return nErr;
|
|
} else if (nDo == 2) { // launch
|
|
//$$COOP
|
|
g_nMech4Comm = 10;
|
|
CTCL_SaveLog(1);
|
|
} else { // 0 - prepare
|
|
gosASSERT(nDo == 0);
|
|
g_nPlayerInfos = 0;
|
|
int i;
|
|
int* pTeamCamos = INTARRAYPARAM(1);
|
|
int* pTeamDecals = INTARRAYPARAM(2);
|
|
// MSL 5.03 decal
|
|
// for(i = 0; i < 8; i++) {
|
|
for(i = 0; i < 16; i++) {
|
|
g_naTeamSkins[i] = *pTeamCamos++;
|
|
g_naTeamDecals[i] = *pTeamDecals++;
|
|
}
|
|
int* pFFADecals = INTARRAYPARAM(3);
|
|
for(i = 0; i < 37; i++) {
|
|
g_naFFADecals[i] = *pFFADecals++;
|
|
}
|
|
g_nPrintOut = INTPARM(4);
|
|
g_nMissionReview = INTPARM(5);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_AddPlayer(void* instance, int args, void* data[])
|
|
{
|
|
SPlayerInfo& PI = g_aPlayerInfos[g_nPlayerInfos++];
|
|
|
|
PI.m_nLevelOrTesla = INTPARM(0); // level or tesla index
|
|
|
|
const char* pcszName = STRPARM(1);
|
|
if (pcszName) {
|
|
char c;
|
|
while((c = *pcszName) == ' ')
|
|
pcszName++;
|
|
strcpy(PI.m_szName, pcszName); // player name
|
|
|
|
char* pszName2 = PI.m_szName;
|
|
pszName2 += strlen(pszName2);
|
|
while(PI.m_szName < pszName2) {
|
|
if (pszName2[-1] == ' ')
|
|
*--pszName2 = '\0';
|
|
else
|
|
break;
|
|
}
|
|
} else {
|
|
PI.m_szName[0] = '\0';
|
|
}
|
|
|
|
int mech_index = INTPARM(2); // mech index
|
|
PI.m_nMechIndex = ++mech_index;
|
|
if (mech_index == 0) {
|
|
strcpy(PI.m_szMech, g_szCameraShip); // mech name
|
|
} else {
|
|
strcpy(PI.m_szMech, STRPARM(3));
|
|
}
|
|
PI.m_nTeamOrSkin = INTPARM(4); // team or skin
|
|
|
|
// MSL 5.05 decal
|
|
PI.m_nDecal = INTPARM(5); // decal
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_GetMissionState(void* instance, int args, void* data[])
|
|
{
|
|
int nLaunchState = INTPARM(0);
|
|
switch(nLaunchState) {
|
|
case 3:
|
|
if (g_nMech4Comm == 9) {
|
|
return +1;
|
|
} else {
|
|
if (g_nMech4Comm == 0) {
|
|
CTCL_SaveLog(-1);
|
|
return -1;
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
if (g_nMech4Comm == 0) {
|
|
return +1; // all ok...
|
|
} else {
|
|
}
|
|
break;
|
|
}
|
|
|
|
// processing...
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_DoBreak(void* instance, int args, void* data[])
|
|
{
|
|
#ifdef _DEBUG
|
|
static int s_nBreak0 = 0;
|
|
static int s_nBreak1 = 1;
|
|
static int s_nBreak2 = 2;
|
|
if (s_nBreak0 == VALUEPARM(0)) {
|
|
s_nBreak0++;
|
|
s_nBreak0--;
|
|
}
|
|
if (s_nBreak1 == VALUEPARM(0)) {
|
|
s_nBreak1++;
|
|
s_nBreak1--;
|
|
}
|
|
if (s_nBreak2 == VALUEPARM(0)) {
|
|
s_nBreak2++;
|
|
s_nBreak2--;
|
|
}
|
|
switch(VALUEPARM(0))
|
|
{
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
break;
|
|
case 2:
|
|
break;
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
break;
|
|
case 5:
|
|
break;
|
|
}
|
|
#endif // _DEBUG
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_IsGameLoaded(void* instance, int args, void* data[])
|
|
{
|
|
if (g_nMR != 2) {
|
|
MWApplication* app = MWApplication::GetInstance();
|
|
if (app && Connection::Local) {
|
|
int nID = Connection::Local->GetID();
|
|
if (app->servedConnectionData[nID].clientConnected && app->servedConnectionData[nID].clientLoaded)
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void _stdcall CTCL_SaveLogFileInfo(SYSTEMTIME& SysTime, const GUID& guid, char szPath[MAX_PATH], char szGUID[64])
|
|
{
|
|
AdjustSysTimeForLog(SysTime);
|
|
|
|
sprintf(szPath, "c:\\mw4files\\%02d_%02d_%d%s", SysTime.wMonth, SysTime.wDay, SysTime.wYear, g_bOldLOG ? ".log": ".rpt");
|
|
|
|
sprintf(szGUID, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
|
guid.Data1, guid.Data2, guid.Data3,
|
|
guid.Data4[0], guid.Data4[1],
|
|
guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
|
|
}
|
|
|
|
void _stdcall CTCL_SaveLogGameEnd(const SYSTEMTIME& SysTime, const GUID& guid, const char* pcszHost)
|
|
{
|
|
char szPath[MAX_PATH];
|
|
char szGUID[64];
|
|
|
|
SYSTEMTIME SysTime2(SysTime);
|
|
CTCL_SaveLogFileInfo(SysTime2, guid, szPath, szGUID);
|
|
|
|
if (g_bOldLOG) {
|
|
WritePrivateProfileString(szGUID, "@Host", pcszHost, szPath);
|
|
WritePrivateProfileString(szGUID, "@Launched", NULL, szPath);
|
|
} else {
|
|
SLogReport* pRPT = SLogReport::OpenLogReport(szPath, SysTime2);
|
|
if (pRPT) {
|
|
SLogItem* pItem = pRPT->GetLogItem(guid);
|
|
if (pItem) {
|
|
strcpy(pItem->m_szHost, pcszHost);
|
|
pItem->m_nLaunched = 0;
|
|
pRPT->Fix();
|
|
pRPT->WriteFile(szPath, SysTime2);
|
|
} else {
|
|
}
|
|
SLogReport::FreeLogReport(pRPT);
|
|
} else {
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL _stdcall CTCL_SaveLog(int nState, const NetMissionParameters::MWNetMissionParameters* params/* = NULL*/)
|
|
{
|
|
extern SYSTEMTIME g_SysTime;
|
|
int i;
|
|
char szPath[MAX_PATH];
|
|
char szGUID[64];
|
|
|
|
SYSTEMTIME SysTime2(g_SysTime);
|
|
CTCL_SaveLogFileInfo(SysTime2, g_guidGameDatas, szPath, szGUID);
|
|
|
|
char szBuf[256], szInt[24];
|
|
char* psz;
|
|
|
|
SLogReport* pRPT;
|
|
if (g_bOldLOG) {
|
|
pRPT = NULL;
|
|
} else {
|
|
pRPT = SLogReport::OpenLogReport(szPath, SysTime2);
|
|
}
|
|
SLogItem* pItem = NULL;
|
|
|
|
if (nState == 0) {
|
|
gosASSERT(params);
|
|
|
|
if (g_bOldLOG) {
|
|
sprintf(szInt, "%02d:%02d", g_SysTime.wHour, g_SysTime.wMinute);
|
|
WritePrivateProfileString(szGUID, "Time", szInt, szPath);
|
|
}
|
|
|
|
int nBOTs = 0;
|
|
int nCameraships = 0;
|
|
int nPlayers = 0;
|
|
|
|
if (g_bOldLOG) {
|
|
szBuf[0] = '\0';
|
|
}
|
|
psz = &szBuf[0];
|
|
for(i = 0; i < g_nPlayerInfos; i++) {
|
|
const SPlayerInfo& PI = g_aPlayerInfos[i];
|
|
if (PI.m_bBot) {
|
|
nBOTs++;
|
|
} else {
|
|
if ((PI.m_fileID == g_CameraResID.GetFileID()) && (PI.m_recordID == g_CameraResID.GetRecordID())) {
|
|
nCameraships++;
|
|
} else {
|
|
if (g_bOldLOG) {
|
|
if (nPlayers != 0) {
|
|
strcpy(psz, ",");
|
|
psz = &psz[strlen(psz)];
|
|
}
|
|
strcpy(psz, PI.m_szName);
|
|
psz = &psz[strlen(psz)];
|
|
} else {
|
|
strcpy(psz, PI.m_szName);
|
|
psz = &psz[strlen(psz) + 1];
|
|
}
|
|
|
|
nPlayers++;
|
|
}
|
|
}
|
|
}
|
|
if (!g_bOldLOG) {
|
|
*psz = '\0';
|
|
}
|
|
|
|
if (g_bOldLOG) {
|
|
sprintf(szInt, "%d", nPlayers);
|
|
WritePrivateProfileString(szGUID, "Player Count", szInt, szPath);
|
|
WritePrivateProfileString(szGUID, "Players", szBuf, szPath);
|
|
sprintf(szInt, "%d", nBOTs);
|
|
WritePrivateProfileString(szGUID, "BOT Count", szInt, szPath);
|
|
} else if (pRPT) {
|
|
SLogReport* pRPT2;
|
|
pRPT2 = pRPT->AddLogItem(g_guidGameDatas, psz - &szBuf[0], pItem);
|
|
if (pRPT2) {
|
|
pRPT = pRPT2;
|
|
pItem->m_Time = g_SysTime;
|
|
pItem->m_nPlayers = nPlayers;
|
|
pItem->m_nBOTs = nBOTs;
|
|
memcpy(&pItem->m_szPlayers[0], &szBuf[0], pItem->m_uSize + 1/* '\0' */);
|
|
pRPT->Fix();
|
|
}
|
|
}
|
|
} else if (g_bOldLOG) {
|
|
if (nState == 1) {
|
|
int nPlayers = 0;
|
|
for(i = 0; i < g_nPlayerInfos; i++) {
|
|
const SPlayerInfo& PI = g_aPlayerInfos[i];
|
|
if (!PI.m_bBot) {
|
|
if (!((PI.m_fileID == g_CameraResID.GetFileID()) && (PI.m_recordID == g_CameraResID.GetRecordID()))) {
|
|
nPlayers++;
|
|
}
|
|
}
|
|
}
|
|
WritePrivateProfileString(szGUID, "@Launched", "1", szPath);
|
|
} else if (nState == -1) {
|
|
WritePrivateProfileString(szGUID, "@err", "1", szPath);
|
|
}
|
|
} else if (pRPT) {
|
|
SLogItem* pItem = pRPT->GetLogItem(g_guidGameDatas);
|
|
if (pItem) {
|
|
if (nState == 1) {
|
|
pItem->m_nLaunched = 1;
|
|
} else if (nState == -1) {
|
|
pItem->m_nErr = 1;
|
|
}
|
|
pRPT->Fix();
|
|
} else {
|
|
// error?
|
|
SLogReport::FreeLogReport(pRPT);
|
|
pRPT = NULL;
|
|
}
|
|
}
|
|
|
|
if (pRPT) {
|
|
pRPT->WriteFile(szPath, SysTime2);
|
|
SLogReport::FreeLogReport(pRPT);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int __stdcall CTCL_GetJoyInfo(void* instance, int args, void* data[])
|
|
{
|
|
int nJoy = INTPARM(0);
|
|
int* pJoyInfos = INTARRAYPARAM(1); // [3 + 5] = joy.x, joy.y, joy.z, joy.b0~joy.b4
|
|
|
|
gosJoystick_SetPolling(nJoy,true);
|
|
int nValX;
|
|
float valx = gosJoystick_GetAxis(nJoy,JOY_XAXIS);
|
|
if (valx <= -1.0f)
|
|
nValX = -1000;
|
|
else if (+1.0f <= valx)
|
|
nValX = +1000;
|
|
else
|
|
nValX = (int)(1000 * valx);
|
|
|
|
int nValY;
|
|
float valy = gosJoystick_GetAxis(nJoy,JOY_YAXIS);
|
|
if (valy <= -1.0f)
|
|
nValY = -1000;
|
|
else if (+1.0f <= valy)
|
|
nValY = +1000;
|
|
else
|
|
nValY = (int)(1000 * valy);
|
|
|
|
int nValZ = 0;
|
|
/*
|
|
float valz = gosJoystick_GetAxis(nJoy,JOY_ZAXIS);
|
|
if (valz <= -.1f)
|
|
nValZ = -1000;
|
|
else if (+.1f <= valz)
|
|
nValZ = +1000;
|
|
else
|
|
nValZ = (int)(1000 * valz);
|
|
*/
|
|
pJoyInfos[0] = nValX;
|
|
pJoyInfos[1] = nValY;
|
|
pJoyInfos[2] = nValZ;
|
|
/*
|
|
char szBuf[100];
|
|
sprintf(szBuf, "l : %d, r: %d\n", nValX, nValY);
|
|
::OutputDebugString(szBuf);
|
|
*/
|
|
pJoyInfos += 3;
|
|
|
|
gosJoystick_Info ji;
|
|
gosJoystick_GetInfo(0, &ji);
|
|
for(unsigned int i=0; i < 5; i++)
|
|
{
|
|
if ( i < ji.nButtons )
|
|
pJoyInfos[i] = gosJoystick_ButtonStatus(0,i);
|
|
else
|
|
pJoyInfos[i] = 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_WhyPaused(void* instance, int args, void* data[])
|
|
{
|
|
return g_nWhyPaused;
|
|
}
|
|
|
|
struct SScoreInfo
|
|
{
|
|
char m_szName[32];
|
|
int m_nValues[7];
|
|
bool m_bLast;
|
|
};
|
|
|
|
int __cdecl qsort_ScoreInfos(const void *elem1, const void *elem2)
|
|
{
|
|
const SScoreInfo& a = *(const SScoreInfo*)elem1;
|
|
const SScoreInfo& b = *(const SScoreInfo*)elem2;
|
|
|
|
const int naOrders[] = { 1, 0, 2, 3, 6, 4, -1 }; // score, stage, kill, death, success, time
|
|
const int* p = &naOrders[0];
|
|
int nIndex;
|
|
|
|
while((nIndex = *p++) != (-1))
|
|
{
|
|
int nRet = -(a.m_nValues[nIndex] - b.m_nValues[nIndex]);
|
|
if (nRet != 0) {
|
|
if (nIndex == 3) // death?
|
|
return -nRet;
|
|
return nRet;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_CheckCampaign(void* instance, int args, void* data[])
|
|
{
|
|
#define MAX_SCORES 10
|
|
|
|
extern int GetScore4Player(int& nKills, int& nDeaths);
|
|
extern bool GetEnemyInfo(int nWhich, int& nDead, int& nEnemyCount); // ablxstd.cpp
|
|
|
|
MWApplication *app;
|
|
app = MWApplication::GetInstance ();
|
|
MWMission* mission;
|
|
if (MWMission::GetInstance())
|
|
mission = Cast_Object(MWMission*, MWMission::GetInstance());
|
|
else
|
|
mission = NULL;
|
|
|
|
if (VALUEPARM(0) == 1) {
|
|
int nScore, nKills, nDeaths;
|
|
|
|
nScore = GetScore4Player(nKills, nDeaths);
|
|
|
|
nScore += app->m_nCamp_Score;
|
|
nKills += app->m_nCamp_Kills;
|
|
nDeaths += app->m_nCamp_Deaths;
|
|
|
|
Stuff::Time t = mission->Timer(6).CurrTime();
|
|
int nTimePlayTotal = (int)t;
|
|
|
|
POINT ptDeadAndEnemy;
|
|
if (!mission->GetCOOP(MWMission::COOP_ENEMY_GROUP, &ptDeadAndEnemy))
|
|
ptDeadAndEnemy.x = ptDeadAndEnemy.y = 0;
|
|
|
|
INTPARM(1) = nScore;
|
|
INTPARM(2) = nKills;
|
|
INTPARM(3) = nDeaths;
|
|
INTPARM(4) = ptDeadAndEnemy.x;
|
|
INTPARM(5) = ptDeadAndEnemy.y;
|
|
INTPARM(6) = nTimePlayTotal;
|
|
INTPARM(7) = mission->GetCOOP(MWMission::COOP_SUBSTAGE_TIMEGOAL);
|
|
INTPARM(8) = mission->GetCOOP(MWMission::COOP_SUBSTAGE_SCORE_OLD);
|
|
INTPARM(9) = app->m_nCamp_Stage;
|
|
INTPARM(10) = mission->GetCOOP(MWMission::COOP_SUBSTAGE_NUMBER);
|
|
} else if (VALUEPARM(0) == 2) {
|
|
INTPARM(1) = app->m_nCamp_Score;
|
|
INTPARM(2) = app->m_nCamp_Kills;
|
|
INTPARM(3) = app->m_nCamp_Deaths;
|
|
INTPARM(4) = app->m_nCamp_Time;
|
|
INTPARM(5) = app->m_nCamp_Mech;
|
|
INTPARM(6) = app->m_bCamp_Success;
|
|
} else if (VALUEPARM(0) == 3) {
|
|
app->m_nCamp_Stage = VALUEPARM(1); // store invitation result
|
|
} else if (VALUEPARM(0) == 4) {
|
|
Stuff::Scalar fRepair = *SCALARARRAYPARAM(1);
|
|
if (fRepair != 0) {
|
|
VehicleInterface* pvi = VehicleInterface::GetInstance();
|
|
if (pvi) {
|
|
Vehicle* pv = pvi->vehicle;
|
|
if (pv) {
|
|
Mech* mech = Cast_Object(Mech*, pv);
|
|
mech->RepairForCOOP();
|
|
pv->RepairDamage (fRepair);
|
|
}
|
|
}
|
|
}
|
|
app->m_nCamp_Score += INTPARM(2);
|
|
} else if (VALUEPARM(0) == 5) {
|
|
char** ppNames = STRARRAYPARAM(1);
|
|
int* pnCounts = INTARRAYPARAM(2);
|
|
INTPARM(3) = mission->GetCOOP(MWMission::COOP_SUBSTAGE_TIMEGOAL);
|
|
INTPARM(4) = app->m_nCamp_Stage;
|
|
INTPARM(5) = mission->GetCOOP(MWMission::COOP_SUBSTAGE_NUMBER);
|
|
return ABL::GetEnemyTyps(mission->m_naCOOPs[MWMission::COOP_ENEMY_GROUP], ppNames, pnCounts, 0); // don't use - GetCOOP(MWMission::COOP_ENEMY_GROUP)
|
|
} else if (VALUEPARM(0) == 6) {
|
|
// load high score
|
|
int nMaxScores = INTPARM(1); // nLastIndex Contains Maximum score array size
|
|
gosASSERT(1 <= nMaxScores);
|
|
gosASSERT(nMaxScores <= MAX_SCORES);
|
|
|
|
NotationFile highscore_ini("highscore.ini", NotationFile::Standard, true);
|
|
Page *page = highscore_ini.SetPage("single");
|
|
|
|
struct SScoreInfo
|
|
{
|
|
char m_szName[32];
|
|
int m_nValues[7];
|
|
bool m_bLast;
|
|
} aSIs[MAX_SCORES];
|
|
|
|
if (MAX_SCORES < nMaxScores) {
|
|
nMaxScores = MAX_SCORES;
|
|
}
|
|
int nSIs = 0;
|
|
|
|
int nRECs;
|
|
for(nRECs = -1; nRECs < nMaxScores; nRECs++)
|
|
{
|
|
char sz[128];
|
|
Note* pNote;
|
|
if (nRECs == -1) {
|
|
pNote = page->SetNote("last"); // MWGame::ReactToEndMission(bool success)
|
|
} else {
|
|
sprintf(sz, "%d", nRECs);
|
|
pNote = page->SetNote(sz);
|
|
}
|
|
const char* pcsz;
|
|
pNote->GetEntry(&pcsz);
|
|
if(!pcsz || !*pcsz)
|
|
continue;
|
|
const char* pcszComma;
|
|
int nComma;
|
|
bool bDone = false;
|
|
for(nComma = 0; !bDone; nComma++)
|
|
{
|
|
pcszComma = strchr(pcsz, ',');
|
|
if (pcszComma) {
|
|
if (7 <= nComma)
|
|
break;
|
|
} else {
|
|
if (nComma < 7)
|
|
break;
|
|
pcszComma = &pcsz[strlen(pcsz)];
|
|
}
|
|
int nLen = &pcszComma[1] - pcsz;
|
|
memcpy(sz, pcsz, nLen);
|
|
sz[nLen - 1] = '\0';
|
|
|
|
if (nComma == 0) {
|
|
// sync w/ MAX_STR_TYPE_LEN 16 in gs_multi_id.script
|
|
if (nRECs == -1) {
|
|
if (*sz != '\0')
|
|
break;
|
|
} else {
|
|
if (*sz == '\0')
|
|
break;
|
|
}
|
|
if (16 < strlen(sz))
|
|
break;
|
|
strcpy(aSIs[nSIs].m_szName, sz);
|
|
} else {
|
|
aSIs[nSIs].m_nValues[nComma - 1] = atoi(sz);
|
|
}
|
|
if (nComma == 7) {
|
|
bDone = true;
|
|
break;
|
|
}
|
|
pcsz = &pcszComma[1];
|
|
}
|
|
if (bDone) {
|
|
aSIs[nSIs].m_bLast = (nRECs == -1);
|
|
nSIs++;
|
|
if (nMaxScores <= nSIs)
|
|
break;
|
|
}
|
|
}
|
|
qsort(&aSIs[0], nSIs, sizeof(aSIs[0]), qsort_ScoreInfos);
|
|
char** ppNames = STRARRAYPARAM(2);
|
|
int* pnStages = INTARRAYPARAM(3);
|
|
int* pnScores = INTARRAYPARAM(4);
|
|
int* pnKills = INTARRAYPARAM(5);
|
|
int* pnDeaths = INTARRAYPARAM(6);
|
|
int* pnTime = INTARRAYPARAM(7);
|
|
int* pnMech = INTARRAYPARAM(8);
|
|
int* pnSuccess = INTARRAYPARAM(9);
|
|
int nLastIdx = -1;
|
|
for(int i = 0; i < nSIs; i++)
|
|
{
|
|
FREEANDNULL(*ppNames);
|
|
*ppNames = (char*)gos_Malloc(strlen(aSIs[i].m_szName) + 1);
|
|
strcpy(*ppNames, aSIs[i].m_szName);
|
|
ppNames++;
|
|
|
|
const int* pv = &aSIs[i].m_nValues[0];
|
|
*pnStages++ = *pv++;
|
|
*pnScores++ = *pv++;
|
|
*pnKills++ = *pv++;
|
|
*pnDeaths++ = *pv++;
|
|
*pnTime++ = *pv++;
|
|
*pnMech++ = *pv++;
|
|
*pnSuccess++ = *pv++;
|
|
|
|
if (aSIs[i].m_bLast)
|
|
nLastIdx = i;
|
|
}
|
|
INTPARM(1) = nLastIdx;
|
|
|
|
return nSIs;
|
|
} else if (VALUEPARM(0) == 7) {
|
|
// save high score
|
|
NotationFile highscore_ini("highscore.ini", NotationFile::Standard, true);
|
|
Page *page = highscore_ini.SetPage("single");
|
|
|
|
int nSIs = INTPARM(1);
|
|
char** ppNames = STRARRAYPARAM(2);
|
|
int* pnStages = INTARRAYPARAM(3);
|
|
int* pnScores = INTARRAYPARAM(4);
|
|
int* pnKills = INTARRAYPARAM(5);
|
|
int* pnDeaths = INTARRAYPARAM(6);
|
|
int* pnTime = INTARRAYPARAM(7);
|
|
int* pnMech = INTARRAYPARAM(8);
|
|
int* pnSuccess = INTARRAYPARAM(9);
|
|
|
|
int nRECs;
|
|
for(nRECs = -1; nRECs < MAX_SCORES; nRECs++)
|
|
{
|
|
char sz[128];
|
|
Note* pNote;
|
|
if (nRECs == -1) {
|
|
pNote = page->SetNote("last"); // MWGame::ReactToEndMission(bool success)
|
|
} else {
|
|
sprintf(sz, "%d", nRECs);
|
|
pNote = page->SetNote(sz);
|
|
}
|
|
if ((0 <= nRECs) && (nRECs < nSIs)) {
|
|
sprintf(sz, "%s,%d,%d,%d,%d,%d,%d,%d",
|
|
*ppNames++,
|
|
*pnStages++,*pnScores++, *pnKills++, *pnDeaths++,
|
|
*pnTime++, *pnMech++, *pnSuccess++);
|
|
pNote->SetEntry(sz);
|
|
} else {
|
|
pNote->SetEntry("");
|
|
}
|
|
}
|
|
|
|
highscore_ini.Save();
|
|
} else if (VALUEPARM(0) == 8) {
|
|
// Inviter Name...
|
|
char** ppInviter = &STRPARM(1);
|
|
int nLen = strlen(g_szTeslaInviter) + 1;
|
|
|
|
FREEANDNULL(*ppInviter);
|
|
*ppInviter = (char *)gos_Malloc(nLen);
|
|
strcpy(*ppInviter, g_szTeslaInviter);
|
|
} else if (VALUEPARM(0) == 9) {
|
|
if (g_bUseCam)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
return app->m_nCamp_Stage;
|
|
#undef MAX_SCORES
|
|
}
|
|
|
|
int __stdcall TBL_GetResNames(void* instance, int args, void* data[])
|
|
{
|
|
// STRARRAYPARAM(0), nID+ <<== last nID should be (-1)
|
|
//
|
|
// 0 <= nID: predefined type
|
|
// 0: Mech Names
|
|
// 1: ...
|
|
// 99: reserved 1...
|
|
//-1 == nID: end of params
|
|
// nID < -1: resource id...
|
|
|
|
char** ppResNamesOrg = STRARRAYPARAM(0);
|
|
gosASSERT(ppResNamesOrg);
|
|
char** ppResNames = ppResNamesOrg;
|
|
|
|
int nIdx, nID, nNames;
|
|
char* pszName;
|
|
char* pszName2;
|
|
|
|
enum {
|
|
ResNames_MechNames = 0,
|
|
ResNames_TopSpeed,
|
|
ResNames_Tonnages,
|
|
ResNames_Class,
|
|
ResNames_Tech,
|
|
ResNames_InfoString,
|
|
ResNames_BotNames,
|
|
|
|
ResNames_MAX,
|
|
|
|
ResNames_ReserveCount = 98,
|
|
ResNames_Reserve1 = 99,
|
|
};
|
|
gosASSERT(NoMechID == (LastMechID - FirstMechID + 1));
|
|
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
gosASSERT(shl);
|
|
|
|
nNames = 0;
|
|
for(nIdx = 1; (nID = VALUEPARM(nIdx)) != -1; nIdx++)
|
|
{
|
|
if (0 <= nID) {
|
|
if (nID < ResNames_MAX) {
|
|
int n, nMax;
|
|
const SMechSpec* pMIs = &g_aMechSpecs[0];
|
|
char** ppNames;
|
|
static char sz[1024];
|
|
|
|
switch(nID)
|
|
{
|
|
case ResNames_MechNames:
|
|
case ResNames_TopSpeed:
|
|
case ResNames_Tonnages:
|
|
case ResNames_Class:
|
|
case ResNames_Tech:
|
|
case ResNames_InfoString:
|
|
nMax = NoMechID;
|
|
for(n = 0; n < nMax; n++)
|
|
{
|
|
switch(nID)
|
|
{
|
|
case ResNames_MechNames:
|
|
pszName = shl->GetShellString(pMIs[n].m_nNameID);
|
|
break;
|
|
case ResNames_TopSpeed:
|
|
sprintf(sz, "%f", pMIs[n].m_fTopSpeed);
|
|
pszName = &sz[0];
|
|
break;
|
|
case ResNames_Tonnages:
|
|
sprintf(sz, "%f", pMIs[n].m_fTonnage);
|
|
pszName = &sz[0];
|
|
break;
|
|
case ResNames_Class:
|
|
pszName = shl->GetShellString(pMIs[n].m_nClass);
|
|
break;
|
|
case ResNames_Tech:
|
|
pszName = shl->GetShellString(pMIs[n].m_nTech);
|
|
break;
|
|
case ResNames_InfoString:
|
|
pszName = shl->GetShellString(pMIs[n].m_nNameID);
|
|
pszName2 = shl->GetShellString(pMIs[n].m_nInfo);
|
|
break;
|
|
default:
|
|
gosASSERT(FALSE);
|
|
break;
|
|
}
|
|
FREEANDNULL(*ppResNames);
|
|
|
|
gosASSERT(pszName);
|
|
int nBufLen = (int)strlen(pszName);
|
|
|
|
if (nID == ResNames_InfoString) {
|
|
gosASSERT(pszName2);
|
|
int nBufLen2 = (int)strlen(pszName2);
|
|
|
|
char* pszDestOrg = (char*)gos_Malloc(nBufLen + 1/* \n */ + nBufLen2 + 1/* '\0' */);
|
|
char* pszDest = pszDestOrg;
|
|
|
|
memcpy(pszDest, pszName, nBufLen);
|
|
pszDest = &pszDest[nBufLen];
|
|
*pszDest++ = '\n';
|
|
strcpy(pszDest, pszName2);
|
|
|
|
*ppResNames = pszDestOrg;
|
|
} else {
|
|
*ppResNames = (char*)gos_Malloc(nBufLen + 1);
|
|
|
|
Str_Copy(*ppResNames, (const char *)pszName, nBufLen + 1);
|
|
}
|
|
|
|
ppResNames++;
|
|
}
|
|
break;
|
|
case ResNames_BotNames:
|
|
nMax = NUM_CALLSIGNS;
|
|
ppNames = &BotNames[0];
|
|
for(n = 0; n < nMax; n++)
|
|
{
|
|
pszName = ppNames[n];
|
|
gosASSERT(pszName);
|
|
|
|
FREEANDNULL(*ppResNames);
|
|
|
|
int nBufLen = (int)strlen(pszName);
|
|
|
|
*ppResNames = (char*)gos_Malloc(nBufLen + 1);
|
|
|
|
Str_Copy(*ppResNames, (const char *)pszName, nBufLen + 1);
|
|
|
|
ppResNames++;
|
|
}
|
|
break;
|
|
case ResNames_ReserveCount:
|
|
nIdx++;
|
|
nID = VALUEPARM(nIdx);
|
|
gosASSERT(1 <= nID);
|
|
ppResNames += nID;
|
|
break;
|
|
case ResNames_Reserve1:
|
|
ppResNames++;
|
|
break;
|
|
default:
|
|
gosASSERT(FALSE);
|
|
break;
|
|
}
|
|
} else {
|
|
pszName = "";
|
|
goto as_string1;
|
|
}
|
|
} else {
|
|
pszName = shl->GetShellString(-nID);
|
|
as_string1:
|
|
gosASSERT(pszName);
|
|
|
|
FREEANDNULL(*ppResNames);
|
|
|
|
int nBufLen = (int)(strlen(pszName) + 1);
|
|
|
|
*ppResNames = (char*)gos_Malloc(nBufLen);
|
|
|
|
Str_Copy(*ppResNames, (const char *)pszName, nBufLen);
|
|
|
|
ppResNames++;
|
|
}
|
|
}
|
|
|
|
return ppResNames - ppResNamesOrg;
|
|
}
|
|
|
|
int __stdcall CTCL_GetIncNums(void* instance, int args, void* data[])
|
|
{
|
|
int nHop = INTPARM(0);
|
|
int nStart = INTPARM(1);
|
|
int nEnd = INTPARM(2);
|
|
int* pValuesOrg = INTARRAYPARAM(3);
|
|
int* pValues = pValuesOrg;
|
|
|
|
int nDiff, nDir;
|
|
if (nStart < nEnd) {
|
|
nDiff = nEnd - nStart;
|
|
nDir = 1;
|
|
} else {
|
|
nDiff = nStart - nEnd;
|
|
nDir = -1;
|
|
}
|
|
nDiff++;
|
|
if (nDiff < nHop) {
|
|
nHop = nDiff;
|
|
}
|
|
|
|
if (nHop <= 1) {
|
|
*pValues++ = nStart;
|
|
*pValues++ = nEnd;
|
|
} else {
|
|
int nLast = nStart - nDir;
|
|
for(int n = 0; n < nHop; n++)
|
|
{
|
|
int nNew = nStart + (nDiff * n / nHop) * nDir;
|
|
if (nLast != nNew) {
|
|
*pValues++ = nNew;
|
|
nLast = nNew;
|
|
}
|
|
}
|
|
*pValues++ = nEnd;
|
|
}
|
|
|
|
return pValues - pValuesOrg;
|
|
}
|
|
|
|
int __stdcall CTCL_MiscFile(void* instance, int args, void* data[])
|
|
{
|
|
int nIdx = VALUEPARM(0);
|
|
gosASSERT((0 <= nIdx) && (nIdx < sizeof(m_aMiscFileTables) / sizeof(m_aMiscFileTables[0])));
|
|
MiscFileTable& tbl = *m_aMiscFileTables[nIdx];
|
|
|
|
int nCount = tbl.GetTableSize();
|
|
switch(VALUEPARM(1))
|
|
{
|
|
case 0: // count
|
|
return nCount;
|
|
case 1: // read & next...
|
|
case 2: // read current
|
|
if (0 < nCount) {
|
|
MiscFileEntry& entry = *tbl.GetNthItem(tbl.m_nCurIndex);
|
|
AssignShellString(data, 2, entry.GetFileName());
|
|
if (VALUEPARM(1) == 1) {
|
|
if (++tbl.m_nCurIndex >= nCount) {
|
|
tbl.m_nCurIndex = 0;
|
|
}
|
|
}
|
|
return +1;
|
|
}
|
|
return 0;
|
|
case 3: // get index...
|
|
return tbl.m_nCurIndex;
|
|
case 4: // set index...
|
|
if ((0 <= INTPARM(2)) && (INTPARM(2) < nCount)) {
|
|
tbl.m_nCurIndex = INTPARM(2);
|
|
return +1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_GetACP(void* instance, int args, void* data[])
|
|
{
|
|
return GetACP();
|
|
}
|
|
|
|
int __stdcall CTCL_IsBotAllowed(void* instance, int args, void* data[])
|
|
{
|
|
gosASSERT(args == 1);
|
|
// see MWApplication::BotsAllowed()
|
|
switch(INTPARM(0))
|
|
{
|
|
case StockDestruction:
|
|
case StockTeamDestruction:
|
|
case StockAttrition:
|
|
case StockTeamAttrition:
|
|
|
|
case CustomDestruction:
|
|
case CustomTeamDestruction:
|
|
case CustomAttrition:
|
|
case CustomTeamAttrition:
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int __stdcall CTCL_MechViewOnMainScreen(void* instance, int args, void* data[])
|
|
{
|
|
if (g_nMechViewType == 2)
|
|
{
|
|
if (MechLab::Instance && (g_nMR != 2) && (radar_device.m_nMechViewMax <= 0))
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void _stdcall CTCL_DoStopMusic()
|
|
{
|
|
if (g_MusicSound4COOP)
|
|
gosAudio_DestroyResource(&g_MusicSound4COOP);
|
|
}
|
|
|
|
void _stdcall CTCL_DoPlayMusic()
|
|
{
|
|
MWApplication *app = MWApplication::GetInstance ();
|
|
|
|
if (g_bCOOP) {
|
|
MiscFileTable& tbl = *m_aMiscFileTables[2]; // game musics
|
|
int nCount = tbl.GetTableSize();
|
|
if (0 < nCount) {
|
|
if (app->networkingFlag) {
|
|
const BYTE* pb = (const BYTE*)&g_guidGameDatas;
|
|
const BYTE* pbEnd = &pb[sizeof(g_guidGameDatas)];
|
|
BYTE bCRC = 0;
|
|
while(pb < pbEnd)
|
|
{
|
|
bCRC += *pb;
|
|
pb++;
|
|
}
|
|
|
|
tbl.m_nCurIndex = bCRC % nCount;
|
|
} else {
|
|
if ((2 < nCount) && (Random::GetInt() % 2)) {
|
|
if (++tbl.m_nCurIndex >= nCount) {
|
|
tbl.m_nCurIndex = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
MiscFileEntry& entry = *tbl.GetNthItem(tbl.m_nCurIndex);
|
|
MString strFile(entry.GetFileName());
|
|
if (++tbl.m_nCurIndex >= nCount) {
|
|
tbl.m_nCurIndex = 0;
|
|
}
|
|
|
|
CTCL_DoStopMusic();
|
|
#if 0
|
|
gosAudio_CreateResource(&g_MusicSound4COOP, gosAudio_StreamedFile, strFile, 0,0,0, true);
|
|
if (g_MusicSound4COOP) {
|
|
gosAudio_AssignResourceToChannel(0, g_MusicSound4COOP);
|
|
gosAudio_SetChannelPlayMode(0,gosAudio_Loop);
|
|
gosAudio_SetChannelSlider(0, gosAudio_Volume, (float) 40.0f / 100.0f );
|
|
}
|
|
#else
|
|
strFile += "{handle}";
|
|
|
|
AudioCommand *command;
|
|
command = AudioCommand::Create(AudioRenderer::MusicType,strFile,1.0f,1.0f);
|
|
Check_Object(command);
|
|
if (command)
|
|
{
|
|
command->Play(gosAudio_Loop);
|
|
if ((AudioRenderer::Instance != 0) &&
|
|
(AudioRenderer::Instance->m_channelTypes.GetLength() > AudioRenderer::MusicType))
|
|
{
|
|
AudioRenderer::Instance->m_channelTypes[AudioRenderer::MusicType].SetVolume(40.0f / 100.0f);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
void __stdcall CTCL_AfterBeginScene()
|
|
{
|
|
extern LPDIRECTDRAWSURFACE7 BackBufferSurface;
|
|
|
|
gosASSERT(radar_device.m_ptMechViewDim.x % 4 == 0);
|
|
gosASSERT(radar_device.m_ptMechViewDim.y % 4 == 0);
|
|
gosASSERT(radar_device.m_ptMechViewSize.x % 4 == 0);
|
|
gosASSERT(radar_device.m_ptMechViewSize.y % 4 == 0);
|
|
|
|
gosASSERT(radar_device.m_pDDSMechView);
|
|
|
|
int nXCount = radar_device.m_ptMechViewDim.x / radar_device.m_ptMechViewSize.x;
|
|
int nYCount = radar_device.m_ptMechViewDim.y / radar_device.m_ptMechViewSize.y;
|
|
int nCount = nXCount * nYCount;
|
|
|
|
RECT rcTarget;
|
|
SetRect(&rcTarget, 0, 0, radar_device.m_ptMechViewSize.x * nXCount, radar_device.m_ptMechViewSize.y * nYCount);
|
|
|
|
radar_device.m_nMechViewMax = 0;
|
|
|
|
DDSURFACEDESC2 desc={0,};
|
|
desc.dwSize=sizeof(desc);
|
|
radar_device.m_pDDSMechView->Lock(&rcTarget,&desc,DDLOCK_WAIT|DDLOCK_NOSYSLOCK|DDLOCK_WRITEONLY,NULL);
|
|
if (desc.lpSurface) {
|
|
for(int qq = 0; qq < nCount; qq++)
|
|
{
|
|
gos_SetupViewport(1,1.0,1,0x00000000,0.0,0.0,1.0,1.0 );
|
|
|
|
MechLab::Instance->Execute();
|
|
MechLab::Instance->UpdateDisplay();
|
|
|
|
RECT rcSource;
|
|
rcSource.left = (800 - radar_device.m_ptMechViewSize.x) / 2;
|
|
rcSource.top = (600 - radar_device.m_ptMechViewSize.y) / 2;
|
|
rcSource.right = rcSource.left + radar_device.m_ptMechViewSize.x;
|
|
rcSource.bottom = rcSource.top + radar_device.m_ptMechViewSize.y;
|
|
|
|
DDSURFACEDESC2 desc2={0,};
|
|
desc2.dwSize=sizeof(desc2);
|
|
BackBufferSurface->Lock(&rcSource,&desc2,DDLOCK_WAIT|DDLOCK_NOSYSLOCK|DDLOCK_READONLY,NULL);
|
|
if (desc2.lpSurface) {
|
|
int nX = (radar_device.m_nMechViewMax % nXCount) * radar_device.m_ptMechViewSize.x;
|
|
int nY = (radar_device.m_nMechViewMax / nXCount) * radar_device.m_ptMechViewSize.y;
|
|
|
|
const BYTE* pSrc = &((const BYTE*)desc2.lpSurface)[0]; // [rcSource.top * desc2.lPitch + rcSource.left * 2];
|
|
BYTE* pDst = &((BYTE*)desc.lpSurface)[nY * desc.lPitch + nX * 2];
|
|
int nX2 = nX + radar_device.m_ptMechViewSize.x;
|
|
int nY2 = nY + radar_device.m_ptMechViewSize.y;
|
|
while(nY < nY2)
|
|
{
|
|
memcpy(pDst, pSrc, sizeof(WORD) * radar_device.m_ptMechViewSize.x);
|
|
pDst = &pDst[desc.lPitch];
|
|
pSrc = &pSrc[desc2.lPitch];
|
|
|
|
nY++;
|
|
}
|
|
radar_device.m_nMechViewMax++;
|
|
|
|
BackBufferSurface->Unlock(&rcSource);
|
|
} else {
|
|
STOP(("BackBufferSurface->Lock(&rcSource..."));
|
|
}
|
|
}
|
|
radar_device.m_pDDSMechView->Unlock(&rcTarget);
|
|
}
|
|
else
|
|
{
|
|
STOP(("radar_device.m_pDDSMechView->Lock(&rcTarget,&desc,DDLOCK_WAIT|DDLOCK_NO..."));
|
|
}
|
|
|
|
MW4Shell::Instance->ClearMechLab(-1);
|
|
|
|
radar_device.m_nMechViewCurs = -1;
|
|
g_dwLastMechView = 0;
|
|
g_pfnCTCL_AfterBeginScene = CTCL_UpdateMechView;
|
|
|
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
|
}
|
|
|
|
void __stdcall CTCL_UpdateMechView()
|
|
{
|
|
extern LPDIRECTDRAWSURFACE7 BackBufferSurface;
|
|
|
|
if (0 < radar_device.m_nMechViewMax) {
|
|
if ((radar_device.m_nMechViewCurs < 0) || (g_dwLastMechView == 0) || (g_dwLastMechView <= GetTickCount())) {
|
|
radar_device.m_nMechViewCurs++;
|
|
g_dwLastMechView = GetTickCount() + MECHVIEW_TIMETICKS;
|
|
}
|
|
if (radar_device.m_nMechViewMax <= radar_device.m_nMechViewCurs)
|
|
radar_device.m_nMechViewCurs = 0;
|
|
|
|
int nXCount = radar_device.m_ptMechViewDim.x / radar_device.m_ptMechViewSize.x;
|
|
int nYCount = radar_device.m_ptMechViewDim.y / radar_device.m_ptMechViewSize.y;
|
|
int nCount = nXCount * nYCount;
|
|
|
|
// see render.cpp for fonts....
|
|
// Header Text
|
|
SIZE szH;
|
|
CHSHFont& FontH = radar_device.pFont[2]; // arial 20pixel?
|
|
FontH.GetTextExtent("", &szH);
|
|
int nHeightH = szH.cy + MECHVIEW_GAP_TEXTS;
|
|
|
|
// Normal Text
|
|
SIZE szT;
|
|
CHSHFont& FontT = radar_device.pFont[3]; // arial 16pixel?
|
|
FontT.GetTextExtent("", &szT);
|
|
int nHeightT = szT.cy + MECHVIEW_GAP_TEXTS;
|
|
|
|
char sz[128];
|
|
char* pszName;
|
|
MW4Shell* shl = MW4Shell::Instance;
|
|
int nX, nY;
|
|
|
|
// draw MechView background if exist
|
|
RECT rc={0,0,480,640};
|
|
if (radar_device.pDDSMechViewBkgnd)
|
|
radar_device.pDDSTarget->BltFast(0,0,radar_device.pDDSMechViewBkgnd,&rc,0);
|
|
|
|
// --------- draw mech image - start
|
|
radar_device.pD3DDevice->SetTexture(0,radar_device.m_pDDSMechView);
|
|
|
|
float tw = radar_device.tw;
|
|
float th = radar_device.th;
|
|
|
|
radar_device.tw = radar_device.m_ptMechViewDim.x;
|
|
radar_device.th = radar_device.m_ptMechViewDim.y;
|
|
|
|
nX = (480 - radar_device.m_ptMechViewSize.x) / 2;
|
|
nY = MECHVIEW_GAP_TOP + nHeightH/*mech name*/ + MECHVIEW_GAP_ABOVE_MECH;
|
|
|
|
int nTX = (radar_device.m_nMechViewCurs % nXCount) * radar_device.m_ptMechViewSize.x;
|
|
int nTY = (radar_device.m_nMechViewCurs / nXCount) * radar_device.m_ptMechViewSize.y;
|
|
|
|
radar_device.DrawTexture((float)nX,(float)nY,0xFFFFFFFF, (float)nTX,(float)nTY,(float)(nTX+radar_device.m_ptMechViewSize.x),(float)(nTY+radar_device.m_ptMechViewSize.y));
|
|
|
|
radar_device.th = th;
|
|
radar_device.tw = tw;
|
|
|
|
nY += radar_device.m_ptMechViewSize.y; // bottom of mech-image
|
|
// --------- draw mech image - end
|
|
|
|
nX = 480 / 2;
|
|
// draw mech name on top/center of mech-image(????)
|
|
pszName = shl->GetShellString(g_aMechSpecs[g_MLCallData.mech_id].m_nNameID);
|
|
sprintf(sz, "%s", pszName);
|
|
FontH.DrawText((float)nX,MECHVIEW_GAP_Y,0xFFFFFF00,sz,TEXTALIGN_HCENTER);
|
|
|
|
// draw mech equipment below mech-image(????)
|
|
nY += MECHVIEW_GAP_UNDER_MECH;
|
|
|
|
bool bAnyEquipped = false;
|
|
strcpy(sz, "");
|
|
|
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
|
|
|
if (g_MLCallData.beagle_installed && g_MLCallData.can_have_beagle) {
|
|
// if (bAnyEquipped)
|
|
// strcat(sz, " / ");
|
|
// strcat(sz, "Beagle");
|
|
// bAnyEquipped = true;
|
|
radar_device.DrawTexture(60,437,0xFFFFFFFF,3,265,74,283);
|
|
}
|
|
|
|
if (g_MLCallData.ecm_installed && g_MLCallData.can_have_ecm) {
|
|
// if (bAnyEquipped)
|
|
// strcat(sz, " / ");
|
|
// strcat(sz, "ECM");
|
|
// bAnyEquipped = true;
|
|
radar_device.DrawTexture(132,437,0xFFFFFFFF,3,285,74,303);
|
|
}
|
|
|
|
if (g_MLCallData.jumpjets_installed && g_MLCallData.can_have_jump) {
|
|
// if (bAnyEquipped)
|
|
// strcat(sz, " / ");
|
|
// strcat(sz, "Jump Jet");
|
|
// bAnyEquipped = true;
|
|
radar_device.DrawTexture(204,437,0xFFFFFFFF,3,305,74,323);
|
|
}
|
|
|
|
if (g_MLCallData.lams_installed && g_MLCallData.can_have_lams) {
|
|
// if (bAnyEquipped)
|
|
// strcat(sz, " / ");
|
|
// strcat(sz, "AMS");
|
|
// bAnyEquipped = true;
|
|
radar_device.DrawTexture(276,437,0xFFFFFFFF,3,325,74,343);
|
|
}
|
|
|
|
if (g_MLCallData.light_installed && g_MLCallData.can_have_light) {
|
|
// if (bAnyEquipped)
|
|
// strcat(sz, " / ");
|
|
// strcat(sz, "Light Amp");
|
|
// bAnyEquipped = true;
|
|
radar_device.DrawTexture(348,437,0xFFFFFFFF,3,345,74,363);
|
|
}
|
|
|
|
if (g_MLCallData.ams_installed && g_MLCallData.can_have_ams) {
|
|
// if (bAnyEquipped)
|
|
// strcat(sz, " / ");
|
|
// strcat(sz, "AMS");
|
|
// bAnyEquipped = true;
|
|
}
|
|
|
|
|
|
FontT.DrawText(nX,nY,0xFFFFFF00,sz,TEXTALIGN_HCENTER);
|
|
|
|
nY += nHeightH+15;
|
|
|
|
int nYSaved = nY;
|
|
|
|
// draw left-pane information
|
|
nX = 40 + MECHVIEW_GAP_X;
|
|
|
|
pszName = shl->GetShellString(g_aMechSpecs[g_MLCallData.mech_id].m_nTech);
|
|
sprintf(sz, "Tech: %s", pszName);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
pszName = shl->GetShellString(g_aMechSpecs[g_MLCallData.mech_id].m_nClass);
|
|
sprintf(sz, "Class: %s", pszName);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Accel (m/sec): %3.2f", g_MLCallData.acceleration);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Decel (m/sec): %3.2f", g_MLCallData.deacceleration);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Turn Rate (deg/sec): %3.2f", g_MLCallData.turn_rate);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Torso Range: %3.2f", g_MLCallData.torso_twist*2);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Twist Speed: %3.2f", g_MLCallData.twist_speed);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
// draw right-pane information
|
|
nY = nYSaved;
|
|
nX = 300 - MECHVIEW_GAP_X;
|
|
|
|
sprintf(sz, "Fire power: %d", g_MLCallData.battle_value);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Armor: %d", g_MLCallData.armor_value);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Speed: %d", g_MLCallData.speed_value);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Heat Efficiency: %d", g_MLCallData.heat_eff);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
sprintf(sz, "Tonnage (tons): %3.2f", g_MLCallData.mech_max_tonnage);
|
|
FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
nY += nHeightT;
|
|
|
|
// sprintf(sz, "Current Tonnage: %3.2f", g_MLCallData.mech_tonnage);
|
|
// FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
// nY += nHeightT;
|
|
|
|
// sprintf(sz, "Available Tonnage: %3.2f", g_MLCallData.mech_max_tonnage - g_MLCallData.mech_tonnage);
|
|
// FontT.DrawText(nX,nY,0xFF03E829,sz,TEXTALIGN_LEFT);
|
|
// nY += nHeightT;
|
|
|
|
//sprintf(sz, "Frame: %d/%d", radar_device.m_nMechViewCurs, radar_device.m_nMechViewMax);
|
|
//radar_device.pFont[0].DrawText(10.0,10.0,0xFFFFFFFF,sz);
|
|
|
|
// restore radar background image for safety...
|
|
radar_device.pD3DDevice->SetTexture(0,radar_device.pDDSTexture);
|
|
|
|
if (g_pfnCTCL_AfterBeginScene == CTCL_UpdateMechView) {
|
|
extern int g_nTypeOfMFDs; // 0 - no MFDs, 1 - orginal(5+1=dual & single), 2 - B&W(3 + 1=1 dual), 3 - color(3 + 1=2 dual)
|
|
switch(g_nTypeOfMFDs)
|
|
{
|
|
case 1:
|
|
sh_step = 6;
|
|
break;
|
|
case 2:
|
|
radar_device.EndScene();
|
|
//radar_device.pDDSFront->Flip(0,DDFLIP_DONOTWAIT|DDFLIP_NOVSYNC );
|
|
mfd_device.BeginScene();
|
|
sh_step = 4;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
// jcem end
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int
|
|
MW4Shell::gosGetWeaponStats(void *instance, int numParams, void* data[])
|
|
{
|
|
int *id = INTARRAYPARAM(0);
|
|
Scalar *damage_array = SCALARARRAYPARAM(1);
|
|
Scalar *range_array = SCALARARRAYPARAM(2);
|
|
Scalar *heat_array = SCALARARRAYPARAM(3);
|
|
Scalar *recycle_array = SCALARARRAYPARAM(4);
|
|
Scalar *tonnage_array = SCALARARRAYPARAM(5);
|
|
|
|
MWTable::TableIterator *iterator = MWApplication::GetInstance()->m_weaponsTable->MakeTableIterator();
|
|
MWTableEntry *weapon_entry;
|
|
|
|
while((weapon_entry = iterator->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(weapon_entry);
|
|
Resource modelResource;
|
|
Entity::GetGameModelResourceFromDataListID (&modelResource, weapon_entry->GetEntryResourceID());
|
|
Verify (modelResource.DoesResourceExist());
|
|
|
|
const Weapon::GameModel *weaponModel =
|
|
Cast_Pointer(Weapon::GameModel *, modelResource.GetPointer());
|
|
Check_Pointer(weaponModel);
|
|
|
|
if ( weaponModel->itemID == *id )
|
|
{
|
|
*damage_array = weaponModel->damageAmount * weaponModel->numFire;
|
|
if(weaponModel->itemID == W_ArtilleryStrike)
|
|
*damage_array = 40.0f;
|
|
*range_array = weaponModel->maxDistance;
|
|
*heat_array = weaponModel->heat * 2.0f;
|
|
*recycle_array = weaponModel->reloadTime;
|
|
*tonnage_array = weaponModel->tonage;
|
|
}
|
|
}
|
|
|
|
delete iterator;
|
|
|
|
return 1;
|
|
}
|