Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24ce46ab6d | ||
|
|
b40892910b | ||
|
|
0f901f71d5 | ||
|
|
7fc9089aad | ||
|
|
7f7f98d992 |
@@ -1039,7 +1039,13 @@ rebuild between attempts. Results (no dgVoodoo2, shim applied, `-tmfds 4`):
|
|||||||
**CONCLUSION: on modern Windows only ONE DirectDraw object per process may hold exclusive
|
**CONCLUSION: on modern Windows only ONE DirectDraw object per process may hold exclusive
|
||||||
fullscreen.** The main display takes it; every secondary panel is refused. XP allowed multiple;
|
fullscreen.** The main display takes it; every secondary panel is refused. XP allowed multiple;
|
||||||
**dgVoodoo2 allows it because it is a full reimplementation of ddraw, not bound by that rule.**
|
**dgVoodoo2 allows it because it is a full reimplementation of ddraw, not bound by that rule.**
|
||||||
=> **dgVoodoo2 cannot be removed for `-tmfds 1/3/4` by fixing flags.** Default stays `-tcoop 0`.
|
=> **dgVoodoo2 cannot be removed by fixing flags.** The limitation is per *secondary display*,
|
||||||
|
not per feature, so it applies to **every mode that opens a second monitor** — all MFD modes
|
||||||
|
(`-tmfds 1/3/4`) **and cameraship mode**, which drives two displays with no MFDs at all via the
|
||||||
|
single-secondary `mr_device` path (`IsMultimonitorAvaliable()` returns false for
|
||||||
|
`_ECTCL_CameraShip`, so it falls to `IsSecondaryMonitorAvaliable()` — still a second exclusive
|
||||||
|
IDirectDraw7). **Console mode is the only configuration that needs no dgVoodoo2**, because it is
|
||||||
|
single-display. Default stays `-tcoop 0`.
|
||||||
(`-tcoop` is retained: it is how this was settled and will re-settle it on different hardware.)
|
(`-tcoop` is retained: it is how this was settled and will re-settle it on different hardware.)
|
||||||
|
|
||||||
### ✅ Working 4-monitor config (WITH dgVoodoo2)
|
### ✅ Working 4-monitor config (WITH dgVoodoo2)
|
||||||
@@ -1106,6 +1112,61 @@ Smaller than it sounds because the mechanisms already exist:
|
|||||||
- New switches are documented in `-help` (`-fps` under LOGGING AND DIAGNOSTICS, `-tcoop` under
|
- New switches are documented in `-help` (`-fps` under LOGGING AND DIAGNOSTICS, `-tcoop` under
|
||||||
DISPLAY AND VIDEO).
|
DISPLAY AND VIDEO).
|
||||||
|
|
||||||
|
## STEP 11: Cameraship Map/Armor screen shows background but no overlays — SOLVED
|
||||||
|
## (2026-07-26): it is the CTCL role, NOT the video card
|
||||||
|
|
||||||
|
Reported as *"the secondary armor/score/map screen in cameraship mode shows the background BMP
|
||||||
|
fine but none of the overlay graphics, with certain video cards but not others"*. **The video
|
||||||
|
card is a red herring. The machine was not being told it was a cameraship.**
|
||||||
|
|
||||||
|
### Root cause
|
||||||
|
`-ctcltype <n>` maps **straight** to the role enum — no remapping
|
||||||
|
(`MW4Application.cpp:~1534`, `g_nCTCL = token[0]-'0'`; `ctcl_params.h`):
|
||||||
|
`1 = console`, **`2 = game pod`**, **`3 = cameraship`**, `4 = none`.
|
||||||
|
The failing launch line used `-ctcltype 2` (game pod). The overlay drawing in
|
||||||
|
`mw4\Code\MW4\hudchat.cpp:~596` is gated on
|
||||||
|
`bool draw_mr = CTCL_GetType()==_ECTCL_CameraShip;` (`#ifdef _DEBUG` -> unconditional `true`),
|
||||||
|
so with role 2 the overlay block simply never executes. Fixed by launching `-ctcltype 3`
|
||||||
|
(user-confirmed working).
|
||||||
|
|
||||||
|
### ⚠️ Why this is so hard to spot — the two gates are INDEPENDENT
|
||||||
|
**The Map/Armor screen opens and paints its background regardless of the CTCL role.**
|
||||||
|
`HSH_EnterFullScreen2` / `CMR_Device` decide purely on *"is a spare secondary monitor
|
||||||
|
available?"* and never consult `CTCL_GetType()`; only `hudchat.cpp` checks the role. So a wrong
|
||||||
|
`-ctcltype` produces a screen that lights up, shows the correct artwork, survives mode changes
|
||||||
|
and renders nothing — **visually identical to a graphics-card/DirectDraw fault**, which is
|
||||||
|
exactly why it got mis-attributed to specific GPUs. Diagnose it from `gos-displays.txt`
|
||||||
|
(`CTCL type = ...`), never by eye.
|
||||||
|
- Corollary: `mr_device` also opens in **non-cameraship** configs. Observed here with
|
||||||
|
`-tmfds 1` when `g_nDualHead = -1` (no spanned pair found): MFD mode 1 fell through to the
|
||||||
|
single-secondary `mr_device` path on a *game pod*, giving the same background-only screen.
|
||||||
|
- **Field triage:** on a failing machine read that pod's `ctcl.ini` launch line and its
|
||||||
|
`gos-displays.txt`. `CTCL type = 2` means it is misconfigured, not broken.
|
||||||
|
|
||||||
|
### Diagnostics added (kept)
|
||||||
|
- **`CTCL type = <n>` line in `gos-displays.txt`** (`render.cpp` `HSH_EnterFullScreen2`, via the
|
||||||
|
already-present `g_pfnCTCL_GetType` hook — no game-code dependency). Always logged, states in
|
||||||
|
words whether overlays will be drawn. One look settles the question.
|
||||||
|
- **`-tmr <0-3>`** Map/Armor diagnostic ladder (`g_nMRDiag`, `CMR_Device::BeginScene`):
|
||||||
|
0 = normal, 1 = background blit with `DDBLTFAST_WAIT|DDBLTFAST_NOCOLORKEY`,
|
||||||
|
2 = `Clear` instead of the background blit, 3 = additionally alpha-blend off + untextured
|
||||||
|
magenta `DrawQuad`. Results that cracked this: **3 drew magenta** (device/3D/flip all fine),
|
||||||
|
**2 was pure black** (the background blit was never erasing the overlays), 1 unchanged.
|
||||||
|
- **Draw-call counter** — `CHSH_Device::m_nDrawCalls`, bumped in `DrawQuad` / `DrawThickFrame` /
|
||||||
|
`DrawTexture`, reset in `CMR_Device::BeginScene`, reported for the first 5 frames from
|
||||||
|
`CMR_Device::EndScene` when `g_nMRDiag` is set. **This was the decisive instrument:**
|
||||||
|
`0 draw call(s)` proves the overlay code never ran (a gating problem), whereas non-zero with a
|
||||||
|
blank screen would mean it ran and drew invisibly (texture/alpha). Keep it — it separates
|
||||||
|
"not running" from "not visible" in one run.
|
||||||
|
- Also logged: `CMR_Device` surface creation (`pDDSBackground`/`pDDSTexture`/`pDDSMapTexture`)
|
||||||
|
plus the overlay texture's size/bpp and channel masks. Healthy reference reading on the W4100:
|
||||||
|
`256x256 16bpp a=0000F000 r=00000F00 g=000000F0 b=0000000F` (normal 4-bit alpha, not zero).
|
||||||
|
|
||||||
|
### Method note
|
||||||
|
Every hypothesis reasoned forward from the code was wrong again (blit erasing overlays; alpha
|
||||||
|
channel; per-GPU rendering). The `-tmr` ladder plus the draw-call counter settled it in two runs.
|
||||||
|
Consistent with the rest of STEP 10: **instrument, don't infer.**
|
||||||
|
|
||||||
## Next steps (proposed)
|
## Next steps (proposed)
|
||||||
- [ ] (Decision pending) Borderless-windowed migration — see the staged assessment in STEP 10.
|
- [ ] (Decision pending) Borderless-windowed migration — see the staged assessment in STEP 10.
|
||||||
Step 2 (one panel) is the cheap, decisive experiment. Note this is the only route that would
|
Step 2 (one panel) is the cheap, decisive experiment. Note this is the only route that would
|
||||||
|
|||||||
@@ -486,6 +486,7 @@ CHSH_Device::CHSH_Device()
|
|||||||
pDDSTarget=0;
|
pDDSTarget=0;
|
||||||
pDDSTexture=0;
|
pDDSTexture=0;
|
||||||
pD3DDevice=0;
|
pD3DDevice=0;
|
||||||
|
m_nDrawCalls=0; // [mrdiag]
|
||||||
tw=512;
|
tw=512;
|
||||||
th=512;
|
th=512;
|
||||||
}
|
}
|
||||||
@@ -527,6 +528,14 @@ const DWORD dwFlags = DDSCL_SETFOCUSWINDOW | DDSCL_CREATEDEVICEWINDOW |
|
|||||||
// Selected with -tcoop <0-3>. See CHSH_Device::InitFirst for what each one does.
|
// Selected with -tcoop <0-3>. See CHSH_Device::InitFirst for what each one does.
|
||||||
int g_nHshCoopMode = 0;
|
int g_nHshCoopMode = 0;
|
||||||
|
|
||||||
|
// [mrdiag] Cameraship secondary-screen (Map/Armor) diagnostic mode, -tmr <0-3>.
|
||||||
|
// 0 = unchanged
|
||||||
|
// 1 = wait for the background blit to finish before starting the 3D scene
|
||||||
|
// 2 = skip the background blit entirely (Clear instead)
|
||||||
|
// 3 = as 2, plus draw a solid magenta quad to prove whether ANY 3D output lands
|
||||||
|
// See CMR_Device::BeginScene.
|
||||||
|
int g_nMRDiag = 0;
|
||||||
|
|
||||||
extern HRESULT wDirectDrawCreateEx( GUID* lpGUID, void** lplpDD, REFIID iid, IUnknown* pUnkOuter );
|
extern HRESULT wDirectDrawCreateEx( GUID* lpGUID, void** lplpDD, REFIID iid, IUnknown* pUnkOuter );
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -932,6 +941,7 @@ bool CHSH_Device::Release()
|
|||||||
|
|
||||||
void CHSH_Device::DrawQuad(int x1,int y1,int x2,int y2,DWORD dwColor)
|
void CHSH_Device::DrawQuad(int x1,int y1,int x2,int y2,DWORD dwColor)
|
||||||
{
|
{
|
||||||
|
m_nDrawCalls++; // [mrdiag]
|
||||||
D3DTLVERTEX Vertices[4]; // Vertices for the cube
|
D3DTLVERTEX Vertices[4]; // Vertices for the cube
|
||||||
|
|
||||||
Vertices[0] = D3DTLVERTEX(D3DVECTOR( (float)x1-0.5f, (float)y2-0.5f,0.9f),1.0f,dwColor,0, 0.0f, 1.0f );
|
Vertices[0] = D3DTLVERTEX(D3DVECTOR( (float)x1-0.5f, (float)y2-0.5f,0.9f),1.0f,dwColor,0, 0.0f, 1.0f );
|
||||||
@@ -1041,6 +1051,7 @@ void CHSH_Device::DrawFrameList(int framecount,RECT * prc,DWORD dwColor)
|
|||||||
|
|
||||||
void CHSH_Device::DrawThickFrame(int x1,int y1,int x2,int y2,int t,DWORD dwColor)
|
void CHSH_Device::DrawThickFrame(int x1,int y1,int x2,int y2,int t,DWORD dwColor)
|
||||||
{
|
{
|
||||||
|
m_nDrawCalls++; // [mrdiag]
|
||||||
if(t>1){
|
if(t>1){
|
||||||
RECT rc[4]={
|
RECT rc[4]={
|
||||||
{x1 ,y1 ,x2 ,y1+t},
|
{x1 ,y1 ,x2 ,y1+t},
|
||||||
@@ -1149,6 +1160,7 @@ void CHSH_Device::DrawTexture2(float x,float y,float w,float h,DWORD dwColor, fl
|
|||||||
//Not scaled....
|
//Not scaled....
|
||||||
void CHSH_Device::DrawTexture(float x,float y,DWORD dwColor, float u1,float v1,float u2,float v2)
|
void CHSH_Device::DrawTexture(float x,float y,DWORD dwColor, float u1,float v1,float u2,float v2)
|
||||||
{
|
{
|
||||||
|
m_nDrawCalls++; // [mrdiag]
|
||||||
D3DTLVERTEX v[4];
|
D3DTLVERTEX v[4];
|
||||||
float w=u2-u1;
|
float w=u2-u1;
|
||||||
float h=v2-v1;
|
float h=v2-v1;
|
||||||
@@ -1233,6 +1245,26 @@ bool CMR_Device::InitSecond()
|
|||||||
//3. Texture for map..
|
//3. Texture for map..
|
||||||
pDDSMapTexture=CreatePixelFormatTexture(pDD,256,256,&DDPF_R5G6B5);
|
pDDSMapTexture=CreatePixelFormatTexture(pDD,256,256,&DDPF_R5G6B5);
|
||||||
|
|
||||||
|
// [mrdiag] Report what actually got created. A missing surface here produces a
|
||||||
|
// screen that shows some things and not others, which is very hard to interpret
|
||||||
|
// from the outside - the original code only beeped when the background failed.
|
||||||
|
HSH_LogInit( " CMR_Device surfaces:\r\n" );
|
||||||
|
HSH_LogInit( " pDDSBackground = %s\r\n", pDDSBackground ? "ok" : "*** NULL ***" );
|
||||||
|
HSH_LogInit( " pDDSTexture = %s\r\n", pDDSTexture ? "ok" : "*** NULL ***" );
|
||||||
|
HSH_LogInit( " pDDSMapTexture = %s\r\n", pDDSMapTexture ? "ok" : "*** NULL ***" );
|
||||||
|
if( pDDSTexture ) {
|
||||||
|
DDSURFACEDESC2 dsd; ZeroMemory(&dsd,sizeof(dsd)); dsd.dwSize=sizeof(dsd);
|
||||||
|
if( SUCCEEDED(pDDSTexture->GetSurfaceDesc(&dsd)) )
|
||||||
|
HSH_LogInit( " overlay texture : %lux%lu %lubpp a=%08lX r=%08lX g=%08lX b=%08lX\r\n",
|
||||||
|
(unsigned long)dsd.dwWidth, (unsigned long)dsd.dwHeight,
|
||||||
|
(unsigned long)dsd.ddpfPixelFormat.dwRGBBitCount,
|
||||||
|
(unsigned long)dsd.ddpfPixelFormat.dwRGBAlphaBitMask,
|
||||||
|
(unsigned long)dsd.ddpfPixelFormat.dwRBitMask,
|
||||||
|
(unsigned long)dsd.ddpfPixelFormat.dwGBitMask,
|
||||||
|
(unsigned long)dsd.ddpfPixelFormat.dwBBitMask );
|
||||||
|
}
|
||||||
|
HSH_LogInit( " -tmr diagnostic mode = %d\r\n", g_nMRDiag );
|
||||||
|
|
||||||
tw=256;
|
tw=256;
|
||||||
th=256;
|
th=256;
|
||||||
|
|
||||||
@@ -1247,11 +1279,32 @@ bool CMR_Device::BeginScene()
|
|||||||
//SetRenderTargetTexture();
|
//SetRenderTargetTexture();
|
||||||
|
|
||||||
|
|
||||||
//Draw background image to Texture. Used as a substitute for Clear..
|
// [mrdiag] The cameraship secondary screen is the ONLY panel with no offscreen
|
||||||
|
// render target (InitSecond(0,0)), so it blits its background straight onto the
|
||||||
|
// back buffer and then renders 3D into that same surface. The blit below is
|
||||||
|
// issued with flags 0 - no DDBLTFAST_WAIT - and nothing ever checks GetBltStatus,
|
||||||
|
// while every other blit in the engine uses DDBLT_WAIT. If a driver does not
|
||||||
|
// serialise its 2D blit engine against the 3D pipeline, that blit can land after
|
||||||
|
// the frame's 3D draws and erase them, leaving only the background.
|
||||||
|
//
|
||||||
|
// -tmr selects between the possibilities so they can be told apart on real hardware.
|
||||||
if(sh_game_started){
|
if(sh_game_started){
|
||||||
//Draw background only when game has started.
|
//Draw background only when game has started.
|
||||||
RECT rc={0,0,640,480};
|
RECT rc={0,0,640,480};
|
||||||
|
|
||||||
|
switch( g_nMRDiag )
|
||||||
|
{
|
||||||
|
case 1: // wait for the blit to complete before any 3D is issued
|
||||||
|
pDDSBack->BltFast(0,0,pDDSBackground,&rc,DDBLTFAST_WAIT|DDBLTFAST_NOCOLORKEY);
|
||||||
|
break;
|
||||||
|
case 2: // no background at all - if the overlays appear, the blit was erasing them
|
||||||
|
case 3:
|
||||||
|
pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,0,1.0f,0);
|
||||||
|
break;
|
||||||
|
default: // 0 = original behaviour
|
||||||
pDDSBack->BltFast(0,0,pDDSBackground,&rc,0);
|
pDDSBack->BltFast(0,0,pDDSBackground,&rc,0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
//If game has not started.. show blank.
|
//If game has not started.. show blank.
|
||||||
pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET ,0,1.0f,0);
|
pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET ,0,1.0f,0);
|
||||||
@@ -1259,12 +1312,33 @@ bool CMR_Device::BeginScene()
|
|||||||
|
|
||||||
pD3DDevice->BeginScene();
|
pD3DDevice->BeginScene();
|
||||||
|
|
||||||
|
// [mrdiag] mode 3: a solid untextured quad. If even this does not appear, nothing
|
||||||
|
// this device draws in 3D is reaching the screen, and the background blit is
|
||||||
|
// innocent - the fault is in the 3D pass itself.
|
||||||
|
if( g_nMRDiag==3 ) {
|
||||||
|
pD3DDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, FALSE );
|
||||||
|
pD3DDevice->SetTexture(0,0);
|
||||||
|
DrawQuad( 64, 64, 576, 416, 0xFFFF00FF ); // magenta
|
||||||
|
}
|
||||||
|
|
||||||
pD3DDevice->SetTexture(0,pDDSTexture);
|
pD3DDevice->SetTexture(0,pDDSTexture);
|
||||||
|
m_nDrawCalls=0; // [mrdiag] count what the game draws between here and EndScene
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMR_Device::EndScene()
|
bool CMR_Device::EndScene()
|
||||||
{
|
{
|
||||||
|
// [mrdiag] Report how many draws the game actually issued on this device. Zero means
|
||||||
|
// the overlay code never ran (a gating problem, not a rendering one); a non-zero count
|
||||||
|
// with a blank screen means it ran and drew nothing visible.
|
||||||
|
{
|
||||||
|
static int s_nFrames=0;
|
||||||
|
if( g_nMRDiag && s_nFrames<5 ) {
|
||||||
|
s_nFrames++;
|
||||||
|
HSH_LogInit( " [mrdiag] frame %d: game issued %d draw call(s) on the Map/Armor screen\r\n",
|
||||||
|
s_nFrames, m_nDrawCalls );
|
||||||
|
}
|
||||||
|
}
|
||||||
pD3DDevice->EndScene();
|
pD3DDevice->EndScene();
|
||||||
if( gCaptureScreen && (gCaptureDevice == 2))
|
if( gCaptureScreen && (gCaptureDevice == 2))
|
||||||
{
|
{
|
||||||
@@ -2931,6 +3005,19 @@ void HSH_EnterFullScreen2()
|
|||||||
HSH_LogInit( "\r\nHSH_EnterFullScreen2\r\n" );
|
HSH_LogInit( "\r\nHSH_EnterFullScreen2\r\n" );
|
||||||
HSH_LogInit( "--------------------\r\n" );
|
HSH_LogInit( "--------------------\r\n" );
|
||||||
|
|
||||||
|
// [mrdiag] The cameraship Map/Armor overlays are drawn by hudchat.cpp only when
|
||||||
|
// CTCL_GetType() reports _ECTCL_CameraShip (3). If it reports anything else the
|
||||||
|
// screen still opens and still shows its background, but nothing is ever drawn on
|
||||||
|
// it - which looks identical to a rendering fault.
|
||||||
|
if( g_pfnCTCL_GetType ) {
|
||||||
|
int nType=(*g_pfnCTCL_GetType)();
|
||||||
|
HSH_LogInit( " CTCL type = %d%s\r\n", nType,
|
||||||
|
(nType==_ECTCL_CameraShip) ? " (cameraship - overlays WILL be drawn)"
|
||||||
|
: " (NOT cameraship - Map/Armor overlays will NOT be drawn)" );
|
||||||
|
} else {
|
||||||
|
HSH_LogInit( " CTCL type = unavailable (g_pfnCTCL_GetType is NULL)\r\n" );
|
||||||
|
}
|
||||||
|
|
||||||
if(IsMultimonitorAvaliable()){
|
if(IsMultimonitorAvaliable()){
|
||||||
HSH_LogInit( " path: multi-monitor (MFD + radar)\r\n" );
|
HSH_LogInit( " path: multi-monitor (MFD + radar)\r\n" );
|
||||||
|
|
||||||
@@ -2970,9 +3057,19 @@ void HSH_EnterFullScreen2()
|
|||||||
}
|
}
|
||||||
}else if(IsSecondaryMonitorAvaliable()){
|
}else if(IsSecondaryMonitorAvaliable()){
|
||||||
HSH_LogInit( " path: single secondary monitor (mr_device)\r\n" );
|
HSH_LogInit( " path: single secondary monitor (mr_device)\r\n" );
|
||||||
mr_device.InitFirst();
|
bool bMR = mr_device.InitFirst();
|
||||||
mr_device.InitSecond();
|
if( bMR )
|
||||||
|
bMR = mr_device.InitSecond();
|
||||||
|
// [panelcoop] same reasoning as the MFD path above: do not claim the device is
|
||||||
|
// live if it never came up, or the per-frame code runs on null surfaces.
|
||||||
|
if( bMR ) {
|
||||||
hsh_mrdev_initialized=true;
|
hsh_mrdev_initialized=true;
|
||||||
|
HSH_LogInit( " result: cameraship secondary screen initialised OK\r\n" );
|
||||||
|
} else {
|
||||||
|
HSH_LogInit( " result: *** cameraship secondary screen FAILED - continuing without it ***\r\n" );
|
||||||
|
mr_device.Release();
|
||||||
|
hsh_mrdev_initialized=false;
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
HSH_LogInit( " path: none - no secondary displays opened\r\n" );
|
HSH_LogInit( " path: none - no secondary displays opened\r\n" );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ public:
|
|||||||
SIZE size_back;
|
SIZE size_back;
|
||||||
SIZE size_target;
|
SIZE size_target;
|
||||||
float tw,th;//texture width,height
|
float tw,th;//texture width,height
|
||||||
|
int m_nDrawCalls; // [mrdiag] draws issued since the last BeginScene
|
||||||
CHSH_Device();
|
CHSH_Device();
|
||||||
|
|
||||||
bool InitFirst(int devicenum,DWORD resx,DWORD resy, CHSH_Device* pOtherHSHD = NULL);
|
bool InitFirst(int devicenum,DWORD resx,DWORD resy, CHSH_Device* pOtherHSHD = NULL);
|
||||||
|
|||||||
@@ -98,6 +98,9 @@ extern int g_nFpsLog;
|
|||||||
// [panelcoop] SetCooperativeLevel form used by the radar/MFD panels; 0 = legacy.
|
// [panelcoop] SetCooperativeLevel form used by the radar/MFD panels; 0 = legacy.
|
||||||
// Defined in CoreTech GameOS render.cpp.
|
// Defined in CoreTech GameOS render.cpp.
|
||||||
extern int g_nHshCoopMode;
|
extern int g_nHshCoopMode;
|
||||||
|
// [mrdiag] Cameraship secondary-screen (Map/Armor) diagnostic mode; 0 = normal.
|
||||||
|
// Defined in CoreTech GameOS render.cpp.
|
||||||
|
extern int g_nMRDiag;
|
||||||
extern LONG g_ThrottleDir;
|
extern LONG g_ThrottleDir;
|
||||||
extern bool g_bCanSuicideAllways;
|
extern bool g_bCanSuicideAllways;
|
||||||
extern bool g_f3dtarget;
|
extern bool g_f3dtarget;
|
||||||
@@ -881,6 +884,14 @@ static const char* const g_apszCommandLineHelp[] =
|
|||||||
" panels never contend for it.",
|
" panels never contend for it.",
|
||||||
" 5 = as 4, plus ALLOWREBOOT.",
|
" 5 = as 4, plus ALLOWREBOOT.",
|
||||||
" Results are reported in gos-displays.txt.",
|
" Results are reported in gos-displays.txt.",
|
||||||
|
" -tmr <0-3> Cameraship Map/Armor screen diagnostics.",
|
||||||
|
" 0 = normal.",
|
||||||
|
" 1 = wait for the background blit to finish before",
|
||||||
|
" drawing the overlays.",
|
||||||
|
" 2 = skip the background image entirely.",
|
||||||
|
" 3 = as 2, plus a solid magenta test rectangle.",
|
||||||
|
" Use when that screen shows its background but no",
|
||||||
|
" overlay graphics or text.",
|
||||||
" -mechview <1|2> Show the rotating mech view. 1 = on the radar",
|
" -mechview <1|2> Show the rotating mech view. 1 = on the radar",
|
||||||
" -mv <1|2> screen, 2 = on the main screen. Default: off.",
|
" -mv <1|2> screen, 2 = on the main screen. Default: off.",
|
||||||
" -3dt Draw the MFD target as a live 3D model instead of",
|
" -3dt Draw the MFD target as a live 3D model instead of",
|
||||||
@@ -1709,6 +1720,14 @@ int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int n
|
|||||||
if ((0 <= n) && (n <= 5))
|
if ((0 <= n) && (n <= 5))
|
||||||
g_nHshCoopMode = n;
|
g_nHshCoopMode = n;
|
||||||
}
|
}
|
||||||
|
// [mrdiag] Cameraship Map/Armor screen diagnostics. 0 = normal behaviour.
|
||||||
|
token = strstr(all_lower, "-tmr ");
|
||||||
|
if (token && token[5])
|
||||||
|
{
|
||||||
|
int n = atoi(&token[5]);
|
||||||
|
if ((0 <= n) && (n <= 3))
|
||||||
|
g_nMRDiag = n;
|
||||||
|
}
|
||||||
// [fpslog] Enable the per-second frame pacing report written to gos-fps.txt.
|
// [fpslog] Enable the per-second frame pacing report written to gos-fps.txt.
|
||||||
g_nFpsLog = (strstr(all_lower, "-fps") != NULL) ? 1 : 0;
|
g_nFpsLog = (strstr(all_lower, "-fps") != NULL) ? 1 : 0;
|
||||||
g_bCanSuicideAllways = (strstr(all_lower, "-suicide") != NULL);
|
g_bCanSuicideAllways = (strstr(all_lower, "-suicide") != NULL);
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ If you see it, run <code>set-appcompat.bat</code> and restart the game.</p>
|
|||||||
<hr>
|
<hr>
|
||||||
<h2>2. Multiplayer</h2>
|
<h2>2. Multiplayer</h2>
|
||||||
<h3>16 pilots plus a cameraship now launch correctly</h3>
|
<h3>16 pilots plus a cameraship now launch correctly</h3>
|
||||||
<p>Previously, a full 16-pilot game with a cameraship connected would silently fail to launch ?
|
<p>Previously, a full 16-pilot game with a cameraship connected would silently fail to launch --
|
||||||
you pressed launch and nothing happened, with no error. Fixed. A cameraship no longer consumes
|
you pressed launch and nothing happened, with no error. Fixed. A cameraship no longer consumes
|
||||||
one of the 16 pilot slots.</p>
|
one of the 16 pilot slots.</p>
|
||||||
<p><strong>No configuration needed.</strong> This applies automatically.</p>
|
<p><strong>No configuration needed.</strong> This applies automatically.</p>
|
||||||
@@ -117,10 +117,14 @@ the zero point could be skipped.</p>
|
|||||||
speed without changing anything else about how the board talks to the game:</p>
|
speed without changing anything else about how the board talks to the game:</p>
|
||||||
<pre><code>MW4.exe -tbaud 115200
|
<pre><code>MW4.exe -tbaud 115200
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Accepts 9600 to 921600. <strong>Leave it off</strong> and the game uses the original speed, exactly as before ?
|
<p>Accepts 9600 to 921600. <strong>Leave it off</strong> and the game uses the original speed, exactly as before --
|
||||||
existing original RIO boards need no change and should not use this switch.</p>
|
existing original RIO boards need no change and should not use this switch.</p>
|
||||||
<p>This is only the speed. The wire protocol is untouched. (The separate <code>-trio 1</code> switch changes
|
<p><strong>Whether a particular rate actually works is a hardware question, not a software one.</strong> The
|
||||||
the whole protocol and is <em>not</em> what you want for a replica board.)</p>
|
game will happily set any rate in that range, but both ends have to support it: the serial
|
||||||
|
UART in the pod PC, and the RIO or replica RIO board itself. If a rate misbehaves -- garbled
|
||||||
|
input, dropped buttons, no response -- step down to a lower one.</p>
|
||||||
|
<p>This switch only changes the speed. The wire protocol is untouched. (The separate <code>-trio 1</code>
|
||||||
|
switch changes the whole protocol and is <em>not</em> what you want for a replica board.)</p>
|
||||||
<hr>
|
<hr>
|
||||||
<h2>4. Displays and MFDs</h2>
|
<h2>4. Displays and MFDs</h2>
|
||||||
<h3>Split MFD mode -- two separate 640x480 MFD monitors</h3>
|
<h3>Split MFD mode -- two separate 640x480 MFD monitors</h3>
|
||||||
@@ -133,12 +137,15 @@ and <code>3</code>) are unchanged and remain the default for existing pods.</p>
|
|||||||
<h3>Split MFD stutter -- fixed</h3>
|
<h3>Split MFD stutter -- fixed</h3>
|
||||||
<p>Early split-MFD builds had a constant rhythmic stutter across the whole game. Fixed. The two MFD
|
<p>Early split-MFD builds had a constant rhythmic stutter across the whole game. Fixed. The two MFD
|
||||||
panels no longer force the graphics card to stall every frame cycle.</p>
|
panels no longer force the graphics card to stall every frame cycle.</p>
|
||||||
<h3>Required dgVoodoo2 setting for ALL MFD modes on Windows 10/11</h3>
|
<h3>Required dgVoodoo2 setting for any multi-display mode on Windows 10/11</h3>
|
||||||
<p><strong>On Windows 10 and 11, dgVoodoo2 is required for every MFD mode -- including the original
|
<p><strong>On Windows 10 and 11, dgVoodoo2 is required for every mode that uses more than one display.</strong>
|
||||||
spanned display (<code>-tmfds 1</code> and <code>-tmfds 3</code>), not only the new split mode (<code>-tmfds 4</code>).</strong></p>
|
That means all of the MFD modes -- the original spanned display (<code>-tmfds 1</code> and <code>-tmfds 3</code>) as
|
||||||
<p>If your pod drives any MFD or radar panel at all, this applies to you. It is not specific to
|
well as the new split mode (<code>-tmfds 4</code>) -- <strong>and cameraship mode</strong>, which drives two monitors
|
||||||
the new split-MFD feature: the underlying Windows limitation affects every mode that lights up
|
without using MFDs at all.</p>
|
||||||
a second display. On Windows XP none of this was needed.</p>
|
<p><strong>Console mode is the only configuration that does not need it</strong>, because it uses a single display.</p>
|
||||||
|
<p>The deciding factor is the number of displays, not which feature you are using: anything that
|
||||||
|
lights up a second monitor runs into the same Windows limitation. On Windows XP none of this
|
||||||
|
was needed.</p>
|
||||||
<div class="warn"><p><strong>dgVoodoo2 is not part of the build, and must NOT be installed on Windows XP pods.</strong>
|
<div class="warn"><p><strong>dgVoodoo2 is not part of the build, and must NOT be installed on Windows XP pods.</strong>
|
||||||
XP uses the graphics support built into Windows and needs nothing extra -- adding dgVoodoo2
|
XP uses the graphics support built into Windows and needs nothing extra -- adding dgVoodoo2
|
||||||
there will break it. It is a per-machine prerequisite that you install yourself, on
|
there will break it. It is a per-machine prerequisite that you install yourself, on
|
||||||
@@ -169,6 +176,53 @@ order <strong>main, radar, MFD 1, MFD 2</strong>:</p>
|
|||||||
<p>Use <code>0</code> in any position to leave that one on automatic -- <code>-tmon 2,1,0,0</code> swaps only main and radar.
|
<p>Use <code>0</code> in any position to leave that one on automatic -- <code>-tmon 2,1,0,0</code> swaps only main and radar.
|
||||||
<strong>Leave the switch off entirely and everything is detected automatically</strong>, which is correct on
|
<strong>Leave the switch off entirely and everything is detected automatically</strong>, which is correct on
|
||||||
most pods.</p>
|
most pods.</p>
|
||||||
|
<p><strong>Which positions apply depends on the MFD mode:</strong></p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Position</th>
|
||||||
|
<th>Display</th>
|
||||||
|
<th><code>-tmfds 4</code> (split)</th>
|
||||||
|
<th><code>-tmfds 1</code> / <code>-tmfds 3</code> (spanned)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>1st</td>
|
||||||
|
<td>Main</td>
|
||||||
|
<td>applies</td>
|
||||||
|
<td>applies</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>2nd</td>
|
||||||
|
<td>Radar</td>
|
||||||
|
<td>applies</td>
|
||||||
|
<td>applies</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>3rd</td>
|
||||||
|
<td>MFD 1</td>
|
||||||
|
<td>applies</td>
|
||||||
|
<td>ignored</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>4th</td>
|
||||||
|
<td>MFD 2</td>
|
||||||
|
<td>applies</td>
|
||||||
|
<td>ignored</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>In the spanned modes the first two positions work normally, so you can still correct main and
|
||||||
|
radar. The 3rd and 4th positions are accepted but have no effect, because the spanned modes
|
||||||
|
drive both MFDs from a single wide display rather than two separate ones.</p>
|
||||||
|
<p><strong>The spanned MFD display itself cannot be assigned with <code>-tmon</code>.</strong> It is picked automatically
|
||||||
|
as the first display that reports a 1280x480 mode -- a distinctive signature that a spanned
|
||||||
|
MFD pair produces and ordinary monitors do not, so it normally lands on the right one. If you
|
||||||
|
ever need to force it, ask and it can be added.</p>
|
||||||
|
<p>If a display comes up in the wrong place, check <code>gos-displays.txt</code> next to the game (see
|
||||||
|
section 8). It lists every display found, which role each was given, and whether each <code>-tmon</code>
|
||||||
|
position was accepted or ignored.</p>
|
||||||
<hr>
|
<hr>
|
||||||
<h2>5. 'Mechs and content</h2>
|
<h2>5. 'Mechs and content</h2>
|
||||||
<h3>Six rookie 'Mechs instead of four</h3>
|
<h3>Six rookie 'Mechs instead of four</h3>
|
||||||
@@ -255,7 +309,7 @@ so you can also edit it directly.</p>
|
|||||||
external <strong>MySQL</strong> database after each print job, for league tables or long-term stats.</p>
|
external <strong>MySQL</strong> database after each print job, for league tables or long-term stats.</p>
|
||||||
<p>Configure via <strong>File -> Database Settings (Ctrl+D)</strong>, or the <code>[MySQLExport]</code> section of
|
<p>Configure via <strong>File -> Database Settings (Ctrl+D)</strong>, or the <code>[MySQLExport]</code> section of
|
||||||
<code>mw4print.ini</code>. The table layout is documented in <code>db_schema.sql</code>.</p>
|
<code>mw4print.ini</code>. The table layout is documented in <code>db_schema.sql</code>.</p>
|
||||||
<div class="note"><p>?? <strong>This feature has not yet been tested against a live database server.</strong> It is off unless you
|
<div class="warn"><p><strong>WARNING: this feature has not yet been tested against a live database server.</strong> It is off unless you
|
||||||
configure it, and printing works normally without it. If you try it, please report back.</p></div>
|
configure it, and printing works normally without it. If you try it, please report back.</p></div>
|
||||||
<hr>
|
<hr>
|
||||||
<h2>8. Quality of life</h2>
|
<h2>8. Quality of life</h2>
|
||||||
@@ -294,7 +348,7 @@ start. Previously such failures were completely silent. Include this file with a
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>-tmon a,b,c,d</code></td>
|
<td><code>-tmon a,b,c,d</code></td>
|
||||||
<td>Force monitor order: main, radar, MFD1, MFD2</td>
|
<td>Force monitor order: main, radar, MFD1, MFD2. Positions 3 and 4 apply only to <code>-tmfds 4</code></td>
|
||||||
<td>Automatic detection</td>
|
<td>Automatic detection</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -322,9 +376,11 @@ start. Previously such failures were completely silent. Include this file with a
|
|||||||
<hr>
|
<hr>
|
||||||
<h2>10. Known issues and limitations</h2>
|
<h2>10. Known issues and limitations</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Every MFD mode requires dgVoodoo2 on Windows 10/11</strong> -- the spanned modes (<code>-tmfds 1</code>
|
<li><strong>Any multi-display mode requires dgVoodoo2 on Windows 10/11</strong> -- every MFD mode (spanned
|
||||||
and <code>-tmfds 3</code>) just as much as the split mode (<code>-tmfds 4</code>) -- with scaling set to
|
<code>-tmfds 1</code> / <code>-tmfds 3</code> and split <code>-tmfds 4</code>) and cameraship mode. Console mode, using a
|
||||||
<code>Stretched, Keep Aspect Ratio</code>. This is a Windows limitation, not a bug we can fix.</li>
|
single display, is the only exception. Scaling must be set to <code>Stretched, Keep Aspect Ratio</code>.
|
||||||
|
dgVoodoo2 works around a limitation on exclusive full-screen use of multiple displays on
|
||||||
|
platforms after Windows XP. It may be possible to fix this in a future release.</li>
|
||||||
<li><strong>The MySQL export in mw4print has not been tested against a live server.</strong></li>
|
<li><strong>The MySQL export in mw4print has not been tested against a live server.</strong></li>
|
||||||
<li><strong>The game renders in 4:3 only.</strong> There is no widescreen mode. On 16:9 monitors, use
|
<li><strong>The game renders in 4:3 only.</strong> There is no widescreen mode. On 16:9 monitors, use
|
||||||
keep-aspect scaling for correct geometry with black bars at the sides.</li>
|
keep-aspect scaling for correct geometry with black bars at the sides.</li>
|
||||||
@@ -338,8 +394,10 @@ start. Previously such failures were completely silent. Include this file with a
|
|||||||
<li>Copy in the new build.</li>
|
<li>Copy in the new build.</li>
|
||||||
<li><strong>Double-click <code>set-appcompat.bat</code></strong> (as administrator if the pod has multiple accounts).</li>
|
<li><strong>Double-click <code>set-appcompat.bat</code></strong> (as administrator if the pod has multiple accounts).</li>
|
||||||
<li><strong>On Windows 10/11, confirm dgVoodoo2 is installed and its scaling mode is
|
<li><strong>On Windows 10/11, confirm dgVoodoo2 is installed and its scaling mode is
|
||||||
<code>Stretched, Keep Aspect Ratio</code>.</strong> This is required for <strong>every</strong> MFD mode -- spanned
|
<code>Stretched, Keep Aspect Ratio</code>.</strong> Required for <strong>any</strong> mode that uses more than one
|
||||||
(<code>-tmfds 1</code> / <code>-tmfds 3</code>) as well as split (<code>-tmfds 4</code>). Windows XP pods do not need it.</li>
|
display: all MFD modes (spanned <code>-tmfds 1</code> / <code>-tmfds 3</code>, split <code>-tmfds 4</code>) and cameraship
|
||||||
|
mode. Only console mode, on a single display, does without it. Windows XP pods never
|
||||||
|
need it.</li>
|
||||||
<li>Launch and confirm the console lobby reads the new version.</li>
|
<li>Launch and confirm the console lobby reads the new version.</li>
|
||||||
<li>Play one mission end to end before putting the pod back into service.</li>
|
<li>Play one mission end to end before putting the pod back into service.</li>
|
||||||
<li>Optional: add <code>[automaticmode]</code> and <code>[RookieMission]</code> to <code>options.ini</code> if you want the new
|
<li>Optional: add <code>[automaticmode]</code> and <code>[RookieMission]</code> to <code>options.ini</code> if you want the new
|
||||||
|
|||||||
+52
-17
@@ -41,7 +41,7 @@ If you see it, run `set-appcompat.bat` and restart the game.
|
|||||||
|
|
||||||
### 16 pilots plus a cameraship now launch correctly
|
### 16 pilots plus a cameraship now launch correctly
|
||||||
|
|
||||||
Previously, a full 16-pilot game with a cameraship connected would silently fail to launch ?
|
Previously, a full 16-pilot game with a cameraship connected would silently fail to launch --
|
||||||
you pressed launch and nothing happened, with no error. Fixed. A cameraship no longer consumes
|
you pressed launch and nothing happened, with no error. Fixed. A cameraship no longer consumes
|
||||||
one of the 16 pilot slots.
|
one of the 16 pilot slots.
|
||||||
|
|
||||||
@@ -110,11 +110,16 @@ speed without changing anything else about how the board talks to the game:
|
|||||||
MW4.exe -tbaud 115200
|
MW4.exe -tbaud 115200
|
||||||
```
|
```
|
||||||
|
|
||||||
Accepts 9600 to 921600. **Leave it off** and the game uses the original speed, exactly as before ?
|
Accepts 9600 to 921600. **Leave it off** and the game uses the original speed, exactly as before --
|
||||||
existing original RIO boards need no change and should not use this switch.
|
existing original RIO boards need no change and should not use this switch.
|
||||||
|
|
||||||
This is only the speed. The wire protocol is untouched. (The separate `-trio 1` switch changes
|
**Whether a particular rate actually works is a hardware question, not a software one.** The
|
||||||
the whole protocol and is *not* what you want for a replica board.)
|
game will happily set any rate in that range, but both ends have to support it: the serial
|
||||||
|
UART in the pod PC, and the RIO or replica RIO board itself. If a rate misbehaves -- garbled
|
||||||
|
input, dropped buttons, no response -- step down to a lower one.
|
||||||
|
|
||||||
|
This switch only changes the speed. The wire protocol is untouched. (The separate `-trio 1`
|
||||||
|
switch changes the whole protocol and is *not* what you want for a replica board.)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -137,14 +142,18 @@ and `3`) are unchanged and remain the default for existing pods.
|
|||||||
Early split-MFD builds had a constant rhythmic stutter across the whole game. Fixed. The two MFD
|
Early split-MFD builds had a constant rhythmic stutter across the whole game. Fixed. The two MFD
|
||||||
panels no longer force the graphics card to stall every frame cycle.
|
panels no longer force the graphics card to stall every frame cycle.
|
||||||
|
|
||||||
### Required dgVoodoo2 setting for ALL MFD modes on Windows 10/11
|
### Required dgVoodoo2 setting for any multi-display mode on Windows 10/11
|
||||||
|
|
||||||
**On Windows 10 and 11, dgVoodoo2 is required for every MFD mode -- including the original
|
**On Windows 10 and 11, dgVoodoo2 is required for every mode that uses more than one display.**
|
||||||
spanned display (`-tmfds 1` and `-tmfds 3`), not only the new split mode (`-tmfds 4`).**
|
That means all of the MFD modes -- the original spanned display (`-tmfds 1` and `-tmfds 3`) as
|
||||||
|
well as the new split mode (`-tmfds 4`) -- **and cameraship mode**, which drives two monitors
|
||||||
|
without using MFDs at all.
|
||||||
|
|
||||||
If your pod drives any MFD or radar panel at all, this applies to you. It is not specific to
|
**Console mode is the only configuration that does not need it**, because it uses a single display.
|
||||||
the new split-MFD feature: the underlying Windows limitation affects every mode that lights up
|
|
||||||
a second display. On Windows XP none of this was needed.
|
The deciding factor is the number of displays, not which feature you are using: anything that
|
||||||
|
lights up a second monitor runs into the same Windows limitation. On Windows XP none of this
|
||||||
|
was needed.
|
||||||
|
|
||||||
> **dgVoodoo2 is not part of the build, and must NOT be installed on Windows XP pods.**
|
> **dgVoodoo2 is not part of the build, and must NOT be installed on Windows XP pods.**
|
||||||
> XP uses the graphics support built into Windows and needs nothing extra -- adding dgVoodoo2
|
> XP uses the graphics support built into Windows and needs nothing extra -- adding dgVoodoo2
|
||||||
@@ -186,6 +195,28 @@ Use `0` in any position to leave that one on automatic -- `-tmon 2,1,0,0` swaps
|
|||||||
**Leave the switch off entirely and everything is detected automatically**, which is correct on
|
**Leave the switch off entirely and everything is detected automatically**, which is correct on
|
||||||
most pods.
|
most pods.
|
||||||
|
|
||||||
|
**Which positions apply depends on the MFD mode:**
|
||||||
|
|
||||||
|
| Position | Display | `-tmfds 4` (split) | `-tmfds 1` / `-tmfds 3` (spanned) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1st | Main | applies | applies |
|
||||||
|
| 2nd | Radar | applies | applies |
|
||||||
|
| 3rd | MFD 1 | applies | ignored |
|
||||||
|
| 4th | MFD 2 | applies | ignored |
|
||||||
|
|
||||||
|
In the spanned modes the first two positions work normally, so you can still correct main and
|
||||||
|
radar. The 3rd and 4th positions are accepted but have no effect, because the spanned modes
|
||||||
|
drive both MFDs from a single wide display rather than two separate ones.
|
||||||
|
|
||||||
|
**The spanned MFD display itself cannot be assigned with `-tmon`.** It is picked automatically
|
||||||
|
as the first display that reports a 1280x480 mode -- a distinctive signature that a spanned
|
||||||
|
MFD pair produces and ordinary monitors do not, so it normally lands on the right one. If you
|
||||||
|
ever need to force it, ask and it can be added.
|
||||||
|
|
||||||
|
If a display comes up in the wrong place, check `gos-displays.txt` next to the game (see
|
||||||
|
section 8). It lists every display found, which role each was given, and whether each `-tmon`
|
||||||
|
position was accepted or ignored.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. 'Mechs and content
|
## 5. 'Mechs and content
|
||||||
@@ -295,7 +326,7 @@ external **MySQL** database after each print job, for league tables or long-term
|
|||||||
Configure via **File -> Database Settings (Ctrl+D)**, or the `[MySQLExport]` section of
|
Configure via **File -> Database Settings (Ctrl+D)**, or the `[MySQLExport]` section of
|
||||||
`mw4print.ini`. The table layout is documented in `db_schema.sql`.
|
`mw4print.ini`. The table layout is documented in `db_schema.sql`.
|
||||||
|
|
||||||
> ?? **This feature has not yet been tested against a live database server.** It is off unless you
|
> **WARNING: this feature has not yet been tested against a live database server.** It is off unless you
|
||||||
> configure it, and printing works normally without it. If you try it, please report back.
|
> configure it, and printing works normally without it. If you try it, please report back.
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -337,7 +368,7 @@ start. Previously such failures were completely silent. Include this file with a
|
|||||||
| Switch | Purpose | If you leave it off |
|
| Switch | Purpose | If you leave it off |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `-tmfds 4` | Two separate 640x480 MFD monitors | Existing MFD mode unchanged |
|
| `-tmfds 4` | Two separate 640x480 MFD monitors | Existing MFD mode unchanged |
|
||||||
| `-tmon a,b,c,d` | Force monitor order: main, radar, MFD1, MFD2 | Automatic detection |
|
| `-tmon a,b,c,d` | Force monitor order: main, radar, MFD1, MFD2. Positions 3 and 4 apply only to `-tmfds 4` | Automatic detection |
|
||||||
| `-tbaud <rate>` | COM1 speed for replica RIO boards | Original board speed |
|
| `-tbaud <rate>` | COM1 speed for replica RIO boards | Original board speed |
|
||||||
| `-fps` | Write a performance log | No log, no overhead |
|
| `-fps` | Write a performance log | No log, no overhead |
|
||||||
| `-help` | Show the full switch reference and exit | Game starts normally |
|
| `-help` | Show the full switch reference and exit | Game starts normally |
|
||||||
@@ -347,9 +378,11 @@ start. Previously such failures were completely silent. Include this file with a
|
|||||||
|
|
||||||
## 10. Known issues and limitations
|
## 10. Known issues and limitations
|
||||||
|
|
||||||
- **Every MFD mode requires dgVoodoo2 on Windows 10/11** -- the spanned modes (`-tmfds 1`
|
- **Any multi-display mode requires dgVoodoo2 on Windows 10/11** -- every MFD mode (spanned
|
||||||
and `-tmfds 3`) just as much as the split mode (`-tmfds 4`) -- with scaling set to
|
`-tmfds 1` / `-tmfds 3` and split `-tmfds 4`) and cameraship mode. Console mode, using a
|
||||||
`Stretched, Keep Aspect Ratio`. This is a Windows limitation, not a bug we can fix.
|
single display, is the only exception. Scaling must be set to `Stretched, Keep Aspect Ratio`.
|
||||||
|
dgVoodoo2 works around a limitation on exclusive full-screen use of multiple displays on
|
||||||
|
platforms after Windows XP. It may be possible to fix this in a future release.
|
||||||
- **The MySQL export in mw4print has not been tested against a live server.**
|
- **The MySQL export in mw4print has not been tested against a live server.**
|
||||||
- **The game renders in 4:3 only.** There is no widescreen mode. On 16:9 monitors, use
|
- **The game renders in 4:3 only.** There is no widescreen mode. On 16:9 monitors, use
|
||||||
keep-aspect scaling for correct geometry with black bars at the sides.
|
keep-aspect scaling for correct geometry with black bars at the sides.
|
||||||
@@ -364,8 +397,10 @@ start. Previously such failures were completely silent. Include this file with a
|
|||||||
2. Copy in the new build.
|
2. Copy in the new build.
|
||||||
3. **Double-click `set-appcompat.bat`** (as administrator if the pod has multiple accounts).
|
3. **Double-click `set-appcompat.bat`** (as administrator if the pod has multiple accounts).
|
||||||
4. **On Windows 10/11, confirm dgVoodoo2 is installed and its scaling mode is
|
4. **On Windows 10/11, confirm dgVoodoo2 is installed and its scaling mode is
|
||||||
`Stretched, Keep Aspect Ratio`.** This is required for **every** MFD mode -- spanned
|
`Stretched, Keep Aspect Ratio`.** Required for **any** mode that uses more than one
|
||||||
(`-tmfds 1` / `-tmfds 3`) as well as split (`-tmfds 4`). Windows XP pods do not need it.
|
display: all MFD modes (spanned `-tmfds 1` / `-tmfds 3`, split `-tmfds 4`) and cameraship
|
||||||
|
mode. Only console mode, on a single display, does without it. Windows XP pods never
|
||||||
|
need it.
|
||||||
5. Launch and confirm the console lobby reads the new version.
|
5. Launch and confirm the console lobby reads the new version.
|
||||||
6. Play one mission end to end before putting the pod back into service.
|
6. Play one mission end to end before putting the pod back into service.
|
||||||
7. Optional: add `[automaticmode]` and `[RookieMission]` to `options.ini` if you want the new
|
7. Optional: add `[automaticmode]` and `[RookieMission]` to `options.ini` if you want the new
|
||||||
|
|||||||
Reference in New Issue
Block a user