Files
firestorm/Gameleap/code/mw4/Tools/autoconfig/autoconfigDlg.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
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.
2026-06-24 21:28:16 -05:00

1071 lines
26 KiB
C++

// autoconfigDlg.cpp : implementation file
//
#include "stdafx.h"
#include "autoconfig.h"
#include "autoconfigDlg.h"
#include "ConfigError.h"
#include "Stuff\NotationFile.hpp"
#include "..\..\code\buildnum\buildnum.h" // get the current build number
#if !defined(STUFF_STUFF_HPP)
#include "Stuff\Stuff.hpp"
#endif
#include <GameOS\GameOS.hpp>
#include <MFCPlatform\MFCPlatform.hpp>
#include <Stuff\NotationFile.hpp>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PROC_SPEED_SLOP 20
#define PROC_SPEED_MIN (300-PROC_SPEED_SLOP)
#define PROC_SPEED_LOW (400-PROC_SPEED_SLOP)
#define PROC_SPEED_MED (566-PROC_SPEED_SLOP)
#define PROC_SPEED_HIGH (750-PROC_SPEED_SLOP)
#define VMEM_SLOP_FACTOR (1024*1024)
#define LOWVMEM (6*1024*1024-VMEM_SLOP_FACTOR)
#define MIDVMEM (16*1024*1024-VMEM_SLOP_FACTOR)
#define HIGHVMEM (32*1024*1024-VMEM_SLOP_FACTOR)
#define SYSMEM_MIN 64
#define SYSMEM_INC 32
#define SYSMEM_SLOP_FACTOR (SYSMEM_INC/2)
HGOSHEAP Heap;
#define PERDEVCOUNT 1
const char *PerferedDeviceList[PERDEVCOUNT]={"PLACEHOLDER DEVICE"};
enum LEVEL {
L_Low = 0,
L_Med = 1,
L_High = 2,
L_XHigh = 3
} ;
#define SYSMEM_INDEXCAP 15
LEVEL LevelMat[4][4][SYSMEM_INDEXCAP]=
{
// Smem 64 96 128 160 192 224 256 288 320 352 384 416 448 480 512
// 300-400Mhz
{
/* vmem 8MB */ {L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low, L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low},
/* vmem 16MB */ {L_Low ,L_Low ,L_Med ,L_Med ,L_Med ,L_Med, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 32MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 64MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
},
// 400-566Mhz
{
/* vmem 8MB */ {L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 16MB */ {L_Low ,L_Low ,L_Med ,L_Med ,L_Med ,L_Med, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 32MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med, L_High ,L_High ,L_High ,L_High ,L_High ,L_High ,L_High ,L_High ,L_High},
/* vmem 64MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med, L_High ,L_High ,L_High ,L_High ,L_High ,L_High ,L_High ,L_High ,L_High},
},
// 566-750Mhz
{
/* vmem 8MB */ {L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 16MB */ {L_Low ,L_Low ,L_Med ,L_Med ,L_Med ,L_Med, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 32MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_High ,L_High, L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh},
/* vmem 64MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_High ,L_High, L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh},
},
// 750Mhz-1Ghz
{
/* vmem 8MB */ {L_Low ,L_Low ,L_Low ,L_Low ,L_Low ,L_Low, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 16MB */ {L_Low ,L_Low ,L_Med ,L_Med ,L_Med ,L_Med, L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med ,L_Med},
/* vmem 32MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_High ,L_High, L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh},
/* vmem 64MB */ {L_Low ,L_Med ,L_Med ,L_Med ,L_High ,L_High, L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh,L_XHigh},
}
};
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
CString m_Str1;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
m_Str1 = _T("");
//}}AFX_DATA_INIT
m_Str1.Format("AutoConfig Version %s",VER_PRODUCTVERSION_STR);
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
DDX_Text(pDX, IDC_STR1, m_Str1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAutoconfigDlg dialog
LRESULT CALLBACK WinProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return GameOSWinProc( hWnd, uMsg, wParam, lParam );
}
CAutoconfigDlg::CAutoconfigDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAutoconfigDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAutoconfigDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
gosCreated = false;
for(int i=0;i<16;i++) BadCard[i]=false;
}
CAutoconfigDlg::~CAutoconfigDlg()
{
if (gosCreated)
{
TerminateGameEngine();
gos_PopCurrentHeap();
ExitGameOS();
::DestroyWindow(Window);
gosCreated = false;
}
}
void CAutoconfigDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAutoconfigDlg)
DDX_Control(pDX, IDC_TEXTSIZE, m_FontSize);
DDX_Control(pDX, IDC_ANTIALIAS, m_AntiAliasList);
DDX_Control(pDX, IDC_MACHINE, m_MachineList);
DDX_Control(pDX, IDC_SIMPLE, m_SimBut);
DDX_Control(pDX, IDC_ADVANCED, m_AdvBut);
DDX_Control(pDX, IDC_SHADOWLEVEL, m_ShadowList);
DDX_Control(pDX, IDC_WATER, m_WaterList);
DDX_Control(pDX, IDC_VIDEOCARD, m_VideCardList);
DDX_Control(pDX, IDC_VERTEXLIGHT, m_VertexLightList);
DDX_Control(pDX, IDC_TEXTURE_LEVEL, m_TextureLevelList);
DDX_Control(pDX, IDC_TERRAIN_LEVEL, m_TerrainLevelList);
DDX_Control(pDX, IDC_SOUNDDETAIL, m_SDetailList);
DDX_Control(pDX, IDC_SCREENRES, m_ScreenResList);
DDX_Control(pDX, IDC_NOBLEND, m_NoBlendList);
DDX_Control(pDX, IDC_MUSIC, m_MusicList);
DDX_Control(pDX, IDC_MULTI_TEXTURE, m_MultiTextureList);
DDX_Control(pDX, IDC_MAXLIGHTS, m_MaxLightsList);
DDX_Control(pDX, IDC_LOD_LEVEL, m_LODLevelList);
DDX_Control(pDX, IDC_LIGHTMAP, m_LightMapList);
DDX_Control(pDX, IDC_FOOTSTEPS, m_FootStepList);
DDX_Control(pDX, IDC_EFFECT_LEVEL, m_EffectList);
DDX_Control(pDX, IDC_DETAIL_TEXTURE, m_DetailList);
DDX_Control(pDX, IDC_CULTURAL, m_CultList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAutoconfigDlg, CDialog)
//{{AFX_MSG_MAP(CAutoconfigDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_TEST, OnTest)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_TEST2, OnExit)
ON_CBN_SELCHANGE(IDC_VIDEOCARD, OnSelchangeVideocard)
ON_BN_CLICKED(IDC_ADVANCED, OnAdvanced)
ON_BN_CLICKED(IDC_SIMPLE, OnSimple)
ON_CBN_SELCHANGE(IDC_MACHINE, OnSelchangeMachine)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAutoconfigDlg message handlers
BOOL CAutoconfigDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
InitGos();
::ShowWindow(Window,SW_HIDE);
InitComboBoxes();
SetDlgMode(true);
AutoDetectLevel(BestDevice());
return TRUE; // return TRUE unless you set the focus to a control
}
void CAutoconfigDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CAutoconfigDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CAutoconfigDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
DWORD CAutoconfigDlg::GetDeviceMemory(int device)
{
DWORD did=gos_GetMachineInformation(gos_Info_GetDeviceDeviceID,device);
if( gos_GetMachineInformation(gos_Info_GetDeviceVendorID,device)==0x121a)
{ // Fake it for Voodoods
if(did==1) return 0;
if(did==2) return LOWVMEM+VMEM_SLOP_FACTOR;
if(did==5) return MIDVMEM+VMEM_SLOP_FACTOR;
if(did==9) return HIGHVMEM+VMEM_SLOP_FACTOR;
}
DWORD agp_memory=(DWORD)gos_GetMachineInformation( gos_Info_GetDeviceAGPMemory,device );
DWORD texture_memory=(DWORD)gos_GetMachineInformation(gos_Info_GetDeviceLocalMemory,device);
DWORD vid_card_memory=texture_memory>agp_memory?texture_memory:agp_memory;
return vid_card_memory;
}
void CAutoconfigDlg::AutoDetectLevel(int device)
{
int systemLevel;
DWORD system_memory = (DWORD)gos_GetMachineInformation( gos_Info_GetMemorySize ) ;
DWORD proc_speed = (DWORD)gos_GetMachineInformation( gos_Info_GetProcessorSpeed );
DWORD vid_card_memory = GetDeviceMemory(device);
int proc_index,vmem_index,smem_index;
system_memory>>=20; // convert to MB
system_memory+=SYSMEM_SLOP_FACTOR; // Add some Slop
if(system_memory<SYSMEM_MIN)
{
smem_index=0;
}
else
{
smem_index=(system_memory-SYSMEM_MIN)/SYSMEM_INC; //convert to index
if(smem_index>=SYSMEM_INDEXCAP) smem_index=SYSMEM_INDEXCAP-1; //cap it
}
if(proc_speed<=PROC_SPEED_LOW)
{
proc_index=0;
}
else if(proc_speed<=PROC_SPEED_MED)
{
proc_index=1;
}
else if(proc_speed<=PROC_SPEED_HIGH)
{
proc_index=2;
}
else
{
proc_index=3;
}
if (vid_card_memory <= LOWVMEM)
{
vmem_index = 0;
}
else if (vid_card_memory <= MIDVMEM)
{
vmem_index = 1;
}
else if (vid_card_memory <= HIGHVMEM)
{
vmem_index = 2;
}
else
{
vmem_index = 3;
}
systemLevel = LevelMat[proc_index][vmem_index][smem_index];
DefaultToLevel(systemLevel);
}
void CAutoconfigDlg::Save(bool killgame)
{
// save it out....
Stuff::NotationFile notefile("options.ini");
Stuff::Page *page = notefile.SetPage("Graphics Options");
Check_Object(page);
Stuff::Page *spage = notefile.SetPage("Sound Options");
Check_Object(spage);
Stuff::Page *compage = notefile.SetPage("Special Commands");
Check_Object(compage);
compage->SetEntry("KillGame",killgame);
page->SetEntry("VideoDriverIndex", m_VideCardList.GetCurSel() );
page->SetEntry("DetailTexture", m_SDetailList.GetCurSel()==0?false:true);
page->SetEntry("MultiTexture", m_MultiTextureList.GetCurSel()==0?false:true);
page->SetEntry("LightMaps", m_LightMapList.GetCurSel()==0?false:true);
page->SetEntry("Culturals", m_CultList.GetCurSel()==0?false:true);
page->SetEntry("Footsteps",m_FootStepList.GetCurSel()==0?false:true);
page->SetEntry("MissionMusic", m_MusicList.GetCurSel()==0?false:true);
page->SetEntry("NoBlend", m_NoBlendList.GetCurSel()==0?false:true);
page->SetEntry("AntiAlias", m_AntiAliasList.GetCurSel()==0?false:true);
page->SetEntry("VertexLighting", m_VertexLightList.GetCurSel()==0?false:true);
page->SetEntry("SimpleLighting", m_VertexLightList.GetCurSel()==0?true:false);
page->SetEntry("MipBias",m_TextureLevelList.GetCurSel());
page->SetEntry("ShadowMode", m_ShadowList.GetCurSel());
int fontval=0;
switch(m_FontSize.GetCurSel())
{
case 0: fontval=2; break;
case 1: fontval=0; break;
case 2: fontval=-2; break;
}
page->SetEntry("fontsmall",fontval);
page->SetEntry("fontmedium",fontval);
page->SetEntry("fontlarge",fontval);
page->SetEntry("fontlarge2",fontval);
page->SetEntry("fontlarge3",fontval);
DWORD sresval=m_ScreenResList.GetItemData(m_ScreenResList.GetCurSel());
int device=m_VideCardList.GetItemData(m_VideCardList.GetCurSel());
DWORD screenval=gos_GetMachineInformation(gos_Info_GetValidMode,device,sresval>>16,sresval&0xffff);
int x,y,d;
x=screenval>>16;;
y=screenval&0xffff;
d=sresval>>16;
page->SetEntry("screenwidth",x);
page->SetEntry("screenheight",y);
page->SetEntry("bitdepth",d);
switch (m_SDetailList.GetCurSel())
{
case L_Low:
spage->SetEntry("LowEndSound",true);
spage->SetEntry("Radius",0.25f);
break;
case L_Med:
case L_XHigh:
case L_High:
default:
spage->SetEntry("LowEndSound",false);
spage->SetEntry("Radius",1.0f);
break;
}
switch (m_WaterList.GetCurSel())
{
case L_Low:
page->SetEntry("FancyWater",false);
page->SetEntry("MovieTextures",false);
break;
case L_Med:
page->SetEntry("FancyWater",false);
page->SetEntry("MovieTextures",true);
break;
case L_High:
case L_XHigh:
default:
page->SetEntry("FancyWater",true);
page->SetEntry("MovieTextures",true);
break;
}
switch (m_MaxLightsList.GetCurSel())
{
case L_Low:
page->SetEntry("MaxLights",2);
break;
case L_Med:
page->SetEntry("MaxLights",4);
break;
case L_High:
page->SetEntry("MaxLights",8);
break;
default:
case L_XHigh:
page->SetEntry("MaxLights",8);
break;
}
switch (m_TerrainLevelList.GetCurSel())
{
case L_Low:
page->SetEntry("Compositing",0);
break;
case L_Med:
page->SetEntry("Compositing", 1);
break;
case L_High:
page->SetEntry("Compositing", 2);
break;
default:
case L_XHigh:
page->SetEntry("Compositing", 3);
break;
}
switch (m_EffectList.GetCurSel())
{
case L_Low:
page->SetEntry("EffectLOD",250000.0f );
break;
case L_Med:
page->SetEntry("EffectLOD", 62500.0f);
break;
case L_High:
page->SetEntry("EffectLOD",10000.0f );
break;
case L_XHigh:
page->SetEntry("EffectLOD",0.0f );
break;
}
switch (m_LODLevelList.GetCurSel())
{
case L_Low:
page->SetEntry("LOD", 2500.0f);
break;
case L_Med:
page->SetEntry("LOD", 900.0f);
break;
case L_High:
page->SetEntry("LOD", 400.0f);
break;
case L_XHigh:
page->SetEntry("LOD", 0.0f );
break;
}
DWORD system_memory = (DWORD)gos_GetMachineInformation( gos_Info_GetMemorySize ) ;
system_memory>>=20; // convert to MB
system_memory+=SYSMEM_SLOP_FACTOR; // Add some Slop
if(system_memory>=256)
page->SetEntry("LoadRadius", 4 );
else
page->SetEntry("LoadRadius", 1 );
Stuff::Page *serverpage = notefile.SetPage("server");
Check_Object(serverpage);
bool temp_bool = false;
if (!serverpage->GetEntry("AllowDecalTransfer", &temp_bool))
{
serverpage->SetEntry("AllowDecalTransfer", 0 );
}
notefile.Save();
}
void CAutoconfigDlg::InitGos()
{
if (!gosCreated)
{
HINSTANCE hInstance;
hInstance = AfxGetResourceHandle();
WNDCLASS wc;
wc.style = CS_BYTEALIGNCLIENT | CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = "Test MFC";
wc.lpszClassName = "Test MFC";
RegisterClass(&wc);
RECT WindowRect;
WindowRect.left=0;
WindowRect.top=0;
WindowRect.right=640;
WindowRect.bottom=480;
AdjustWindowRect( &WindowRect,WS_OVERLAPPED,0 );
Window = CreateWindow( "Test MFC", "Test MFC",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top,
NULL, NULL, hInstance, NULL);
//::ShowWindow( Window, SW_SHOWDEFAULT );
//
// Init GameOS with window created
//
InitGameOS( hInstance, Window, NULL );
gosCreated = true;
}
}
void CAutoconfigDlg::OnTest()
{
Stuff::ArmorLevel = 4;
InitGos();
int bestdev=BestDevice();
for(int i=0;i<m_VideCardList.GetCount();i++)
if(m_VideCardList.GetItemData(i)==bestdev)
m_VideCardList.SetCurSel(i);
AutoDetectLevel(bestdev);
}
int CAutoconfigDlg::BestDevice()
{
int lowdev=PERDEVCOUNT,dsel=-1,devmem=-1;
int devcount=gos_GetMachineInformation( gos_Info_NumberDevices);
int i,j;
if(devcount<=0)
STOP(("No Rendering Devices Found"));
for(i=0;i<devcount;i++)
for(j=0;j<lowdev;j++)
{
if(!strcmpi(PerferedDeviceList[j],(char *)gos_GetMachineInformation( gos_Info_GetDeviceName,i)))
{
dsel=i;
lowdev=j;
devmem=GetDeviceMemory(i);
break;
}
}
int himem=-1,hidev=-1;
for(i=0;i<devcount;i++)
{
if(himem<(int)GetDeviceMemory(i))
{
himem=(int)GetDeviceMemory(i);
hidev=i;
}
}
if(dsel>=0 && hidev>=0)
{
dsel=GetDeviceMemory(dsel)>GetDeviceMemory(himem)?dsel:himem;
}
else
dsel=hidev;
Verify(dsel>=0 && dsel<devcount);
return dsel;
}
void CAutoconfigDlg::InitComboBoxes()
{
CString string;
int itm;
int devcount=gos_GetMachineInformation( gos_Info_NumberDevices);
int i;
if(devcount<=0)
STOP(("No Rendering Devices Found"));
for(i=0;i<devcount && i<16;i++)
{
CString str=(char *)gos_GetMachineInformation( gos_Info_GetDeviceName,i);
if(GetDeviceMemory(i)<LOWVMEM)
{
BadCard[i]=true;
str+=": UnSupported";
}
else
{
BadCard[i]=false;
}
itm=m_VideCardList.AddString(str);
m_VideCardList.SetItemData(itm,i);
}
int bestdev=BestDevice();
for(i=0;i<m_VideCardList.GetCount();i++)
if(m_VideCardList.GetItemData(i)==bestdev)
m_VideCardList.SetCurSel(i);
GetResList();
}
void CAutoconfigDlg::GetResList()
{
m_ScreenResList.ResetContent();
int device=m_VideCardList.GetItemData(m_VideCardList.GetCurSel());
DWORD nummodes,depth,screenval,sx,sy;
depth=16;
for(int modepass=0;modepass<2;modepass++)
{
nummodes=gos_GetMachineInformation(gos_Info_NumberValidModes,device,depth);
for(int modenum=0;modenum<nummodes;modenum++)
{
screenval=gos_GetMachineInformation(gos_Info_GetValidMode,device,depth,modenum);
sy=screenval&0xffff;
sx=screenval>>16;
if( (sx>=640 && sy>=480) &&
(
(sx==640 && sy==480) ||
(sx==800 && sy==600) ||
(sx==1024 && sy==768) ||
(sx==1280 && sy==1024) ||
(sx==1600 && sy==1200)
)
)
{
CString modestr;
modestr.Format("%ix%ix%i",sx,sy,depth);
int itm=m_ScreenResList.AddString(modestr);
m_ScreenResList.SetItemData(itm,(depth<<16)|modenum);
}
}
depth=32;
}
m_ScreenResList.SetCurSel(0);
}
int CAutoconfigDlg::GetModeInList(int xval,int yval,int dep)
{
int mode=-1;
for(int i=0;i<m_ScreenResList.GetCount() && mode==-1;i++)
{
DWORD sresval=m_ScreenResList.GetItemData(i);
int device=m_VideCardList.GetItemData(m_VideCardList.GetCurSel());
DWORD screenval=gos_GetMachineInformation(gos_Info_GetValidMode,device,sresval>>16,sresval&0xffff);
int x,y,d;
x=screenval>>16;
y=screenval&0xffff;
d=sresval>>16;
if(x==xval && y==yval && d==dep) mode=i;
}
return mode;
}
void CAutoconfigDlg::DefaultToLevel(int syslev)
{
m_MachineList.SetCurSel(syslev);
int mode;
switch (syslev)
{
case L_Low:
m_DetailList.SetCurSel(0);
m_MultiTextureList.SetCurSel(0);
m_LightMapList.SetCurSel(0);
m_VertexLightList.SetCurSel(0);
m_CultList.SetCurSel(0);
m_FootStepList.SetCurSel(0);
m_MusicList.SetCurSel(0);
m_NoBlendList.SetCurSel(1);
m_TextureLevelList.SetCurSel(2);
m_ShadowList.SetCurSel(0);
m_WaterList.SetCurSel(0);
m_TerrainLevelList.SetCurSel(0);
m_SDetailList.SetCurSel(0);
m_MaxLightsList.SetCurSel(0);
m_LODLevelList.SetCurSel(0);
m_EffectList.SetCurSel(0);
m_AntiAliasList.SetCurSel(0);
m_FontSize.SetCurSel(2);
mode=GetModeInList(640,480,16);
m_ScreenResList.SetCurSel(mode>=0?mode:0);
break;
case L_Med:
m_DetailList.SetCurSel(1);
m_MultiTextureList.SetCurSel(1);
m_LightMapList.SetCurSel(1);
m_VertexLightList.SetCurSel(1);
m_CultList.SetCurSel(1);
m_FootStepList.SetCurSel(1);
m_MusicList.SetCurSel(1);
m_NoBlendList.SetCurSel(0);
m_TextureLevelList.SetCurSel(1);
m_WaterList.SetCurSel(1);
m_MaxLightsList.SetCurSel(1);
m_SDetailList.SetCurSel(1);
m_ShadowList.SetCurSel(1);
m_TerrainLevelList.SetCurSel(1);
m_LODLevelList.SetCurSel(1);
m_EffectList.SetCurSel(1);
m_AntiAliasList.SetCurSel(0);
m_FontSize.SetCurSel(2);
mode=GetModeInList(800,600,16);
m_ScreenResList.SetCurSel(mode>=0?mode:0);
break;
default:
case L_High:
m_DetailList.SetCurSel(1);
m_MultiTextureList.SetCurSel(1);
m_LightMapList.SetCurSel(1);
m_VertexLightList.SetCurSel(1);
m_CultList.SetCurSel(1);
m_FootStepList.SetCurSel(1);
m_MusicList.SetCurSel(1);
m_NoBlendList.SetCurSel(0);
m_TextureLevelList.SetCurSel(0);
m_WaterList.SetCurSel(2);
m_MaxLightsList.SetCurSel(2);
m_SDetailList.SetCurSel(2);
m_ShadowList.SetCurSel(2);
m_TerrainLevelList.SetCurSel(2);
m_LODLevelList.SetCurSel(2);
m_EffectList.SetCurSel(2);
m_AntiAliasList.SetCurSel(0);
m_FontSize.SetCurSel(2);
mode=GetModeInList(800,600,16);
m_ScreenResList.SetCurSel(mode>=0?mode:0);
break;
case L_XHigh:
m_DetailList.SetCurSel(1);
m_MultiTextureList.SetCurSel(1);
m_LightMapList.SetCurSel(1);
m_VertexLightList.SetCurSel(1);
m_CultList.SetCurSel(1);
m_FootStepList.SetCurSel(1);
m_MusicList.SetCurSel(1);
m_NoBlendList.SetCurSel(0);
m_TextureLevelList.SetCurSel(0);
m_WaterList.SetCurSel(2);
m_MaxLightsList.SetCurSel(2);
m_SDetailList.SetCurSel(3);
m_ShadowList.SetCurSel(2);
m_TerrainLevelList.SetCurSel(3);
m_LODLevelList.SetCurSel(3);
m_EffectList.SetCurSel(3);
m_AntiAliasList.SetCurSel(0);
m_FontSize.SetCurSel(2);
mode=GetModeInList(800,600,16);
m_ScreenResList.SetCurSel(mode>=0?mode:0);
break;
}
}
void CAutoconfigDlg::OnClose()
{
if(BadCard[m_VideCardList.GetCurSel()])
{
CConfigError dlg(m_VideCardList.GetCount()>1,this);
dlg.DoModal();
switch(dlg.retval)
{
case -1: Save(true); CDialog::OnClose(); return; break;
case 0: return; break;
case 1: Save(false); CDialog::OnClose(); break;
}
return;
}
Save(false);
CDialog::OnClose();
}
void CAutoconfigDlg::OnExit()
{
if(BadCard[m_VideCardList.GetCurSel()])
{
CConfigError dlg(m_VideCardList.GetCount()>1,this);
dlg.DoModal();
switch(dlg.retval)
{
case -1: Save(true); CDialog::OnOK(); return; break;
case 0: return; break;
case 1: Save(false); CDialog::OnOK(); return; break;
}
return;
}
Save(false);
CDialog::OnOK();
}
void CAutoconfigDlg::OnSelchangeVideocard()
{
// TODO: Add your control notification handler code here
GetResList();
AutoDetectLevel(m_VideCardList.GetItemData(m_VideCardList.GetCurSel()));
}
LRESULT CAutoconfigDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
LRESULT res=NULL;
__try
{
res=CDialog::WindowProc(message, wParam, lParam);
}
__except(ProcessException(GetExceptionInformation()))
{
}
return res;
}
void CAutoconfigDlg::SetDlgMode(bool simple)
{
m_ShadowList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_WaterList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_VideCardList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_VertexLightList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_TextureLevelList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_TerrainLevelList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_SDetailList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_ScreenResList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_NoBlendList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_MusicList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_MultiTextureList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_MaxLightsList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_LODLevelList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_LightMapList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_FootStepList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_EffectList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_DetailList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_CultList.ShowWindow(simple?SW_HIDE:SW_SHOW);
m_AdvBut.ShowWindow(simple?SW_SHOW:SW_HIDE);
m_SimBut.ShowWindow(simple?SW_HIDE:SW_SHOW);
if(simple)
{
GetWindowRect(&OrgRect);
CRect rct;
m_MachineList.GetWindowRect(&rct);
ScreenToClient(&rct);
SetWindowPos(NULL,0,0,OrgRect.Width(),rct.bottom+50,SWP_NOMOVE|SWP_NOZORDER);
}
else
SetWindowPos(NULL,0,0,OrgRect.Width(),OrgRect.Height(),SWP_NOMOVE|SWP_NOZORDER);
}
void CAutoconfigDlg::OnAdvanced()
{
SetDlgMode(false);
}
void CAutoconfigDlg::OnSimple()
{
SetDlgMode(true);
}
void CAutoconfigDlg::OnSelchangeMachine()
{
// TODO: Add your control notification handler code here
DefaultToLevel(m_MachineList.GetCurSel());
}