Skip to content
This repository was archived by the owner on Jan 5, 2024. It is now read-only.

Commit 255b847

Browse files
committed
Break down and refactor FrameMan::Create
Move graphics driver messages from Main to FrameMan::SetGraphicsDriver
1 parent 4f4baca commit 255b847

File tree

3 files changed

+72
-59
lines changed

3 files changed

+72
-59
lines changed

Main.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,18 +1922,6 @@ int main(int argc, char *argv[]) {
19221922
///////////////////////////////////////////////////////////////////
19231923
// Main game driver
19241924

1925-
string fullscreenDriver = "";
1926-
string windowedDriver = "";
1927-
1928-
if (g_SettingsMan.ForceSoftwareGfxDriver()) { fullscreenDriver = "MSG: Using software DirectX fullscreen driver!"; }
1929-
if (g_SettingsMan.ForceSafeGfxDriver()) { fullscreenDriver = "MSG: Using safe DirectX fullscreen driver!"; }
1930-
if (g_SettingsMan.ForceOverlayedWindowGfxDriver()) { windowedDriver = "MSG: Using overlay DirectX windowed driver!"; }
1931-
if (g_SettingsMan.ForceNonOverlayedWindowGfxDriver()) { windowedDriver = "MSG: Using non-overlay DirectX windowed driver!"; }
1932-
if (g_SettingsMan.ForceVirtualFullScreenGfxDriver()) { windowedDriver = "MSG: Using DirectX fullscreen-windowed driver!"; }
1933-
1934-
if (fullscreenDriver != "") { g_ConsoleMan.PrintString(fullscreenDriver); }
1935-
if (windowedDriver != "") { g_ConsoleMan.PrintString(windowedDriver); }
1936-
19371925
if (g_NetworkServer.IsServerModeEnabled()) {
19381926
g_NetworkServer.Start();
19391927
g_FrameMan.SetMultiplayerMode(true);

Managers/FrameMan.cpp

Lines changed: 60 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -93,67 +93,80 @@ namespace RTE {
9393

9494
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9595

96-
int FrameMan::Create() {
97-
// Init allegro's graphics
98-
set_color_depth(m_BPP);
99-
100-
// Refuse windowed multiplier if the resolution is too high
101-
if (m_ResX > 1024) { m_NxWindowed = 1; }
102-
103-
int fullscreenGfxDriver = GFX_AUTODETECT_FULLSCREEN;
104-
int windowedGfxDriver = GFX_AUTODETECT_WINDOWED;
96+
void FrameMan::SetGraphicsDriver() {
97+
if (g_SettingsMan.ForceOverlayedWindowGfxDriver()) {
98+
m_GfxDriver = GFX_DIRECTX_OVL;
99+
g_ConsoleMan.PrintString("SYSTEM: Using overlay DirectX windowed driver!");
100+
} else if (g_SettingsMan.ForceNonOverlayedWindowGfxDriver()) {
101+
m_GfxDriver = GFX_DIRECTX_WIN;
102+
g_ConsoleMan.PrintString("SYSTEM: Using non-overlay DirectX windowed driver!");
103+
} else if (g_SettingsMan.ForceVirtualFullScreenGfxDriver()) {
104+
m_GfxDriver = GFX_DIRECTX_WIN_BORDERLESS;
105+
g_ConsoleMan.PrintString("SYSTEM: Using DirectX fullscreen-windowed driver!");
106+
} else {
107+
m_GfxDriver = GFX_AUTODETECT_WINDOWED;
108+
}
109+
}
105110

106-
fullscreenGfxDriver = GFX_DIRECTX_ACCEL;
111+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
107112

108-
if (g_SettingsMan.ForceSoftwareGfxDriver()) { fullscreenGfxDriver = GFX_DIRECTX_SOFT; }
109-
if (g_SettingsMan.ForceSafeGfxDriver()) { fullscreenGfxDriver = GFX_DIRECTX_SAFE; }
110-
if (g_SettingsMan.ForceOverlayedWindowGfxDriver()) { windowedGfxDriver = GFX_DIRECTX_OVL; }
111-
if (g_SettingsMan.ForceNonOverlayedWindowGfxDriver()) { windowedGfxDriver = GFX_DIRECTX_WIN; }
112-
if (g_SettingsMan.ForceVirtualFullScreenGfxDriver()) { windowedGfxDriver = GFX_DIRECTX_WIN_BORDERLESS; }
113-
114-
if (set_gfx_mode(m_Fullscreen ? fullscreenGfxDriver : windowedGfxDriver, m_Fullscreen ? m_ResX * m_NxFullscreen : m_ResX * m_NxWindowed, m_Fullscreen ? m_ResY * m_NxFullscreen : m_ResY * m_NxWindowed, 0, 0) != 0) {
115-
g_ConsoleMan.PrintString("Failed to set gfx mode, trying different windowed scaling.");
116-
// If player somehow managed to set up a windowed 2X mode and then set a resolution higher than physical, then disable 2X resolution
117-
m_NxWindowed = (m_NxWindowed == 2) ? 1 : m_NxWindowed;
118-
if (set_gfx_mode(m_Fullscreen ? fullscreenGfxDriver : windowedGfxDriver, m_Fullscreen ? m_ResX * m_NxFullscreen : m_ResX * m_NxWindowed, m_Fullscreen ? m_ResY * m_NxFullscreen : m_ResY * m_NxWindowed, 0, 0) != 0) {
119-
g_ConsoleMan.PrintString("Failed to set gfx mode, trying different fullscreen scaling.");
120-
121-
// TODO: this is whack if we're attempting windowed
122-
// Oops, failed to set fullscreen mode, try a different fullscreen scaling
123-
m_NewNxFullscreen = m_NxFullscreen = (m_NxFullscreen == 1) ? 2 : 1;
124-
if (set_gfx_mode(m_Fullscreen ? fullscreenGfxDriver : windowedGfxDriver, m_Fullscreen ? m_ResX * m_NxFullscreen : m_ResX * m_NxWindowed, m_Fullscreen ? m_ResY * m_NxFullscreen : m_ResY * m_NxWindowed, 0, 0) != 0) {
125-
// Oops, failed to set the resolution specified in the setting file, so default to a safe one instead
126-
allegro_message("Unable to set specified graphics mode because: %s!\n\nNow trying to default back to VGA...", allegro_error);
127-
if (set_gfx_mode(m_Fullscreen ? GFX_AUTODETECT_FULLSCREEN : GFX_AUTODETECT_WINDOWED, 960, 540, 0, 0) != 0) {
128-
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
129-
allegro_message("Unable to set any graphics mode because %s!", allegro_error);
130-
return 1;
131-
}
132-
// Successfully reverted to VGA, so set that as the current resolution
133-
m_ResX = m_NewResX = 960;
134-
m_ResY = m_NewResY = 540;
135-
m_NxWindowed = 1;
136-
m_NewNxFullscreen = m_NxFullscreen = 1;
137-
}
113+
void FrameMan::ValidateResolution(unsigned short &resX, unsigned short &resY) {
114+
if (resX * m_ResMultiplier > m_ScreenResX || resY * m_ResMultiplier > m_ScreenResY) {
115+
allegro_message("Resolution too high to fit display, overriding to fit!\nResolution multiplier will be disabled!");
116+
resX = m_NewResX = m_ScreenResX;
117+
resY = m_NewResY = m_ScreenResY;
118+
m_ResMultiplier = m_NewResMultiplier = 1;
119+
} else if (resX * m_ResMultiplier == 1366 && resY * m_ResMultiplier == 768) {
120+
allegro_message("Unfortunately, 1366x768 resolution is not supported by Cortex Command's graphics API. 1360x768 will be used instead!");
121+
resX = m_NewResX = 1360;
122+
resY = m_NewResX = 768;
123+
m_ResMultiplier = m_NewResMultiplier = 1;
124+
} else {
125+
float currentAspectRatio = static_cast<float>(resX) / static_cast<float>(resY);
126+
if (currentAspectRatio < 1 || currentAspectRatio > 4) {
127+
allegro_message("Abnormal aspect ratio detected! Reverting to defaults!");
128+
resX = m_NewResX = 960;
129+
resY = m_NewResY = 540;
130+
m_ResMultiplier = m_NewResMultiplier = 1;
138131
}
139132
}
133+
if (resX * m_ResMultiplier == m_ScreenResX && resY * m_ResMultiplier == m_ScreenResY) { m_Fullscreen = true; }
134+
}
140135

141-
// Clear the screen buffer so it doesn't flash pink
142-
clear_to_color(screen, 0);
136+
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
143137

144-
// Sets the allowed color conversions when loading bitmaps from files
145-
set_color_conversion(COLORCONV_MOST);
138+
int FrameMan::Create() {
139+
SetGraphicsDriver();
140+
ValidateResolution(m_ResX, m_ResY);
141+
set_color_depth(m_BPP);
146142

147-
// Load and set the palette
148-
if (!LoadPalette(m_PaletteFile.GetDataPath())) {
149-
return -1;
143+
if (set_gfx_mode(m_GfxDriver, m_ResX * m_ResMultiplier, m_ResY * m_ResMultiplier, 0, 0) != 0) {
144+
// If a bad resolution somehow slipped past the validation, revert to defaults.
145+
allegro_message("Unable to set specified graphics mode because: %s!\n\nNow trying to default back to VGA...", allegro_error);
146+
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 960, 540, 0, 0) != 0) {
147+
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
148+
allegro_message("Unable to set any graphics mode because %s!", allegro_error);
149+
return 1;
150+
}
151+
// Successfully reverted to defaults. so set that as the current resolution
152+
m_ResX = m_NewResX = 960;
153+
m_ResY = m_NewResY = 540;
154+
m_ResMultiplier = m_NewResMultiplier = 1;
150155
}
156+
157+
// Clear the screen buffer so it doesn't flash pink
158+
clear_to_color(screen, 0);
151159

152160
// Set the switching mode; what happens when the app window is switched to and from
153161
set_display_switch_mode(SWITCH_BACKGROUND);
154162
set_display_switch_callback(SWITCH_OUT, DisplaySwitchOut);
155163
set_display_switch_callback(SWITCH_IN, DisplaySwitchIn);
156164

165+
// Sets the allowed color conversions when loading bitmaps from files
166+
set_color_conversion(COLORCONV_MOST);
167+
168+
LoadPalette(m_PaletteFile.GetDataPath());
169+
157170
// Create transparency color table
158171
PALETTE ccPalette;
159172
get_palette(ccPalette);

Managers/FrameMan.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,18 @@ namespace RTE {
644644
private:
645645

646646
#pragma region Create Breakdown
647+
/// <summary>
648+
/// Checks whether a specific driver has been requested and if not uses the default Allegro windowed magic driver. This is called during Create().
649+
/// </summary>
650+
void SetGraphicsDriver();
651+
652+
/// <summary>
653+
/// Checks whether the passed in resolution settings make sense. If not, overrides them to prevent crashes or unexpected behavior. This is called during Create().
654+
/// </summary>
655+
/// <param name="resX">Game window width (m_ResX or m_NewResX).</param>
656+
/// <param name="resY">Game window height (m_ResY or m_NewResY).</param>
657+
void ValidateResolution(unsigned short &resX, unsigned short &resY);
658+
647659
/// <summary>
648660
/// Creates all the frame buffer bitmaps to be used by FrameMan. This is called during Create().
649661
/// </summary>

0 commit comments

Comments
 (0)